python爬蟲:帶你一步一步理解爬蟲的性能

網絡爬蟲 Python 平地摔VS天然呆 2019-06-04
python爬蟲:帶你一步一步理解爬蟲的性能

爬蟲性能相關

這裡我們通過請求網頁例子來一步步理解爬蟲性能

當我們有一個列表存放了一些url需要我們獲取相關數據,我們首先想到的是循環

簡單的循環串行

這一種方法相對來說是最慢的,因為一個一個循環,耗時是最長的,是所有的時間總和

代碼如下:

import requests
url_list = [
'http://www.baidu.com',
'http://www.pythonsite.com',
'http://www.cnblogs.com/'
]
for url in url_list:
result = requests.get(url)
print(result.text)

通過線程池

通過線程池的方式訪問,這樣整體的耗時是所有連接裡耗時最久的那個,相對循環來說快了很多

import requests
from concurrent.futures import ThreadPoolExecutor
def fetch_request(url):
result = requests.get(url)
print(result.text)
url_list = [
'http://www.baidu.com',
'http://www.bing.com',
'http://www.cnblogs.com/'
]
pool = ThreadPoolExecutor(10)
for url in url_list:
#去線程池中獲取一個線程,線程去執行fetch_request方法
pool.submit(fetch_request,url)
pool.shutdown(True)
python爬蟲:帶你一步一步理解爬蟲的性能

線程池+回調函數

這裡定義了一個回調函數callback

from concurrent.futures import ThreadPoolExecutor
import requests
def fetch_async(url):
response = requests.get(url)
return response
def callback(future):
print(future.result().text)
url_list = [
'http://www.baidu.com',
'http://www.bing.com',
'http://www.cnblogs.com/'
]
pool = ThreadPoolExecutor(5)
for url in url_list:
v = pool.submit(fetch_async,url)
#這裡調用回調函數
v.add_done_callback(callback)
pool.shutdown()

通過進程池

通過進程池的方式訪問,同樣的也是取決於耗時最長的,但是相對於線程來說,進程需要耗費更多的資源,同時這裡是訪問url時IO操作,所以這裡線程池比進程池更好

import requests
from concurrent.futures import ProcessPoolExecutor
def fetch_request(url):
result = requests.get(url)
print(result.text)
url_list = [
'http://www.baidu.com',
'http://www.bing.com',
'http://www.cnblogs.com/'
]
pool = ProcessPoolExecutor(10)
for url in url_list:
#去進程池中獲取一個線程,子進程程去執行fetch_request方法
pool.submit(fetch_request,url)
pool.shutdown(True)

進程池+回調函數

這種方式和線程+回調函數的效果是一樣的,相對來說開進程比開線程浪費資源

from concurrent.futures import ProcessPoolExecutor
import requests
def fetch_async(url):
response = requests.get(url)
return response
def callback(future):
print(future.result().text)
url_list = [
'http://www.baidu.com',
'http://www.bing.com',
'http://www.cnblogs.com/'
]
pool = ProcessPoolExecutor(5)
for url in url_list:
v = pool.submit(fetch_async, url)
# 這裡調用回調函數
v.add_done_callback(callback)
pool.shutdown()

如果喜歡本文的話,不妨點個關注。

所有的努力都值得期許,每一份夢想都應該灌溉!

相關推薦

推薦中...