這篇文章將為大家詳細(xì)講解有關(guān)如何使用python爬取百萬(wàn)github用戶數(shù)據(jù),小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比鐵門關(guān)網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式鐵門關(guān)網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋鐵門關(guān)地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。
流程圖:
根據(jù)這個(gè)流程實(shí)現(xiàn)的代碼
看到這么簡(jiǎn)單的流程,內(nèi)心的第一想法就是先簡(jiǎn)單的寫一個(gè)遞歸實(shí)現(xiàn)唄,要是性能差再慢慢優(yōu)化,所以第一版代碼很快就完成了(在目錄recursion下)。數(shù)據(jù)存儲(chǔ)使用mongo,重復(fù)請(qǐng)求判斷使用的redis,寫mongo數(shù)據(jù)采用celery的異步調(diào)用,需要rabbitmq服務(wù)正常啟動(dòng),在settings.py正確配置后,使用下面的步驟啟動(dòng):
進(jìn)入github_spider目錄
執(zhí)行命令celery -A github_spider.worker worker loglevel=info
啟動(dòng)異步任務(wù)
執(zhí)行命令python github_spider/recursion/main.py
啟動(dòng)爬蟲
因?yàn)槊總€(gè)請(qǐng)求延時(shí)很高,爬蟲運(yùn)行效率很慢,訪問(wèn)了幾千個(gè)請(qǐng)求之后拿到了部分?jǐn)?shù)據(jù),這是按照查看數(shù)降序排列的python項(xiàng)目:
這是按粉絲數(shù)降序排列的用戶列表
作為一個(gè)有追求的程序員,當(dāng)然不能因?yàn)橐稽c(diǎn)小成就滿足,總結(jié)一下遞歸實(shí)現(xiàn)的幾個(gè)缺陷:
因?yàn)槭巧疃葍?yōu)先,當(dāng)整個(gè)用戶圖很大的時(shí)候,單機(jī)遞歸可能造成內(nèi)存溢出從而使程序崩潰,只能在單機(jī)短時(shí)間運(yùn)行。
單個(gè)請(qǐng)求延時(shí)過(guò)長(zhǎng),數(shù)據(jù)下載速度太慢。
針對(duì)一段時(shí)間內(nèi)訪問(wèn)失敗的鏈接沒有重試機(jī)制,存在數(shù)據(jù)丟失的可能。
針對(duì)這種I/O耗時(shí)的問(wèn)題,解決方法也就那幾種,要么多并發(fā),要么走異步訪問(wèn),要么雙管齊下。針對(duì)上面的問(wèn)題2,我最開始的解決方式是異步請(qǐng)求API。因?yàn)樽铋_始寫代碼的時(shí)候考慮到了這點(diǎn),代碼對(duì)調(diào)用方法已經(jīng)做過(guò)優(yōu)化,很快就改好了,實(shí)現(xiàn)方式使用了grequests。這個(gè)庫(kù)和requests是同一個(gè)作者,代碼也非常的簡(jiǎn)單,就是講request請(qǐng)求用gevent做了一個(gè)簡(jiǎn)單的封裝,可以非阻塞的請(qǐng)求數(shù)據(jù)。
但是當(dāng)我運(yùn)行之后,發(fā)現(xiàn)程序很快運(yùn)行結(jié)束,一查發(fā)現(xiàn)公網(wǎng)IP被github封掉了,當(dāng)時(shí)心中千萬(wàn)只草泥馬奔騰而過(guò),沒辦法只能祭出爬蟲的終極殺器--代理。又專門寫了一個(gè)輔助腳本從網(wǎng)上爬取免費(fèi)的HTTPS代理存放在redis中,路徑proxy/extract.py,每次請(qǐng)求的時(shí)候都帶上代理,運(yùn)行錯(cuò)誤重試自動(dòng)更換代理并把錯(cuò)誤代理清楚。本來(lái)網(wǎng)上免費(fèi)的HTTPS代理就很少,而且很多還不能用,由于大量的報(bào)錯(cuò)重試,訪問(wèn)速度不僅沒有原來(lái)快,而且比原來(lái)慢一大截,此路不通只能走多并發(fā)實(shí)現(xiàn)了。
采取廣度優(yōu)先的遍歷的方式,可以把要訪問(wèn)的網(wǎng)址存放在隊(duì)列中,再套用生產(chǎn)者消費(fèi)者的模式就可以很容易的實(shí)現(xiàn)多并發(fā),從而解決上面的問(wèn)題2。如果某段時(shí)間內(nèi)一直失敗,只需要將數(shù)據(jù)再仍會(huì)隊(duì)列就可以徹底解決問(wèn)題3。不僅如此,這種方式還可以支持中斷后繼續(xù)運(yùn)行,程序流程圖如下:
運(yùn)行程序
為了實(shí)現(xiàn)多級(jí)部署(雖然我就只有一臺(tái)機(jī)器),消息隊(duì)列使用了rabbitmq,需要?jiǎng)?chuàng)建名為github,類型是direct的exchange,然后創(chuàng)建四個(gè)名稱分別為user, repo, follower, following的隊(duì)列,詳細(xì)的綁定關(guān)系見下圖:
詳細(xì)的啟動(dòng)步驟如下:
進(jìn)入github_spider目錄
執(zhí)行命令celery -A github_spider.worker worker loglevel=info
啟動(dòng)異步任務(wù)
執(zhí)行命令python github_spider/proxy/extract.py
更新代理
執(zhí)行命令python github_spider/queue/main.py
啟動(dòng)腳本
隊(duì)列狀態(tài)圖:
關(guān)于“如何使用python爬取百萬(wàn)github用戶數(shù)據(jù)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。