亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

python如何提高爬蟲效率

python如何提高爬蟲效率

慕慕森 2018-07-06 20:15:48
任務背景是需要從一個linux服務器上下載文件,我擁有該服務器的訪問權限但僅限于讀。目前的解決方法是我把所有需要下載的數據地址都保存在了本地的文件中,一行一條數據地址,通過paramiko包連接服務器然后使用多線程的方式進行爬取。每個線程啟動時向其傳入一個下載地址列表,因為每個線程的下載地址列表都不重復,因此不需要考慮線程之間的通信。詳細代碼如下:# filename是存儲在本地的地址列表文件,n是最大線程數 def download(filename, n):     files = open(filename, 'rb').readlines()     numbers = range(n)     stop = len(files) / len(numbers)     def thread_download(n):         sftp = login()         directory = files[n*stop : (n+1)*stop]         for line in directory:             # 該函數的功能是將服務器中的文件下載至本地,第一個參數是具體地址,第二個參數是連接句柄             download_from_server(line.strip(), sftp)      threads = []     for i in numbers:         threads.append(threading.Thread(target=thread_download, args=(i, )))         threads[i].start()         time.sleep(0.1)  # 暫停0.1s是為了防止并發數太多     for i in numbers:         threads[i].join()現在有兩個問題:(1)我一般把n設置為300,程序啟動時下載速度很快,能夠達到每分鐘100多份文件,雖然也能看到一些線程崩潰,但數量不多;但是大概10分鐘后程序下載速度只有20多份文件,是因為很多線程已經掛掉了嘛,還是線程之間通過同一個賬戶訪問存在阻塞?為什么速度下降幅度這么大?(2)除了使用多臺機器和提高網速外,還能考慮什么方式提高爬蟲效率?
查看完整描述

3 回答

?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

首先要搞清楚瓶頸在哪里。一個是監控你的cpu、內存、io,看看有沒有出現滿載。一個是測試你的服務器的連接速度,確認它的上限,以及在持續傳輸的過程中是否會限速(有的機房會限速)

查看完整回答
反對 回復 2018-07-14
?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

一個進程開300個線程 太多了吧 建議少一點 16 or 32 測試一下 然后提高效率,基于目前的模式,你可以開多個進程 每個進程多個線程,可能會更快。


查看完整回答
反對 回復 2018-07-14
?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

提高爬蟲的方法有很多,建議看看python的相關庫函數

查看完整回答
反對 回復 2018-07-14
  • 3 回答
  • 0 關注
  • 727 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號