健壯高效的網絡爬蟲總結

原文連接:juejin.im/post/5bce82…html

1.爬取

絕大多數狀況下要麼是網頁,要麼是apppython

1.1網頁

服務端渲染mysql

就是頁面的結果是由服務器渲染後返回的,有效信息包含在請求的HTML頁面裏。正則表達式

解決方法:直接用HTTP請求庫就能夠實現爬取了redis

客戶端渲染算法

就是頁面的主要內容有JavaScript渲染而成的,真實的數據是經過Ajax接口形式獲取的sql

解決方法:數據庫

​ 1.尋找Ajax接口,能夠直接使用Chrome開發者工具直接查看Ajax具體的請求方式、參數等內容,而後用HTTP請求庫模擬便可,另外還能夠經過設置代理抓包來查看接口json

​ 2.模擬瀏覽器執行,網頁接口和邏輯較爲複雜的狀況下:Selenium、Splinter、Spynner、pyppeteer、PhantomJS、Splash、requests-html等來實現瀏覽器

​ 3.直接提取JavaScript數據,真實數據沒有通過Ajax接口獲取,而是直接包含在HTML結果的某個變量中,直接使用正則表達式將其提取出來

​ 4.模擬執行JavaScript,有時候模擬瀏覽器執行效率會偏低,若是咱們把JavaScript的某些執行和加密邏輯摸清楚了,能夠直接執行相關的JavaScript來完成邏輯處理和接口請求。好比使用Selenium、PyExecjs、PyV八、js2py等庫來完成便可

1.2app抓取

對於App的爬取,這裏分了四個處理狀況:

1.對於普通無加密接口,這種直接抓包拿到接口的具體請求形式就行了,可用的抓包工具備Charles、Fiddler、mitmproxy

2.對於加密參數的接口,一種方法能夠試試處理,例如Fiddler、mitmdump、Xposed等,另外一種方法是將加密邏輯破解,直接模擬構造便可,可能須要一些反編譯技巧。

3.對於加密內容的接口,即接口返回結果徹底看不懂是什麼東西,可使用可見便可爬的工具Appium,也可使用Xposed來hook獲取渲染結果,也能夠經過反編譯和改寫手機底層來破解。

4.對於很是規協議,可使用Wireshark來抓取全部協議的包,或者使用Tcpdump來進行TCP數據包截獲

2.解析

對於HTML類型的頁面來講,經常使用的解析方法:正則、Xpath、CSS Selector,對於某些接口來講常見的可能就是JSON、XML類型,使用對應的庫進行處理便可

智能解析

​ 1.readability算法:定義了不一樣區塊的不一樣標註集合,經過權重計算來獲得最可能的區塊位置

​ 2.疏密度判斷,計算單位個數區塊內的平均爲本內容長度,根據疏密程度來大體區分。

​ 3.Scrapyly自學習,是scrapy開發的組件,指定頁頁面和提取結果樣例,能夠自學習提取規則,提取其餘同類型頁面

​ 4.深度學習,使用深度學習來對未知進行監督學習,須要大量標註數據

3.存儲

1.文件:如JSON、CSV、TXT、圖片、視頻、音頻等,經常使用的一些庫csv、xlwt、json、pandas、pickle、python-docx等

2.數據庫,分爲關係型數據庫、非關係性數據庫,如MySQL、MongoDB、HBase等,經常使用的庫有pymysql、pymongo、redis等

3.搜索引擎,如Solr、ElasticSearch等,便於檢索和實現文本匹配,經常使用的庫有elasticsearch、pysolr等

4.雲存儲,某些媒體文件能夠存到七牛雲、又拍雲、阿里雲、騰訊雲、Amazon S3等,經常使用的庫有qiniu、upyun、boto、azure-storage、google-cloud-storage等。

4.反爬

簡單分爲費瀏覽器監測、封IP、驗證碼、封帳號、字體反爬等

4.1封IP

1.首先尋找手機站點、APP站點,若是存在此類站點,反爬會相對較弱。

2.使用代理,如抓取免費代理、購買付費代理、使用Tor代理、Socks代理等。

3.在代理的基礎上維護本身的代理池,防止代理浪費,保證明時可用。

4.搭建ADSL撥號代理,穩定高效。

4.2驗證碼

驗證碼分爲多種,如普通圖形驗證碼,算術題驗證碼、滑塊驗證碼、點觸驗證碼、手機驗證碼、掃二維碼等。

1.普通圖形驗證碼,若是很是規整且沒有變形或干擾,可使用OCR識別,也可使用機器學習、深度學習來進行模型訓練,固然打碼平臺是最方便的方式。

對於算術驗證碼,推薦直接使用打碼平臺

對於滑塊驗證碼,可使用破解算法,也能夠模擬滑動。後者的關鍵在於缺口的找尋,可使用圖片對比,也能夠寫基本的圖形識別算法,也能夠對接打碼平臺,也可使用深度學習訓練識別接口。

對於點觸驗證碼,推薦使用打碼平臺

對於手機驗證碼,可使用驗證碼分發平臺,也能夠購買專門的收碼設備,也能夠人工驗證。

對於掃二維碼,能夠人工掃碼,也能夠對接打碼平臺。

4.3封帳號

某些網站須要登陸才能爬取,可是一個帳號登陸以後請求過於頻繁會被封號,爲了不封號,能夠採起以下措施:

尋找手機站點或App站點,此種類別一般是接口形式,校驗較弱。

尋找無登陸接口,儘量尋找無需登陸便可爬的接口。

維護Cookies池,使用批量帳號模擬登陸,使用時隨機挑選可用cookies使用

5.加速

當爬取的數據量很是大時,如何高效快速的進行數據抓取是關鍵

多線程、多進程、異步、分佈式、細節優化等

5.1多進程、多線程

爬蟲時網絡請求密集型任務,因此使用多進程和多線程能夠大大提升抓取效率,如使用threading、multiprocessing等。

5.2異步

將爬取能夠運行其餘任務,如使用asyncio、aiohttp、Tornado、Twisted、gevent、grequests、pyppeteer、pyspider、Scrapy等。

5.3分佈式

分佈式的關鍵在於共享爬取隊列,可使用:

​ celery:異步任務隊列

​ huey:小型多線程任務隊列

​ rq:基於Redis的任務隊列

​ rabbitmq:靈活可靠的消息隊列

​ kafka:分佈式消息系統等來實現任務隊列的對接,也可使用現成的框架:

​ pyspider:rabbitmq Redis實現分佈

​ Scrapy-Redis:基於Redis實現分佈

​ Scrapy-Cluster:scrapy分佈式系統

5.4優化

能夠採起某些優化措施來實現爬取的加速:

DNS緩存

使用更快的解析方法

使用更高效的去重方法

模塊分離化管控

5.4架構

若是搭建了分佈式,要實現高效的爬取和管理調度、監控等操做,咱們可使用兩種架構來維護咱們的爬蟲項目。

1.將Scrapy項目打包成Docker鏡像,使用K8S控制調度過程。

2.將Scrapy項目部署到Scrapyd,使用專門的管理工具如SpiderKeeper、Gerapy等管理

相關文章
相關標籤/搜索