网络爬虫干货总结!
?
轉(zhuǎn)載:https://cloud.tencent.com/developer/article/1366434
bilibili 視頻 -?聊聊 Python 的應(yīng)用 - 健壯高效的網(wǎng)絡(luò)爬蟲:https://www.bilibili.com/video/av34379204/
?
?
? ? ? ? 昨天的時候我參加了掘金組織的一場 Python 網(wǎng)絡(luò)爬蟲主題的分享活動,主要以直播的形式分享了我從事網(wǎng)絡(luò)爬蟲相關(guān)研究以來的一些經(jīng)驗總結(jié),整個直播從昨天下午 1 點一直持續(xù)到下午 5 點,整整四個小時。
? ? ? ? 整個分享分為三個階段,第一階段先介紹了自己從大學(xué)以來從事編程開發(fā)以來的相關(guān)歷程,第二階段是正式的網(wǎng)絡(luò)爬蟲分享流程,詳細(xì)總結(jié)了網(wǎng)絡(luò)爬蟲開發(fā)的一些要點,第三階段是解答一些提問,并抽獎送出一些禮品。所以在這里我會對我昨天分享的主要內(nèi)容做下總結(jié),另外還會附上視頻回放、PPT,另外還會為大家送上一些福利,希望大家可以支持!
?
?
?
總括
?
????????整個分享的主題叫做《健壯高效的網(wǎng)絡(luò)爬蟲》,本次分享從 抓取、解析、存儲、反爬、加速 五個方面介紹了利用 Python 進(jìn)行網(wǎng)絡(luò)爬蟲開發(fā)的相關(guān)知識點和技巧,介紹了不同場景下如何采取不同措施高效地進(jìn)行數(shù)據(jù)抓取的方法,包括 Web 抓取、App抓取、數(shù)據(jù)存儲、代理選購、驗證碼破解、分布式抓取及管理、智能解析?等多方面的內(nèi)容,另外還結(jié)合了不同場景介紹了常用的一些工具包,全部內(nèi)容是我在從事網(wǎng)絡(luò)爬蟲研究過程以來的經(jīng)驗精華總結(jié)。
?
?
?
爬取
?
對于爬取來說,我們需要學(xué)會使用不同的方法來應(yīng)對不同情景下的數(shù)據(jù)抓取任務(wù)。
爬取的目標(biāo)絕大多數(shù)情況下 要么是 網(wǎng)頁,要么是 App,所以這里就分為這兩個大類別來進(jìn)行了介紹。
- 對于網(wǎng)頁來說,我又將其劃分為了兩種類別,即 服務(wù)端渲染 和 客戶端渲染。
- 對于 App 來說,我又針對接口的形式進(jìn)行了四種類別的劃分:普通接口、加密參數(shù)接口、加密內(nèi)容接口、非常規(guī)協(xié)議接口。
?
所以整個大綱是這樣子的:
網(wǎng)頁爬取
App 爬取
?
web 網(wǎng)頁抓取
?
服務(wù)端渲染:意思就是頁面的結(jié)果是由服務(wù)器渲染后返回的,有效信息包含在請求的 HTML 頁面里面,比如貓眼電影這個站點。
客戶端渲染:意思就是頁面的主要內(nèi)容由 JavaScript 渲染而成,真實的數(shù)據(jù)是通過 Ajax 接口等形式獲取的,比如淘寶、微博手機版等等站點。
?
服務(wù)端渲染的情況就比較簡單了,用一些基本的 HTTP 請求庫就可以實現(xiàn)爬取,如 urllib、urllib3、pycurl、hyper、requests、grab 等框架,其中應(yīng)用最多的可能就是 requests 了。
?
對于客戶端渲染,這里我又劃分了四個處理方法:
?
?
App 爬取
?
對于 App 的爬取,這里分了四個處理情況:
以上便是爬取流程的相關(guān)分類和對應(yīng)的處理方法。
?
?
?
解析
?
對于解析來說,對于 HTML 類型的頁面來說,常用的解析方法其實無非那么幾種,正則、XPath、CSS Selector,另外對于某些接口,常見的可能就是 JSON、XML 類型,使用對應(yīng)的庫進(jìn)行處理即可。
這些規(guī)則和解析方法其實寫起來是很繁瑣的,如果我們要爬上萬個網(wǎng)站,如果每個網(wǎng)站都去寫對應(yīng)的規(guī)則,那么不就太累了嗎?所以智能解析便是一個需求。
智能解析意思就是說,如果能提供一個頁面,算法可以自動來提取頁面的標(biāo)題、正文、日期等內(nèi)容,同時把無用的信息給刨除,例如上圖,這是 Safari 中自帶的閱讀模式自動解析的結(jié)果。
?
對于智能解析,下面分為四個方法進(jìn)行了劃分:
如果能夠容忍一定的錯誤率,可以使用智能解析來大大節(jié)省時間。目前這部分內(nèi)容我也還在探索中,準(zhǔn)確率有待繼續(xù)提高。
?
?
?
存儲
?
存儲,即選用合適的存儲媒介來存儲爬取到的結(jié)果,這里還是分為四種存儲方式來進(jìn)行介紹。
這部分的關(guān)鍵在于和實際業(yè)務(wù)相結(jié)合,看看選用哪種方式更可以應(yīng)對業(yè)務(wù)需求。
?
?
?
反爬
?
反爬這部分是個重點,爬蟲現(xiàn)在已經(jīng)越來越難了,非常多的網(wǎng)站已經(jīng)添加了各種反爬措施,在這里可以分為非瀏覽器檢測、封 IP、驗證碼、封賬號、字體反爬等。
?
下面主要從封 IP、驗證碼、封賬號三個方面來闡述反爬的處理手段。
?
?
反爬 / 封 IP
?
對于封 IP 的情況,可以分為幾種情況來處理:
?
?
反爬 / 驗證碼
?
驗證碼分為非常多種,如 普通圖形驗證碼、算術(shù)題驗證碼、滑動驗證碼、點觸驗證碼、手機驗證碼、掃二維碼?等。
?
?
反爬 / 封賬號
?
某些網(wǎng)站需要登錄才能爬取,但是一個賬號登錄之后請求過于頻繁會被封號,為了避免封號,可以采取如下措施:
進(jìn)群:548377875? 即可獲取大量的PDF!希望大家早日入門!
?
?
?
加速
?
當(dāng)爬取的數(shù)據(jù)量非常大時,如何高效快速地進(jìn)行數(shù)據(jù)抓取是關(guān)鍵。
常見的措施有?多線程、多進(jìn)程、異步(協(xié)程)、分布式、細(xì)節(jié)優(yōu)化等。
?
?
加速 / 多線程、多進(jìn)程
?
爬蟲是網(wǎng)絡(luò)請求密集型任務(wù),所以使用多進(jìn)程和多線程可以大大提高抓取效率,如使用 threading、multiprocessing 等。
?
?
加速 / 異步
?
將爬取過程改成非阻塞形式,當(dāng)有響應(yīng)式再進(jìn)行處理,否則在等待時間內(nèi)可以運行其他任務(wù),如使用 asyncio、aiohttp、Tornado、Twisted、gevent、grequests、pyppeteer、pyspider、Scrapy 等。
?
?
加速 / 分布式
?
分布式的關(guān)鍵在于共享爬取隊列,可以使用 celery、huey、rq、rabbitmq、kafka 等來實現(xiàn)任務(wù)隊列的對接,也可以使用現(xiàn)成的框架 pyspider、Scrapy-Redis、Scrapy-Cluster 等。
?
?
加速 / 優(yōu)化
?
可以采取某些優(yōu)化措施來實現(xiàn)爬取的加速,如:
DNS 緩存
使用更快的解析方法
使用更高效的去重方法
模塊分離化管控
?
?
加速 / 架構(gòu)
?
如果搭建了分布式,要實現(xiàn)高效的爬取和管理調(diào)度、監(jiān)控等操作,我們可以使用兩種架構(gòu)來維護(hù)我們的爬蟲項目。
將 Scrapy 項目打包為 Docker 鏡像,使用 K8S 控制調(diào)度過程。
將 Scrapy 項目部署到 Scrapyd,使用專用的管理工具如 SpiderKeeper、Gerapy 等管理。
?
?
?
總結(jié)
- 上一篇: __cdecl、__stdcall、__
- 下一篇: 安卓逆向_15( 二 ) --- An