摘要:降低的結(jié)果可能有三個隨著數(shù)據(jù)量的增大的性能受到了一定的影響知乎校驗器在把中的代理消費(fèi)完之后,由于是定時任務(wù),所以導(dǎo)致某段時間內(nèi)新鮮的空缺。
歷時大致兩個月,到現(xiàn)在終于完成了分布式代理抓取爬蟲,目前開源在了Github上。寫這個項目的原因主要有兩點(diǎn),一是自己平時的部分工作需要和爬蟲打交道,代理IP在有的時候可以發(fā)揮非常重要的作用,調(diào)研過一些開源的代理IP采集程序,發(fā)現(xiàn)在抓取、解析、校驗、資源調(diào)度等這些方面總有一些不盡人意的地方;二是和一個網(wǎng)友(不嚴(yán)格的說算得上是伯樂)的交流讓我有了關(guān)于使用Scrapy來寫分布式爬蟲的一些想法,正好可以借助這個機(jī)會來嘗試證實這些想法。
這篇文章的目的是闡述haipproxy的主要架構(gòu)和流程。該項目關(guān)鍵部分是
基于Scrapy和Redis的分布式爬蟲,用作IP抓取和校驗,對應(yīng)于項目的crawler
基于Redis實現(xiàn)的分布式任務(wù)調(diào)度工具,對應(yīng)于項目的scheduler和redis_util.py
Crawler分為代理抓取和校驗,兩者實現(xiàn)思想類似,主要使用Scrapy的spider_idle信號和DontCloseSpider異常來阻止Scrapy在沒有數(shù)據(jù)的時候關(guān)閉,靈感來自scrapy-redis。為了方便闡述,我畫了一張包含各個組件的流程圖,如下
啟動調(diào)度器,包括代理爬蟲調(diào)度器和校驗爬蟲調(diào)度器。調(diào)度器會讀取rules.py中待抓取的網(wǎng)站,將其編排成任務(wù)存入各個任務(wù)隊列中
啟動各個爬蟲,包括IP抓取和校驗程序。項目中爬蟲和調(diào)度器都是高可用的,可以根據(jù)實際情況進(jìn)行分布式部署,無需改動代碼。由于本文的目標(biāo)不是寫成該項目的詳細(xì)使用文檔,所以省略了如指定啟動爬蟲類型和調(diào)度器類型的介紹
代理IP采集爬蟲啟動后會到對應(yīng)的任務(wù)隊列中獲取任務(wù)并執(zhí)行,再把獲取到的結(jié)果存入一個init隊列中
init隊列由一個特殊的校驗器HttpbinInitValidator進(jìn)行消費(fèi),它會過濾掉透明代理,再把可用代理輸入各個Validated隊列中
調(diào)度器會定時從Validated隊列中獲取代理IP,再將其存入一個臨時的隊列。這里用一個臨時隊列是為了讓校驗更加公平,如果直接從Validated隊列中獲取資源進(jìn)行校驗,那么會增大不公平性
這時候各個校驗器(非init校驗器)會從對應(yīng)的臨時隊列中獲取待校驗的IP并對其進(jìn)行校驗,此處省略校驗細(xì)節(jié)
校驗完成后再將其放回到Validated隊列中,等待下一輪校驗
請求成功率(體現(xiàn)為分?jǐn)?shù))、響應(yīng)速度和最近校驗時間滿足settings.py所配置要求的代理IP將會被爬蟲客戶端所消費(fèi)
為了屏蔽各個調(diào)用語言的差異性,目前實現(xiàn)的客戶端是squid客戶端,它可以作為爬蟲客戶端的中間件
到此,整個流程便完了。
以單機(jī)模式部署haipproxy和測試代碼,以知乎為目標(biāo)請求站點(diǎn),
每一萬條成功請求為統(tǒng)計結(jié)果,實測抓取效果如下
請求量 | 時間 | 耗時 | IP負(fù)載策略 | 客戶端 |
---|---|---|---|---|
0 | 2018/03/03 22:03 | 0 | greedy | py_cli |
10000 | 2018/03/03 11:03 | 1 hour | greedy | py_cli |
20000 | 2018/03/04 00:08 | 2 hours | greedy | py_cli |
30000 | 2018/03/04 01:02 | 3 hours | greedy | py_cli |
40000 | 2018/03/04 02:15 | 4 hours | greedy | py_cli |
50000 | 2018/03/04 03:03 | 5 hours | greedy | py_cli |
60000 | 2018/03/04 05:18 | 7 hours | greedy | py_cli |
70000 | 2018/03/04 07:11 | 9 hours | greedy | py_cli |
80000 | 2018/03/04 08:43 | 11 hours | greedy | py_cli |
可見haipporxy的代理效果還算不錯,在開始的時候可以達(dá)到1w/hour的請求量,幾個小時候請求量請求量
降為了5k/hour。降低的結(jié)果可能有三個: (1)隨著數(shù)據(jù)量的增大,Redis的性能受到了一定的影響(2)知乎校驗器在把Init Queue中的代理消費(fèi)完之后,由于是定時任務(wù),所以導(dǎo)致某段時間內(nèi)新鮮的IP空缺。而免費(fèi)IP大多數(shù)都是短效的,所以這段時間出現(xiàn)了IP的空缺;(3)由于我們采用的是greedy模式調(diào)用IP,它的調(diào)用策略是: 高質(zhì)量代理IP會一直被調(diào)用直至該代理IP不能用或者被封,而低應(yīng)速度IP會輪詢調(diào)用。這也可能導(dǎo)致高質(zhì)量IP的空缺。
可見IP校驗和調(diào)用策略還有很大的優(yōu)化空間。
項目地址: https://github.com/SpiderClub...
歡迎star和fork,也歡迎大家交流和PR。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/44577.html
摘要:阻塞,非阻塞首先,阻塞這個詞來自操作系統(tǒng)的線程進(jìn)程的狀態(tài)模型網(wǎng)絡(luò)爬蟲基本原理一后端掘金網(wǎng)絡(luò)爬蟲是捜索引擎抓取系統(tǒng)的重要組成部分。每門主要編程語言現(xiàn)未來已到后端掘金使用和在相同環(huán)境各加載多張小圖片,性能相差一倍。 2016 年度小結(jié)(服務(wù)器端方向)| 掘金技術(shù)征文 - 后端 - 掘金今年年初我花了三個月的業(yè)余時間用 Laravel 開發(fā)了一個項目,在此之前,除了去年換工作準(zhǔn)備面試時,我并...
摘要:阻塞,非阻塞首先,阻塞這個詞來自操作系統(tǒng)的線程進(jìn)程的狀態(tài)模型網(wǎng)絡(luò)爬蟲基本原理一后端掘金網(wǎng)絡(luò)爬蟲是捜索引擎抓取系統(tǒng)的重要組成部分。每門主要編程語言現(xiàn)未來已到后端掘金使用和在相同環(huán)境各加載多張小圖片,性能相差一倍。 2016 年度小結(jié)(服務(wù)器端方向)| 掘金技術(shù)征文 - 后端 - 掘金今年年初我花了三個月的業(yè)余時間用 Laravel 開發(fā)了一個項目,在此之前,除了去年換工作準(zhǔn)備面試時,我并...
摘要:面向?qū)ο蟮姆植际脚老x框架一簡介概述是一個面向?qū)ο蟮姆植际脚老x框架。分布式集群集群方式維護(hù)爬蟲爬蟲運(yùn)行數(shù)據(jù),可通過或定制實現(xiàn)。 《面向?qū)ο蟮姆植际脚老x框架XXL-CRAWLER》 showImg(https://segmentfault.com/img/remote/1460000011842697);showImg(https://segmentfault.com/img/remote...
摘要:以上是如果你想精通網(wǎng)絡(luò)爬蟲的學(xué)習(xí)研究路線,按照這些步驟學(xué)習(xí)下去,可以讓你的爬蟲技術(shù)得到非常大的提升。 作者:韋瑋 轉(zhuǎn)載請注明出處 隨著大數(shù)據(jù)時代的到來,人們對數(shù)據(jù)資源的需求越來越多,而爬蟲是一種很好的自動采集數(shù)據(jù)的手段。 那么,如何才能精通Python網(wǎng)絡(luò)爬蟲呢?學(xué)習(xí)Python網(wǎng)絡(luò)爬蟲的路線應(yīng)該如何進(jìn)行呢?在此為大家具體進(jìn)行介紹。 1、選擇一款合適的編程語言 事實上,Python、P...
閱讀 2323·2023-04-26 00:28
閱讀 3067·2019-08-30 15:55
閱讀 2742·2019-08-30 12:47
閱讀 1550·2019-08-29 11:04
閱讀 3150·2019-08-28 18:14
閱讀 945·2019-08-28 18:11
閱讀 1671·2019-08-26 18:36
閱讀 3383·2019-08-23 18:21