·背景
·抓包ajax非同步載入的網頁,載入資料的url需要通過抓包獲取。一般確認是否非同步載入,只需要右鍵開啟網頁源**,如果原始碼文字內容與前端展示的結果不一致,則屬於非同步載入。這時需要按f12開啟開發者工具的network,重新重新整理網頁,就能看到真正的url。如下圖所示,開發者工具中紅色框的url才是真正載入資料的url。
·concurrent.futures庫
利用多核cpu提公升執行速度。主要包含兩個類:threadpoolexecutor和processpoolexecutor,當執行屬於io密集型時,使用threadpoolexecutor開啟多執行緒。當執行屬於cpu密集型時,使用processpoolexecutor開啟多執行緒。
·requests庫
用於傳送網路請求。網路請求有get和post兩種方式,get()可以直接獲取資料,post()需要傳遞引數後才能獲取資料。一般**都是get方式,若需要登入後才能看到資料的網頁則屬於post方式。而爬蟲中post()通常和session()搭配使用,session()用於儲存登入後的cookie。
·beautifulsoup庫
用於解析html。爬蟲需要懂得基本的html語言,通過定位不同的標籤來提取資料。
·re庫
正規表示式,用來檢索或替換符合某個模式(規則)的文字。爬蟲過程中如果遇到不能直接提取的髒資料時,一般採用re解決。re功能非常強大,而且上手不難,很多方面都可以運用它,所以掌握re也是乙個必備技能。
·redis資料庫
非關係型資料庫,可以儲存多種抽象資料型別。由於讀寫簡單快捷,所以筆者將其當做快取資料庫,用於儲存待爬取url,再配合threadpoolexecutor多執行緒進行爬取,滿足高併發需求。
·mysql資料庫
關係型資料庫,用於儲存最終結果。
·例項首先,確認url是否需要抓包獲取,還是可以直接手工構建。如下圖所示,原始碼內容與前端展示是一致的,所以可以根據傳遞的引數內容,直接構建url。
然後,再根據型別、區域、年代這三個引數,構建首頁url,一般地,遇到像貓眼電影這種有多個分類下有多個類別的**時,我都會先抓取這些標籤編碼,根據自己感興趣的內容再去構建多個首頁url。
接著,獲取每種分類的頁面數量,再構建頁面url,再存到redis中。這麼做的原因是貓眼頁面檢視數量是有限制的,通過遍歷所有分類構建url可以繞過這個限制。
然後,爬取每個頁面中影片的id,再構建詳情頁url。由於多執行緒爬取速度很快,會導致ip暫時被限制登入,所以需要多乙個步驟,來判斷ip是否已經被封。利用while語句識別存放在redis中的url列表是否為空,如果為空則停止或進入下一步,否則繼續執行。此外,暫無評分的影片不屬於考慮範圍,所以剔除。
最後,爬取每條詳情頁url的資訊,同時也需要判斷ip是否被限制。由於無票房的影片不屬於考慮範圍,所以剔除。將結果直接儲存到mysql中。
如下圖所示,20110101-20191005期間,有評分有票房的影片總共有10746條,movie_all這個字段包含了導演/演員/編劇,後期還需要做進一步的資料清洗,這裡暫時不涉及資料清洗的內容。
·結語爬蟲入門並不是很難,一般按照流程圖的步驟就可以完成一次爬蟲。不過,大部分**都是有限制爬蟲的,也就是反爬蟲。最常遇到的反爬蟲就是封ip,這次爬蟲也遇到這個問題。此外,驗證碼也是常見的反爬蟲之一。如果能解決這兩點,幾乎各型別**都能爬。
Python之爬蟲 貓眼電影
usr bin env python coding utf 8 import json import requests import re import time 貓眼多了反爬蟲,速度過快,則會無響應,所以這裡多了乙個延時等待 from requests.exceptions import requ...
python爬蟲 爬取貓眼電影資料
定義乙個函式獲取貓眼電影的資料 import requests def main url url html requests.get url text print html if name main main 利用正則匹配,獲得我們想要的資訊 dd i class board index board...
python爬蟲基礎爬取貓眼電影
import requests from requests.exceptions import requestexception from sqlalchemy import create engine from lxml import etree import pandas as pd impor...