爬蟲性能相關
這裡我們通過請求網頁例子來一步步理解爬蟲性能
當我們有一個列表存放了一些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)
線程池+回調函數
這裡定義了一個回調函數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()
如果喜歡本文的話,不妨點個關注。
所有的努力都值得期許,每一份夢想都應該灌溉!
相關推薦
'《What the f*ck Python!》那難以理解和反人類直覺的例子及原理'
"歡迎各位小哥哥小姐姐閱讀本<小生>的文章,對大家學習有幫助,請點贊加關注哦!!!!!!!!!!您的點贊和關注將是我持續更新的動力呢.^v^有不懂的問題可以私聊我哦!前言最近,發現了一個在GitHub關於Python的一個非常有趣的項目。這個項目叫《What t...
'python爬蟲模擬微博登錄'
"微博模擬登錄這是本次爬取的網址:https://weibo.com/一、請求分析找到登錄的位置,填寫用戶名密碼進行登錄操作看看這次請求響應的數據是什麼這是響應得到的數據,保存下來exectime: 8nonce: "HW9VSX"pcid: "gz-4ede4c6269a...
'為啥子這麼多人開始學Python?看完這些你就清楚了'
"Python具有豐富和強大的庫。它常被暱稱為膠水語言,能夠把用其他語言製作的各種模塊(尤其是C/C++)很輕鬆地聯結在一起。在小編看來,基本上可以負責任地認為,Python 可以做任何事情。無論是從入門級選手到專業級數據挖掘、科學計算、圖像處理、人工智能,Python 都...
'寫python爬蟲,不會正則怎麼行呢?另贈學習資料'
"導讀:正則在各語言中的使用是有差異的,本文以 Python 3 為基礎。本文主要講述的是正則的語法,對於 re 模塊不做過多描述,只會對一些特殊地方做提示。很多人覺得正則很難,在我看來,這些人一定是沒有用心。其實正則很簡單,根據二八原則,我們只需要懂 20% 的內容就可以...
'玩手機不如自學一下Python,清華1000集視頻教程大彙總無償送給你'
"Python一句話概括:需要拿著遊標卡尺學習的語言python是一款服務器端解釋型開源非編譯腳本語言。它常被暱稱為膠水語言,能夠把用其他語言製作的各種模塊(尤其是C/C++)很輕鬆地聯結在一起。Python的優勢:Python學習簡單,被譽為“最易學習的語言”。Pytho...
推薦中...