原文連接:juejin.im/post/5bce82…html
絕大多數狀況下要麼是網頁,要麼是apppython
服務端渲染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等庫來完成便可
對於App的爬取,這裏分了四個處理狀況:
1.對於普通無加密接口,這種直接抓包拿到接口的具體請求形式就行了,可用的抓包工具備Charles、Fiddler、mitmproxy
2.對於加密參數的接口,一種方法能夠試試處理,例如Fiddler、mitmdump、Xposed等,另外一種方法是將加密邏輯破解,直接模擬構造便可,可能須要一些反編譯技巧。
3.對於加密內容的接口,即接口返回結果徹底看不懂是什麼東西,可使用可見便可爬的工具Appium,也可使用Xposed來hook獲取渲染結果,也能夠經過反編譯和改寫手機底層來破解。
4.對於很是規協議,可使用Wireshark來抓取全部協議的包,或者使用Tcpdump來進行TCP數據包截獲
對於HTML類型的頁面來講,經常使用的解析方法:正則、Xpath、CSS Selector,對於某些接口來講常見的可能就是JSON、XML類型,使用對應的庫進行處理便可
智能解析
1.readability算法:定義了不一樣區塊的不一樣標註集合,經過權重計算來獲得最可能的區塊位置
2.疏密度判斷,計算單位個數區塊內的平均爲本內容長度,根據疏密程度來大體區分。
3.Scrapyly自學習,是scrapy開發的組件,指定頁頁面和提取結果樣例,能夠自學習提取規則,提取其餘同類型頁面
4.深度學習,使用深度學習來對未知進行監督學習,須要大量標註數據
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等。
簡單分爲費瀏覽器監測、封IP、驗證碼、封帳號、字體反爬等
1.首先尋找手機站點、APP站點,若是存在此類站點,反爬會相對較弱。
2.使用代理,如抓取免費代理、購買付費代理、使用Tor代理、Socks代理等。
3.在代理的基礎上維護本身的代理池,防止代理浪費,保證明時可用。
4.搭建ADSL撥號代理,穩定高效。
驗證碼分爲多種,如普通圖形驗證碼,算術題驗證碼、滑塊驗證碼、點觸驗證碼、手機驗證碼、掃二維碼等。
1.普通圖形驗證碼,若是很是規整且沒有變形或干擾,可使用OCR識別,也可使用機器學習、深度學習來進行模型訓練,固然打碼平臺是最方便的方式。
對於算術驗證碼,推薦直接使用打碼平臺
對於滑塊驗證碼,可使用破解算法,也能夠模擬滑動。後者的關鍵在於缺口的找尋,可使用圖片對比,也能夠寫基本的圖形識別算法,也能夠對接打碼平臺,也可使用深度學習訓練識別接口。
對於點觸驗證碼,推薦使用打碼平臺
對於手機驗證碼,可使用驗證碼分發平臺,也能夠購買專門的收碼設備,也能夠人工驗證。
對於掃二維碼,能夠人工掃碼,也能夠對接打碼平臺。
某些網站須要登陸才能爬取,可是一個帳號登陸以後請求過於頻繁會被封號,爲了不封號,能夠採起以下措施:
尋找手機站點或App站點,此種類別一般是接口形式,校驗較弱。
尋找無登陸接口,儘量尋找無需登陸便可爬的接口。
維護Cookies池,使用批量帳號模擬登陸,使用時隨機挑選可用cookies使用
當爬取的數據量很是大時,如何高效快速的進行數據抓取是關鍵
多線程、多進程、異步、分佈式、細節優化等
爬蟲時網絡請求密集型任務,因此使用多進程和多線程能夠大大提升抓取效率,如使用threading、multiprocessing等。
將爬取能夠運行其餘任務,如使用asyncio、aiohttp、Tornado、Twisted、gevent、grequests、pyppeteer、pyspider、Scrapy等。
分佈式的關鍵在於共享爬取隊列,可使用:
celery:異步任務隊列
huey:小型多線程任務隊列
rq:基於Redis的任務隊列
rabbitmq:靈活可靠的消息隊列
kafka:分佈式消息系統等來實現任務隊列的對接,也可使用現成的框架:
pyspider:rabbitmq Redis實現分佈
Scrapy-Redis:基於Redis實現分佈
Scrapy-Cluster:scrapy分佈式系統
能夠採起某些優化措施來實現爬取的加速:
DNS緩存
使用更快的解析方法
使用更高效的去重方法
模塊分離化管控
若是搭建了分佈式,要實現高效的爬取和管理調度、監控等操做,咱們可使用兩種架構來維護咱們的爬蟲項目。
1.將Scrapy項目打包成Docker鏡像,使用K8S控制調度過程。
2.將Scrapy項目部署到Scrapyd,使用專門的管理工具如SpiderKeeper、Gerapy等管理