91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用python爬取百萬github用戶數據

發布時間:2022-01-13 15:12:31 來源:億速云 閱讀:306 作者:小新 欄目:大數據

這篇文章將為大家詳細講解有關如何使用python爬取百萬github用戶數據,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

流程圖:

 如何使用python爬取百萬github用戶數據

根據這個流程實現的代碼

遞歸實現

運行命令

看到這么簡單的流程,內心的第一想法就是先簡單的寫一個遞歸實現唄,要是性能差再慢慢優化,所以第一版代碼很快就完成了(在目錄recursion下)。數據存儲使用mongo,重復請求判斷使用的redis,寫mongo數據采用celery的異步調用,需要rabbitmq服務正常啟動,在settings.py正確配置后,使用下面的步驟啟動:

  1. 進入github_spider目錄

  2. 執行命令celery -A github_spider.worker worker loglevel=info啟動異步任務

  3. 執行命令python github_spider/recursion/main.py啟動爬蟲

運行結果

因為每個請求延時很高,爬蟲運行效率很慢,訪問了幾千個請求之后拿到了部分數據,這是按照查看數降序排列的python項目: 

如何使用python爬取百萬github用戶數據

這是按粉絲數降序排列的用戶列表 

如何使用python爬取百萬github用戶數據

運行缺陷

作為一個有追求的程序員,當然不能因為一點小成就滿足,總結一下遞歸實現的幾個缺陷:

  1. 因為是深度優先,當整個用戶圖很大的時候,單機遞歸可能造成內存溢出從而使程序崩潰,只能在單機短時間運行。

  2. 單個請求延時過長,數據下載速度太慢。

  3. 針對一段時間內訪問失敗的鏈接沒有重試機制,存在數據丟失的可能。

異步優化

針對這種I/O耗時的問題,解決方法也就那幾種,要么多并發,要么走異步訪問,要么雙管齊下。針對上面的問題2,我最開始的解決方式是異步請求API。因為最開始寫代碼的時候考慮到了這點,代碼對調用方法已經做過優化,很快就改好了,實現方式使用了grequests。這個庫和requests是同一個作者,代碼也非常的簡單,就是講request請求用gevent做了一個簡單的封裝,可以非阻塞的請求數據。

但是當我運行之后,發現程序很快運行結束,一查發現公網IP被github封掉了,當時心中千萬只草泥馬奔騰而過,沒辦法只能祭出爬蟲的終極殺器--代理。又專門寫了一個輔助腳本從網上爬取免費的HTTPS代理存放在redis中,路徑proxy/extract.py,每次請求的時候都帶上代理,運行錯誤重試自動更換代理并把錯誤代理清楚。本來網上免費的HTTPS代理就很少,而且很多還不能用,由于大量的報錯重試,訪問速度不僅沒有原來快,而且比原來慢一大截,此路不通只能走多并發實現了。

隊列實現

實現原理

采取廣度優先的遍歷的方式,可以把要訪問的網址存放在隊列中,再套用生產者消費者的模式就可以很容易的實現多并發,從而解決上面的問題2。如果某段時間內一直失敗,只需要將數據再仍會隊列就可以徹底解決問題3。不僅如此,這種方式還可以支持中斷后繼續運行,程序流程圖如下:

如何使用python爬取百萬github用戶數據

運行程序

為了實現多級部署(雖然我就只有一臺機器),消息隊列使用了rabbitmq,需要創建名為github,類型是direct的exchange,然后創建四個名稱分別為user, repo, follower, following的隊列,詳細的綁定關系見下圖:

如何使用python爬取百萬github用戶數據

詳細的啟動步驟如下:

  1. 進入github_spider目錄

  2. 執行命令celery -A github_spider.worker worker loglevel=info啟動異步任務

  3. 執行命令python github_spider/proxy/extract.py更新代理

  4. 執行命令python github_spider/queue/main.py啟動腳本

隊列狀態圖:

如何使用python爬取百萬github用戶數據


關于“如何使用python爬取百萬github用戶數據”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永年县| 巴青县| 新巴尔虎右旗| 卢湾区| 巴南区| 平江县| 西华县| 沅陵县| 台湾省| 海安县| 类乌齐县| 杭锦后旗| 留坝县| 沙湾县| 古交市| 涞水县| 永康市| 浦城县| 临颍县| 岳阳县| 嵊泗县| 黑龙江省| 德惠市| 盘锦市| 调兵山市| 灵寿县| 离岛区| 连州市| 龙口市| 延庆县| 贵州省| 辽中县| 沈丘县| 沧州市| 九江市| 玛曲县| 宜兴市| 金川县| 大港区| 肥城市| 仁怀市|