任務背景是需要從一個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)除了使用多臺機器和提高網速外,還能考慮什么方式提高爬蟲效率?
python如何提高爬蟲效率
慕慕森
2018-07-06 20:15:48