前言
第一次完整看了一次技術直播,靜距離地接觸到了崔慶才老師,正是他的網易課程讓我入了爬蟲的門,成功地開發爬蟲爬取到了想要的資料,體驗了資料抓取的樂趣。藉此良機,在這裡我想簡單總結整理一下我所學到的以及這次直播聽到的關於爬蟲的所有知識,有什麼地方不夠準確,歡迎大家指正,相互學習。(哭,在崔神寫完之後釋出,壓力很大的,參考部分不少,畢竟主要按崔神思路來寫的,崔神分享連結:juejin.im/post/5bce82…
文章分為六部分,按照崔老師的思路講下去,同時穿插個人補充
- 爬取
- 解析
- 儲存
- 框架scrapy
- 防反爬
- 加速
爬取
這一部分主要講的是怎麼才能拿到想要的資料來源
爬取型別
主要分為兩種:
- 服務端渲染(頁面結果是由伺服器渲染後返回的,有效資訊包含在請求直接返回的HTML頁面中)
- 客戶端渲染(頁面結果由JavaScript渲染而成,html 僅僅作為靜態檔案,客戶端在請求時,服務端不做任何處理,直接以原檔案的形式返回給客戶端,然後根據 html 上的 JavaScript,生成 DOM 插入 html顯示資料)
針對不同型別,解決方法自然不同
服務端渲染型別解決方法
對於第一種服務端渲染型別,直接通過各種庫請求拿到HTML頁面即可(資料在HTML頁面上)
這裡列舉如下庫可做參考研究深入:
- urllib(Python自帶的原生底層庫)
- urllib3(相比urllib增加很多新特性和功能)
- pycurl(libcurl的Python實現)
- hyper(支援HTTP2的新特性)
- requests(應用最廣泛的HTTP請求庫,推薦)
- grab(基於urllib3和PyQuery封裝)
客戶端渲染型別解決方法
此種情形一般是用第一種方法無法請求檢視到想要抓取的資料,採用以下四種方法
- 尋找Ajax請求
AJAX 是一種用於建立快速動態網頁的技術。通過在後臺與伺服器進行少量資料交換,AJAX 可以使網頁實現非同步更新。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。有很多使用 AJAX的應用程式案例:新浪微博、Google 地圖、開心網等等。
解決方法:
直接使用 Chrome/Firefox 的開發者工具直接檢視 Ajax 具體的請求方式、引數等內容,然後用 HTTP 請求庫模擬即可
另外還可以通過設定代理抓包來檢視介面,如 Fiddler/Charles
- 模擬瀏覽器執行
適用於網頁介面和邏輯較複雜的情況
使用 Selenium、Splinter、Spynner、pyppeteer、PhantomJS、Splash、requests-html 等來實現
- 直接提取JavaScript資料
此種情況資料隱藏在JavaSript變數中,直接利用正規表示式等方式提取解析即可
- 模擬執行JavaScript
直接模擬瀏覽器執行效率低,可以通過執行JavaScript完成資料獲取,通過Selenium、PyExecJS、PyV8、js2py 等庫幫助完成
APP資料爬取
- 普通介面
直接請求
抓取HTTP/HTTPS資料包,利用 Charles、Fiddler、mitmproxy軟體
- 加密引數介面
介面的引數經過加密,每次請求有隨機生成的token
一是可以實時處理,利用 Fiddler、mitmdump、Xposed 等,其次可以是將加密邏輯破解,直接模擬構造規則即可,還可以直接反編譯破解。
- 加密內容介面
介面返回結果經過加密
1.利用Appium,可見即可爬,類似Selenium
2.Xposed 使用hook來獲取結果
3.反編譯 找出使用的加密演算法,模擬即可
4.改寫手機底層作業系統原始碼
- 非常規協議
利用WireShark抓取所有協議包
利用Tcpdunp抓取TCP資料包
資料解析
資料來源拿到了,很多地方無用資訊太多,需要我們進一步進行資料清洗加工
-
HTML頁面資料
利用四大種資料解析方法,(在相應的庫中都會提供),Xpath,CSS,正規表示式,Selector,這些解析都有各自的解析規則,每個拿些例子用用就記住會用了,推薦用Xpath -
其他型別
對於介面返回的json,xml型別,直接用json,xml2dict庫處理即可
以上解析都是每次爬取一個網頁資料,就要重新構造資料解析規則,甚是繁瑣麻煩,如果資料量不大,自己複製貼上都比較方便,那樣有沒有一種方法解決這個問題呢
機器學習大展身手的今天,爬蟲領域也有它的身影。於是有了智慧解析!
下面分為四個方法進行了劃分:
- readability演算法,這個演算法定義了不同區塊的不同標註集合,通過權重計算來得到最可能的區塊位置。
- 疏密度判斷,計算單位個數區塊內的平均文字內容長度,根據疏密程度來大致區分。
- Scrapyly 自學習,是 Scrapy開發的元件,指定⻚頁⾯面和提取結果樣例例,其可自學習提取規則,提取其他同類頁⾯。
- 深度學習,使⽤用深度學習來對解析位置進⾏有監督學習,需要⼤量標註資料。
當然現在機器學習演算法的準確率還不能達到100%,會有資料出錯,水比較深
儲存
資料解析下來後,資料就得儲存起來,可以作為資料探勘和機器學習的資料來源,這裡說一下常見的儲存方式
- 檔案 如 JSON、CSV、TXT、圖⽚、視訊、⾳頻等
- 資料庫,分為關係型資料庫、非關係型資料庫,如 MySQL、MongoDB、HBase 等
- 搜尋引擎,如 Solr、ElasticSearch 等,便於檢索和實現⽂本匹配
- 雲端儲存,某些媒體檔案可以存到如七⽜牛雲、又拍雲、阿里雲、騰訊雲、Amazon S3 等
框架
從請求資料來源到清洗解析資料,最後到儲存,這個爬蟲的基本三部就這樣結束了,用python的各種庫,是不是覺得很亂,下面我就簡單說說關於爬蟲的框架,這些開源的爬蟲框架把複雜的問題解決掉,然後封裝,提供各種類函式讓我們用的很簡單、方便,不必考慮那些URL去重、代理、執行緒池管理等等問題,每次開發只需要著重考慮抓取邏輯,但是想入手框架,有一定門檻,建議看看原始碼,多想想他們的設計思想以及實現邏輯。
以上是一些常用框架的對比圖,沒有絕對的好壞,不同的框架需求點不同
最近學習了scrapy框架,因此在這裡總結一下主要的邏輯圖,不細說
先上邏輯圖
主要的邏輯步驟八步(由標號1開始到8):
- 首先第一次通過start_url設定爬取首頁面,呼叫內建的start_request方法發起requests請求交給爬蟲引擎ENGINE處理
- ENGINE交給SCHEDULER排程器處理
- 排程器佇列排程發起requests請求
- 由排程器發起的requests請求ENGINE將其交給DOWNLOADER請求下載網頁
- 請求返回response結果交給ENGINE
- ENGINE將請求返回的response交給spider解析
- spider解析返回資料清洗整理成的items項,並解析其中頁面可能含有的新連結生成requests,同樣交至ENGINE
- ENGINE將items項交給ITEM PIPELINES儲存,requests交給排程器排程
以上便是主要scrapy框架邏輯,其中MIDDLEWARE稱為中介軟體,分為downloader middleware(用以另外處理requests和response物件)和spider middleware(一個Scrapy的spider處理機制的鉤子框架,你可以插入自定義的功能用來處理engine發往spider的response和spider發往engine的request和item)
scrapy框架博大精深,持續挖掘中。。。。。
反爬
隨著公司對自己資料的保護意識不斷提高,現在很多小公司網站都已經新增反爬檢測,爬蟲可以說是越來越不容易
防爬方式有非瀏覽器檢測,封IP,封賬號,字型反爬等
封ip,賬號
爬久了會拒絕服務請求,可通過交替更換ip爬取,用代理解決,可以分為幾種情況來處理:
- 首先尋找手機站點、App 站點,如果存在此類站點,反爬會相對較弱,先找軟柿子下手嘛。
- 使用代理,如抓取免費代理、購買付費 Tor 代理、Socks 代理等。
- 在代理的基礎上維護自己的代理池,防止代理浪費,保證實時可用。
- 搭建 ADSL 撥號代理,穩定高效。
- 尋找無登入介面,儘可能尋找⽆無需登入即可爬取的介面。
- 維護 Cookies 池,使⽤用批量賬號模擬登入,使⽤時隨機挑選可用 Cookies 使⽤即可
驗證碼
- 普通圖形驗證碼,如果非常規整且沒有變形或干擾,可以使用 OCR 識別,也可以使用機器學習方面圖片識別來模型訓練,當然打碼平臺是最方便的方式。
- 對於算術題驗證碼,推薦直接使用打碼平臺。
- 對於滑動驗證碼,可以使用破解演算法,也可以模擬滑動(模擬真人拖動規律先是加速滑動後減速)。後者的關鍵在於缺口的找尋,可以使用圖片比對,也可以寫基本的圖形識別演算法,也可以對接打碼平臺,也可以使用深度學習訓練識別介面。
- 對於點觸驗證碼,推薦使用打碼平臺。對於手機驗證碼,可以使用驗證碼分發平臺,也可以購買專門的收碼裝置,也可以人工驗證
- 對於掃二維碼,可以人工掃碼,也可以對接打碼平臺。
加速
資料量大時候,高效快速爬取是當下的關鍵問題
- 多程式,多執行緒
- 非同步
- 分散式
- 優化
- 架構
最後捧上崔神總結的腦圖,致敬崔神!
最後我想說一下自己的感受,當初學爬蟲就是為了爬取資料自動化生成表格,解決生活中的繁雜重複無意義的事,機緣巧合竟在其中尋找到了一些樂趣成就感,深入學習了不少,想把爬蟲作為以後的主要方向,但隨著我不斷地瞭解認識到如今爬蟲的前景不是特別明朗,然後由於很多方面原因吧,也是參考崔神建議,最終決定把爬蟲作為興趣作為一個支線帶著做一做,會一如既往地繼續學習研究下去,因為我知道抓取大量資料那種成就感是貨真價實,是無關乎任何外界因素的個人,所有如果大家也有同樣的糾結疑慮,希望我的分享可以給你一些參考,沒事的時候,讓我們拋下一切,迴歸當初學爬蟲的心態,多爬爬資料,感受其中的魅力。