前段時間學習了多執行緒,但在實際的情況中對於多執行緒的速度實在不滿意,所以今天就來學學多程序分布式爬蟲,在這裡感謝莫煩的python教程。
在講述多程序之前,先來回顧一下之前學習的多執行緒。
對於多執行緒可以簡單的理解成運輸快遞的貨車,雖然在整個運輸快遞的途中有很多貨車參與運輸,但快遞到你手中的時間並不會因為貨車的數量增加而變化多少,甚至可能會因為參與運輸的貨車數量過多,導致送貨時間變慢,因為貨物在不斷的上貨卸貨。
當然現實中可不會有人這麼幹,然而在計算機的世界裡,有時卻會犯這種錯誤,這也就是說多執行緒並不是越多越好。
如果有作業系統的基礎,則對於執行緒與程序的理解會更深刻些,這裡繼續參照上面的例子,對於執行緒可以簡單的理解成乙個執行緒就是乙個貨車,而乙個程序則是一整條快遞運輸線路上的貨車集合,也就是說乙個程序包含了多個執行緒。
如果在只有乙個快遞需要運輸的時候,使用執行緒與程序的區別或許不大,但是如果有十件快遞、百件快遞,使用多程序無疑能夠極大的提高效率。
接下來需要用到的模組:
import time #測試爬取時間
import requests
import threading
from multiprocessing import process #多程序模組
from bs4 import beautifulsoup
接下來需要用到的一些子函式:
def req_url(url):
r = requests.get(url) #訪問url
return(r.text) #返回html
def soup_url(html):
url_list =
soup = beautifulsoup(html, 'html.parser') #解析返回的html
for i in soup.select('.post-title'):
return (url_list) #返回部落格文章url陣列
這裡先使用普通爬取的方法,也就是單執行緒測試一下,為了方便,下面提到的單執行緒處理方法,準確的來說是單程序單執行緒,同樣的,下面提到的多程序準確的說法是多程序單執行緒,多執行緒準確的說則是單程序多執行緒。
值得注意的是爬取耗時根據自己的網路情況而定,即使碰到多程序耗時幾百秒而單執行緒耗時幾十秒也是正常的,這種情況是因為網路環境較差造成的,所以碰到結果出入很大的時候,可以多試幾次,排除偶然性,下面就來上**。
if __name__ == '__main__':
# 開始單執行緒
start_time = time.time()
url = ''
html = req_url(url)
home_page = soup_url(html)
for i in home_page:
req_url(i)
end_time = time.time()
print('\n單執行緒:',end_time - start_time)
最終執行結果如下:
單執行緒: 29.181440114974976
單執行緒花費了 29 秒的時間,接下來使用多程序測試一下
通過學習發現多程序的用法和多執行緒還是挺相似的,所以就直接放**吧,感興趣的可以看看參考文章。
if __name__ == '__main__':
# 開始多程序
start_time = time.time()
url = ''
pool = pool(4)
home_page = soup_url(req_url(url))
for i in home_page:
pool.close()
pool.join()
end_time = time.time()
print('\n多程序:',end_time - start_time)
最終執行結果如下:
多程序: 12.674117088317871
多程序僅用了 12 秒就完成了任務,經過多次測試,發現使用多程序基本上能比單執行緒快2倍以上。
為了看到多執行緒與多程序的差距,這裡使用多執行緒處理了一下上面的操作,**如下:
if __name__ == '__main__':
#開始多執行緒
start_time = time.time()
url = ''
thread_list =
home_page = soup_url(req_url(url))
for i in home_page:
t = threading.thread(target = req_url, args=(i,))
for i in thread_list:
i.start()
for i in thread_list:
i.join()
end_time = time.time()
print('\n多執行緒:', end_time - start_time)
最終執行結果如下:
多執行緒: 11.685778141021729
看到這裡可能會覺著,這多執行緒和多程序爬蟲的時間也差不多呀,然而事實並非那麼簡單。
由於爬蟲的大多數時間都耗在了請求等待響應中,所以在爬蟲的時候使用多執行緒好像快了不少,但我以前寫過乙個筆記:不一定有效率gil
在這篇文章裡演示了如果使用單執行緒和多執行緒處理密集計算任務,有時多執行緒反而會比單執行緒慢了不少,所以接下來就看看多程序處理密集計算任務的表現。
直接上**:
import time # 測試爬取時間
import threading
from multiprocessing import pool
def math(i):
result2 = 2 ** i #執行冪運算
if __name__ == '__main__':
#開始單執行緒
start_time = time.time()
for i in range(0, 1000000001, 250000000):
math(i)
end_time = time.time()
print('\n單執行緒:',end_time - start_time)
#開始多程序
start_time = time.time()
pool = pool(4)
for i in range(0, 1000000001, 250000000):
pool.close()
pool.join()
end_time = time.time()
print('\n多程序:',end_time - start_time)
# 開始多執行緒
start_time = time.time()
thread_list =
for i in range(0, 1000000001, 250000000):
t = threading.thread(target = math, args=(i,))
for i in thread_list:
i.start()
for i in thread_list:
i.join()
end_time = time.time()
print('\n多執行緒:', end_time - start_time)
最終執行結果如下:
單執行緒: 20.495169162750244
多程序: 11.645867347717285
多執行緒: 22.07299304008484
通過執行結果可以很明顯看出,單執行緒與多執行緒的耗時差距不大,但是多程序的耗時與之相比幾乎快了一倍,所以平時為了提高效率是使用多執行緒還是多程序,也就很清楚了。
但如果平時想提高爬蟲效率是用多執行緒還是多程序呢?畢竟他們效率都差不多,那麼協程了解一下?
參考文章:
多程序爬蟲
1.多程序爬貓眼電影 下圖是爬去後的結果 在寫爬蟲的時候,資料量大的時候,所需要的時間就會很長,所以今天就來說多程序爬資料,有興趣的可以執行下面的 coding utf 8 import sys reload sys sys.setdefaultencoding utf 8 import reque...
python學習筆記(六) 多程序
依據廖雪峰官方 的python教程整理 import os 多程序 unix linux作業系統提供了乙個fork 系統呼叫,os.fork 封裝了fork系統呼叫,windows系統無法使用 print process s start.os.getpid pid os.fork if pid 0 ...
python學習筆記之多程序
我們現代的作業系統,都是支援 多工 的作業系統,對於操程式設計客棧作系統來說,乙個任務就是乙個程序 process 比如開啟乙個瀏覽器就是啟動乙個瀏覽器程序。如果我們將計算器的核心cpu比喻為一座工廠,那麼程序就像工廠裡的車間,它代表cpu所能處理的單個任務。任一時刻,cpu總是執行乙個程序,其他程...