這可能是你見(jiàn)過(guò)的最全的網(wǎng)絡(luò)爬蟲(chóng)總結(jié)
昨天的時(shí)候我參加了一場(chǎng) Python 網(wǎng)絡(luò)爬蟲(chóng)主題的分享活動(dòng),主要以直播的形式分享了我從事網(wǎng)絡(luò)爬蟲(chóng)相關(guān)研究以來(lái)的一些經(jīng)驗(yàn)總結(jié),整個(gè)直播從昨天下午 1 點(diǎn)一直持續(xù)到下午 5 點(diǎn),整整四個(gè)小時(shí)。

整個(gè)分享分為三個(gè)階段,第一階段先介紹了自己從大學(xué)以來(lái)從事編程開(kāi)發(fā)以來(lái)的相關(guān)歷程,第二階段是正式的網(wǎng)絡(luò)爬蟲(chóng)分享流程,詳細(xì)總結(jié)了網(wǎng)絡(luò)爬蟲(chóng)開(kāi)發(fā)的一些要點(diǎn),第三階段是解答一些提問(wèn),并抽獎(jiǎng)送出一些禮品。所以在這里我會(huì)對(duì)我昨天分享的主要內(nèi)容做下總結(jié),另外還會(huì)附上視頻回放、PPT,另外還會(huì)為大家送上一些福利,希望大家可以支持!
總括
整個(gè)分享的主題叫做《健壯高效的網(wǎng)絡(luò)爬蟲(chóng)》,本次分享從抓取、解析、存儲(chǔ)、反爬、加速五個(gè)方面介紹了利用 Python 進(jìn)行網(wǎng)絡(luò)爬蟲(chóng)開(kāi)發(fā)的相關(guān)知識(shí)點(diǎn)和技巧,介紹了不同場(chǎng)景下如何采取不同措施高效地進(jìn)行數(shù)據(jù)抓取的方法,包括 Web 抓取、App 抓取、數(shù)據(jù)存儲(chǔ)、代理選購(gòu)、驗(yàn)證碼破解、分布式抓取及管理、智能解析等多方面的內(nèi)容,另外還結(jié)合了不同場(chǎng)景介紹了常用的一些工具包,全部?jī)?nèi)容是我在從事網(wǎng)絡(luò)爬蟲(chóng)研究過(guò)程以來(lái)的經(jīng)驗(yàn)精華總結(jié)。
爬取
對(duì)于爬取來(lái)說(shuō),我們需要學(xué)會(huì)使用不同的方法來(lái)應(yīng)對(duì)不同情景下的數(shù)據(jù)抓取任務(wù)。
爬取的目標(biāo)絕大多數(shù)情況下要么是網(wǎng)頁(yè),要么是 App,所以這里就分為這兩個(gè)大類(lèi)別來(lái)進(jìn)行了介紹。
對(duì)于網(wǎng)頁(yè)來(lái)說(shuō),我又將其劃分為了兩種類(lèi)別,即服務(wù)端渲染和客戶(hù)端渲染,對(duì)于 App 來(lái)說(shuō),我又針對(duì)接口的形式進(jìn)行了四種類(lèi)別的劃分——普通接口、加密參數(shù)接口、加密內(nèi)容接口、非常規(guī)協(xié)議接口。
所以整個(gè)大綱是這樣子的:
網(wǎng)頁(yè)爬取
服務(wù)端渲染
客戶(hù)端渲染
App 爬取
普通接口
加密參數(shù)接口
加密內(nèi)容接口
非常規(guī)協(xié)議接口
爬取 / 網(wǎng)頁(yè)爬取
服務(wù)端渲染的意思就是頁(yè)面的結(jié)果是由服務(wù)器渲染后返回的,有效信息包含在請(qǐng)求的 HTML 頁(yè)面里面,比如貓眼電影這個(gè)站點(diǎn)。客戶(hù)端渲染的意思就是頁(yè)面的主要內(nèi)容由 JavaScript 渲染而成,真實(shí)的數(shù)據(jù)是通過(guò) Ajax 接口等形式獲取的,比如淘寶、微博手機(jī)版等等站點(diǎn)。
服務(wù)端渲染的情況就比較簡(jiǎn)單了,用一些基本的 HTTP 請(qǐng)求庫(kù)就可以實(shí)現(xiàn)爬取,如 urllib、urllib3、pycurl、hyper、requests、grab 等框架,其中應(yīng)用最多的可能就是 requests ?了。
對(duì)于客戶(hù)端渲染,這里我又劃分了四個(gè)處理方法:
尋找 Ajax 接口,此種情形可以直接使用 Chrome/Firefox 的開(kāi)發(fā)者工具直接查看 Ajax 具體的請(qǐng)求方式、參數(shù)等內(nèi)容,然后用 HTTP 請(qǐng)求庫(kù)模擬即可,另外還可以通過(guò)設(shè)置代理抓包來(lái)查看接口,如 Fiddler/Charles。
模擬瀏覽器執(zhí)行,此種情形適用于網(wǎng)頁(yè)接口和邏輯較為復(fù)雜的情況,可以直接以可見(jiàn)即可爬的方式進(jìn)行爬取,如可以使用 Selenium、Splinter、Spynner、pyppeteer、PhantomJS、Splash、requests-html 等來(lái)實(shí)現(xiàn)。
直接提取 JavaScript 數(shù)據(jù),此種情形適用于真實(shí)數(shù)據(jù)沒(méi)有經(jīng)過(guò) Ajax 接口獲取,而是直接包含在 HTML 結(jié)果的某個(gè)變量中,直接使用正則表達(dá)式將其提取即可。
模擬執(zhí)行 JavaScript,某些情況下直接模擬瀏覽器執(zhí)行效率會(huì)偏低,如果我們把 JavaScript 的某些執(zhí)行和加密邏輯摸清楚了,可以直接執(zhí)行相關(guān)的 JavaScript 來(lái)完成邏輯處理和接口請(qǐng)求,比如使用 Selenium、PyExecJS、PyV8、js2py 等庫(kù)來(lái)完成即可。
爬取 / App 爬取
對(duì)于 App 的爬取,這里分了四個(gè)處理情況:
對(duì)于普通無(wú)加密接口,這種直接抓包拿到接口的具體請(qǐng)求形式就好了,可用的抓包工具有 Charles、Fiddler、mitmproxy。
對(duì)于加密參數(shù)的接口,一種方法可以實(shí)時(shí)處理,例如 Fiddler、mitmdump、Xposed 等,另一種方法是將加密邏輯破解,直接模擬構(gòu)造即可,可能需要一些反編譯的技巧。
對(duì)于加密內(nèi)容的接口,即接口返回結(jié)果完全看不懂是什么東西,可以使用可見(jiàn)即可爬的工具 Appium,也可以使用 Xposed 來(lái) hook 獲取渲染結(jié)果,也可以通過(guò)反編譯和改寫(xiě)手機(jī)底層來(lái)實(shí)現(xiàn)破解。
對(duì)于非常規(guī)協(xié)議,可以使用 Wireshark 來(lái)抓取所有協(xié)議的包,或者使用 Tcpdump 來(lái)進(jìn)行 TCP 數(shù)據(jù)包截獲。
以上便是爬取流程的相關(guān)分類(lèi)和對(duì)應(yīng)的處理方法。
解析
對(duì)于解析來(lái)說(shuō),對(duì)于 HTML 類(lèi)型的頁(yè)面來(lái)說(shuō),常用的解析方法其實(shí)無(wú)非那么幾種,正則、XPath、CSS Selector,另外對(duì)于某些接口,常見(jiàn)的可能就是 JSON、XML 類(lèi)型,使用對(duì)應(yīng)的庫(kù)進(jìn)行處理即可。
這些規(guī)則和解析方法其實(shí)寫(xiě)起來(lái)是很繁瑣的,如果我們要爬上萬(wàn)個(gè)網(wǎng)站,如果每個(gè)網(wǎng)站都去寫(xiě)對(duì)應(yīng)的規(guī)則,那么不就太累了嗎?所以智能解析便是一個(gè)需求。
智能解析意思就是說(shuō),如果能提供一個(gè)頁(yè)面,算法可以自動(dòng)來(lái)提取頁(yè)面的標(biāo)題、正文、日期等內(nèi)容,同時(shí)把無(wú)用的信息給刨除,例如上圖,這是 Safari 中自帶的閱讀模式自動(dòng)解析的結(jié)果。
對(duì)于智能解析,下面分為四個(gè)方法進(jìn)行了劃分:
readability 算法,這個(gè)算法定義了不同區(qū)塊的不同標(biāo)注集合,通過(guò)權(quán)重計(jì)算來(lái)得到最可能的區(qū)塊位置。
疏密度判斷,計(jì)算單位個(gè)數(shù)區(qū)塊內(nèi)的平均文本內(nèi)容長(zhǎng)度,根據(jù)疏密程度來(lái)大致區(qū)分。
Scrapyly 自學(xué)習(xí),是 Scrapy 開(kāi)發(fā)的組件,指定?頁(yè)?面和提取結(jié)果樣例例,其可?自學(xué)習(xí)提取規(guī)則,提取其他同類(lèi)?頁(yè)?面。
深度學(xué)習(xí),使?用深度學(xué)習(xí)來(lái)對(duì)解析位置進(jìn)?行行有監(jiān)督學(xué)習(xí),需要?大量量標(biāo)注數(shù)據(jù)。
如果能夠容忍一定的錯(cuò)誤率,可以使用智能解析來(lái)大大節(jié)省時(shí)間。
目前這部分內(nèi)容我也還在探索中,準(zhǔn)確率有待繼續(xù)提高。
存儲(chǔ)
存儲(chǔ),即選用合適的存儲(chǔ)媒介來(lái)存儲(chǔ)爬取到的結(jié)果,這里還是分為四種存儲(chǔ)方式來(lái)進(jìn)行介紹。
文件,如 JSON、CSV、TXT、圖?、視頻、?頻等,常用的一些庫(kù)有 csv、xlwt、json、pandas、pickle、python-docx 等。
數(shù)據(jù)庫(kù),分為關(guān)系型數(shù)據(jù)庫(kù)、非關(guān)系型數(shù)據(jù)庫(kù),如 MySQL、MongoDB、HBase 等,常用的庫(kù)有 pymysql、pymssql、redis-py、pymongo、py2neo、thrift。
搜索引擎,如 Solr、ElasticSearch 等,便于檢索和實(shí)現(xiàn)?本匹配,常用的庫(kù)有 elasticsearch、pysolr 等。
云存儲(chǔ),某些媒體文件可以存到如七?牛云、又拍云、阿里云、騰訊云、Amazon S3 等,常用的庫(kù)有 qiniu、upyun、boto、azure-storage、google-cloud-storage 等。
這部分的關(guān)鍵在于和實(shí)際業(yè)務(wù)相結(jié)合,看看選用哪種方式更可以應(yīng)對(duì)業(yè)務(wù)需求。
反爬
反爬這部分是個(gè)重點(diǎn),爬蟲(chóng)現(xiàn)在已經(jīng)越來(lái)越難了,非常多的網(wǎng)站已經(jīng)添加了各種反爬措施,在這里可以分為非瀏覽器檢測(cè)、封 IP、驗(yàn)證碼、封賬號(hào)、字體反爬等。
下面主要從封 IP、驗(yàn)證碼、封賬號(hào)三個(gè)方面來(lái)闡述反爬的處理手段。
反爬 / 封 IP
對(duì)于封 IP 的情況,可以分為幾種情況來(lái)處理:
首先尋找手機(jī)站點(diǎn)、App 站點(diǎn),如果存在此類(lèi)站點(diǎn),反爬會(huì)相對(duì)較弱。
使用代理,如抓取免費(fèi)代理、購(gòu)買(mǎi)付費(fèi)代理、使用 Tor 代理、Socks 代理等。
在代理的基礎(chǔ)上維護(hù)自己的代理池,防止代理浪費(fèi),保證實(shí)時(shí)可用。
搭建 ADSL 撥號(hào)代理,穩(wěn)定高效。
反爬 / 驗(yàn)證碼
驗(yàn)證碼分為非常多種,如普通圖形驗(yàn)證碼、算術(shù)題驗(yàn)證碼、滑動(dòng)驗(yàn)證碼、點(diǎn)觸驗(yàn)證碼、手機(jī)驗(yàn)證碼、掃二維碼等。
對(duì)于普通圖形驗(yàn)證碼,如果非常規(guī)整且沒(méi)有變形或干擾,可以使用 OCR 識(shí)別,也可以使用機(jī)器學(xué)習(xí)、深度學(xué)習(xí)來(lái)進(jìn)行模型訓(xùn)練,當(dāng)然打碼平臺(tái)是最方便的方式。
對(duì)于算術(shù)題驗(yàn)證碼,推薦直接使用打碼平臺(tái)。
對(duì)于滑動(dòng)驗(yàn)證碼,可以使用破解算法,也可以模擬滑動(dòng)。后者的關(guān)鍵在于缺口的找尋,可以使用圖片比對(duì),也可以寫(xiě)基本的圖形識(shí)別算法,也可以對(duì)接打碼平臺(tái),也可以使用深度學(xué)習(xí)訓(xùn)練識(shí)別接口。
對(duì)于點(diǎn)觸驗(yàn)證碼,推薦使用打碼平臺(tái)。
對(duì)于手機(jī)驗(yàn)證碼,可以使用驗(yàn)證碼分發(fā)平臺(tái),也可以購(gòu)買(mǎi)專(zhuān)門(mén)的收碼設(shè)備,也可以人工驗(yàn)證。
對(duì)于掃二維碼,可以人工掃碼,也可以對(duì)接打碼平臺(tái)。
反爬 / 封賬號(hào)
某些網(wǎng)站需要登錄才能爬取,但是一個(gè)賬號(hào)登錄之后請(qǐng)求過(guò)于頻繁會(huì)被封號(hào),為了避免封號(hào),可以采取如下措施:
尋找手機(jī)站點(diǎn)或 App 站點(diǎn),此種類(lèi)別通常是接口形式,校驗(yàn)較弱。
尋找無(wú)登錄接口,盡可能尋找?無(wú)需登錄即可爬取的接口。
維護(hù) Cookies 池,使?用批量賬號(hào)模擬登錄,使?時(shí)隨機(jī)挑選可用 Cookies 使?即可,實(shí)現(xiàn):https://github.com/Python3WebSpider/CookiesPool。
加速
當(dāng)爬取的數(shù)據(jù)量非常大時(shí),如何高效快速地進(jìn)行數(shù)據(jù)抓取是關(guān)鍵。
常見(jiàn)的措施有多線(xiàn)程、多進(jìn)程、異步、分布式、細(xì)節(jié)優(yōu)化等。
加速 / 多線(xiàn)程、多進(jìn)程
爬蟲(chóng)是網(wǎng)絡(luò)請(qǐng)求密集型任務(wù),所以使用多進(jìn)程和多線(xiàn)程可以大大提高抓取效率,如使用 threading、multiprocessing 等。
加速 / 異步
將爬取過(guò)程改成非阻塞形式,當(dāng)有響應(yīng)式再進(jìn)行處理,否則在等待時(shí)間內(nèi)可以運(yùn)行其他任務(wù),如使用 asyncio、aiohttp、Tornado、Twisted、gevent、grequests、pyppeteer、pyspider、Scrapy 等。
加速 / 分布式
分布式的關(guān)鍵在于共享爬取隊(duì)列,可以使用 celery、huey、rq、rabbitmq、kafka 等來(lái)實(shí)現(xiàn)任務(wù)隊(duì)列的對(duì)接,也可以使用現(xiàn)成的框架 pyspider、Scrapy-Redis、Scrapy-Cluster 等。
加速 / 優(yōu)化
可以采取某些優(yōu)化措施來(lái)實(shí)現(xiàn)爬取的加速,如:
DNS 緩存
使用更快的解析方法
使用更高效的去重方法
模塊分離化管控
加速 / 架構(gòu)
如果搭建了分布式,要實(shí)現(xiàn)高效的爬取和管理調(diào)度、監(jiān)控等操作,我們可以使用兩種架構(gòu)來(lái)維護(hù)我們的爬蟲(chóng)項(xiàng)目。
將 Scrapy 項(xiàng)目打包為 Docker 鏡像,使用 K8S 控制調(diào)度過(guò)程。
將 Scrapy 項(xiàng)目部署到 Scrapyd,使用專(zhuān)用的管理工具如 SpiderKeeper、Gerapy 等管理。
以上便是我分享的全部?jī)?nèi)容,所有的內(nèi)容幾乎都展開(kāi)說(shuō)了,一共講了一個(gè)半小時(shí)。
另外對(duì)于這部分內(nèi)容,其實(shí)還有我制作的更豐富的思維導(dǎo)圖,預(yù)覽圖如下:
另外還有原演講稿我也一并分享給大家,可點(diǎn)擊下方附件下載。
附件: WebSpider.pdf 101.86KB 下載次數(shù):100次
附件: 健壯高效的網(wǎng)絡(luò)爬蟲(chóng)_崔慶才_(tái)華為云社區(qū).pdf 7.44M 下載次數(shù):119次
編程語(yǔ)言 存儲(chǔ) python 機(jī)器學(xué)習(xí) 大數(shù)據(jù)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。