任務(wù)背景是需要從一個linux服務(wù)器上下載文件,我擁有該服務(wù)器的訪問權(quán)限但僅限于讀。目前的解決方法是我把所有需要下載的數(shù)據(jù)地址都保存在了本地的文件中,一行一條數(shù)據(jù)地址,通過paramiko包連接服務(wù)器然后使用多線程的方式進(jìn)行爬取。每個線程啟動時向其傳入一個下載地址列表,因為每個線程的下載地址列表都不重復(fù),因此不需要考慮線程之間的通信。詳細(xì)代碼如下:# filename是存儲在本地的地址列表文件,n是最大線程數(shù)
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:
# 該函數(shù)的功能是將服務(wù)器中的文件下載至本地,第一個參數(shù)是具體地址,第二個參數(shù)是連接句柄
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是為了防止并發(fā)數(shù)太多
for i in numbers:
threads[i].join()現(xiàn)在有兩個問題:(1)我一般把n設(shè)置為300,程序啟動時下載速度很快,能夠達(dá)到每分鐘100多份文件,雖然也能看到一些線程崩潰,但數(shù)量不多;但是大概10分鐘后程序下載速度只有20多份文件,是因為很多線程已經(jīng)掛掉了嘛,還是線程之間通過同一個賬戶訪問存在阻塞?為什么速度下降幅度這么大?(2)除了使用多臺機(jī)器和提高網(wǎng)速外,還能考慮什么方式提高爬蟲效率?
python如何提高爬蟲效率
慕慕森
2018-07-06 20:15:48