爬蟲初識
【一】爬蟲介紹
【1】定義
- 爬蟲是一種自動化獲取網際網路資料的技術,透過模擬瀏覽器行為,向目標網站傳送請求並獲取響應,然後解析響應中的資料。
- 應用領域:爬蟲可以應用於各種網站資料的獲取
【2】工作原理
- 爬蟲透過傳送HTTP請求,模擬瀏覽器行為,獲取網站的響應,並解析響應中的資料。
【3】分類
- 通用爬蟲 vs. 專用爬蟲:
- 通用爬蟲:用於抓取網際網路上的大量網頁,如搜尋引擎爬蟲(例如Googlebot、Bingbot等)。
- 專用爬蟲:針對特定的網站、領域或任務設計,如價格比較爬蟲、新聞聚合爬蟲等。
- 按照工作方式分類:
- 單執行緒爬蟲:一次只能處理一個請求的爬蟲。
- 多執行緒/併發爬蟲:可以同時處理多個請求,提高爬取效率。
- 非同步爬蟲:利用非同步程式設計技術,在傳送請求時不會阻塞程式的執行,可以更高效地處理大量的請求。
- 按照爬取深度分類:
- 表面爬蟲:只爬取網頁上的靜態內容,不會深入到網頁內部的連結。
- 深度爬蟲:會跟蹤網頁內部的連結,繼續爬取連結指向的頁面,形成一個更深的爬取結構。
- 按照目標網站型別分類:
- 靜態網站爬蟲:用於爬取靜態網頁的內容。
- 動態網站爬蟲:能夠處理JavaScript等動態內容,爬取動態網頁的內容。
- 基於資料獲取方式分類:
- 基於API的爬蟲:透過呼叫網站提供的API介面獲取資料。
- 基於頁面解析的爬蟲:直接解析網頁內容獲取資料。
【4】Python爬蟲的常用庫
-
requests庫
- 用於傳送HTTP請求,方便地傳送GET、POST等請求,並獲取響應。
- 應用領域:爬蟲可以使用requests庫來傳送請求和獲取響應。
-
BeautifulSoup庫
-
用於解析HTML和XML文件,方便地提取其中的資料。
-
應用領域:爬蟲可以使用BeautifulSoup庫來解析網頁並提取需要的資料。
-
-
Selenium庫
- 用於模擬瀏覽器行為,模擬使用者在瀏覽器中的操作,如點選、輸入等。
- 應用領域:爬蟲可以使用Selenium庫來模擬使用者行為,獲取需要的資料。
-
Scrapy框架
-
提供了一套完整的爬蟲開發流程,包括髮送請求、獲取響應、解析響應、儲存資料等步驟。
-
應用領域:爬蟲可以使用Scrapy框架進行爬蟲開發。
-
【5】爬蟲的注意事項
-
爬蟲的合法性
- 在進行爬蟲開發時,需要遵守相關的法律法規,如《計算機軟體保護條例》、《網際網路資訊服務管理辦法》等。
-
爬蟲的速度
- 需要注意爬蟲的速度,避免對目標網站造成過大的負擔。
-
爬蟲的穩定性
- 需要注意爬蟲的穩定性,避免因為網路波動等原因導致爬蟲中斷。
-
爬蟲的資料儲存
- 需要注意資料的儲存方式,避免因為資料量過大導致儲存不足。
【6】爬蟲的基本流程
- 確定爬取目標:
- 確定要爬取的網站或者網頁。
- 確定要提取的資訊型別,例如文字、圖片、連結等。
- 傳送HTTP請求:
- 向目標網站傳送HTTP請求,請求頁面的內容。
- 可能需要設定請求頭,包括使用者代理資訊等,以模擬正常瀏覽器行為。
- 獲取網頁內容:
- 接收網站返回的響應,獲取頁面的HTML程式碼或其他標記語言。
- 可能需要處理響應,例如處理重定向、處理HTTP錯誤等。
- 解析網頁內容:
- 使用解析庫(如Beautiful Soup、lxml等)解析HTML或其他標記語言,提取出所需資訊。
- 根據需要,可能需要使用正規表示式或XPath來定位和提取特定的內容。
- 處理資料:
- 對提取的資料進行清洗、轉換、去重等處理,以確保資料的質量和一致性。
- 可能需要將資料儲存到資料庫、檔案或者其他資料儲存介質中。
- 儲存資料:
- 將處理後的資料儲存到指定的儲存介質中,如資料庫、檔案系統等。
- 根據需求,可能需要定期更新已儲存的資料。
- 處理連結:
- 如果需要爬取更多頁面,解析當前頁面中的連結,將新的連結加入爬取佇列。
- 保持跟蹤已經爬取的頁面,避免重複爬取或者進入死迴圈。
- 控制爬取速度:
- 為了避免對目標網站造成過大的負擔或者被封禁,需要控制爬取速度,避免過快地傳送請求。
- 可以使用延時等手段來控制爬取速度。
- 處理異常情況:
- 處理網路請求超時、頁面解析錯誤等異常情況,確保爬蟲的穩定性和健壯性。
- 可以記錄日誌、傳送警報等方式來監控和處理異常情況。
【7】常見的反爬蟲措施
-
頻率限制
-
網站會針對某個IP地址或使用者賬號設定請求頻率限制,如單位時間內只允許傳送一定數量的請求。
-
一旦超出限制,網站會對該IP或賬號進行處罰,如暫時封禁或限制訪問。
-
-
封IP和封賬號
-
網站可以透過監測異常行為,如頻繁請求、高併發等來判斷是否有惡意爬取行為,並對相關IP地址或賬號進行封禁。
-
為了規避封禁,爬蟲可以使用代理池來隨機切換IP地址,或使用大量小號(賬號池)輪流傳送請求。
-
-
請求頭中帶加密資訊
-
網站可能要求請求頭中包含特定的加密資訊,如Referer(來源頁面地址)和User-Agent(瀏覽器標識),用於驗證請求的合法性。
-
爬蟲需要模擬真實瀏覽器的請求頭資訊,以避免被檢測為非法爬蟲。
-
-
響應回來的資料是加密
-
為了防止直接獲取資料,網站可能會對返回的資料進行加密或編碼,爬蟲需要解密或解碼才能獲取到有效資訊。
-
這種情況下,爬蟲可能需要分析加密演算法或從其他渠道獲取解密金鑰。
-
-
驗證碼反扒
-
網站為了防止機器自動註冊、惡意爬取等行為,可能會在關鍵操作前設定驗證碼。
-
爬蟲需要透過第三方平臺或自己破解驗證碼來進行自動化操作。
-
-
JS加密
-
網站可能使用JavaScript對核心程式碼進行了壓縮和混淆,以
ers() -> function()
的形式,ers.somethin() -> function somethin()
,並新增了一些晦澀的加密方法。 -
爬蟲需要逆向工程來還原和理解這些加密演算法,並編寫相應的程式碼進行解密。
-
-
手機裝置唯一ID號
-
網站可能會根據爬蟲請求的裝置唯一識別符號(例如IMEI、Android ID、iOS裝置ID等)進行識別和限制。
-
爬蟲可能需要模擬不同裝置的請求,或者透過修改裝置資訊達到繞過檢測的效果。
-
需要注意的是,對於某些網站,爬蟲繞過這些反爬蟲措施可能涉及到違法行為,建議在合法範圍內開展爬蟲活動,遵守相關法律法規和網站的使用規定。