您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如何使用python爬取百萬github用戶數據,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
流程圖:
根據這個流程實現的代碼
看到這么簡單的流程,內心的第一想法就是先簡單的寫一個遞歸實現唄,要是性能差再慢慢優化,所以第一版代碼很快就完成了(在目錄recursion下)。數據存儲使用mongo,重復請求判斷使用的redis,寫mongo數據采用celery的異步調用,需要rabbitmq服務正常啟動,在settings.py正確配置后,使用下面的步驟啟動:
進入github_spider目錄
執行命令celery -A github_spider.worker worker loglevel=info
啟動異步任務
執行命令python github_spider/recursion/main.py
啟動爬蟲
因為每個請求延時很高,爬蟲運行效率很慢,訪問了幾千個請求之后拿到了部分數據,這是按照查看數降序排列的python項目:
這是按粉絲數降序排列的用戶列表
作為一個有追求的程序員,當然不能因為一點小成就滿足,總結一下遞歸實現的幾個缺陷:
因為是深度優先,當整個用戶圖很大的時候,單機遞歸可能造成內存溢出從而使程序崩潰,只能在單機短時間運行。
單個請求延時過長,數據下載速度太慢。
針對一段時間內訪問失敗的鏈接沒有重試機制,存在數據丟失的可能。
針對這種I/O耗時的問題,解決方法也就那幾種,要么多并發,要么走異步訪問,要么雙管齊下。針對上面的問題2,我最開始的解決方式是異步請求API。因為最開始寫代碼的時候考慮到了這點,代碼對調用方法已經做過優化,很快就改好了,實現方式使用了grequests。這個庫和requests是同一個作者,代碼也非常的簡單,就是講request請求用gevent做了一個簡單的封裝,可以非阻塞的請求數據。
但是當我運行之后,發現程序很快運行結束,一查發現公網IP被github封掉了,當時心中千萬只草泥馬奔騰而過,沒辦法只能祭出爬蟲的終極殺器--代理。又專門寫了一個輔助腳本從網上爬取免費的HTTPS代理存放在redis中,路徑proxy/extract.py,每次請求的時候都帶上代理,運行錯誤重試自動更換代理并把錯誤代理清楚。本來網上免費的HTTPS代理就很少,而且很多還不能用,由于大量的報錯重試,訪問速度不僅沒有原來快,而且比原來慢一大截,此路不通只能走多并發實現了。
采取廣度優先的遍歷的方式,可以把要訪問的網址存放在隊列中,再套用生產者消費者的模式就可以很容易的實現多并發,從而解決上面的問題2。如果某段時間內一直失敗,只需要將數據再仍會隊列就可以徹底解決問題3。不僅如此,這種方式還可以支持中斷后繼續運行,程序流程圖如下:
運行程序
為了實現多級部署(雖然我就只有一臺機器),消息隊列使用了rabbitmq,需要創建名為github,類型是direct的exchange,然后創建四個名稱分別為user, repo, follower, following的隊列,詳細的綁定關系見下圖:
詳細的啟動步驟如下:
進入github_spider目錄
執行命令celery -A github_spider.worker worker loglevel=info
啟動異步任務
執行命令python github_spider/proxy/extract.py
更新代理
執行命令python github_spider/queue/main.py
啟動腳本
隊列狀態圖:
關于“如何使用python爬取百萬github用戶數據”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。