摘要:通常需要用爬蟲的場景都需要并發或并行,也就離不開進程線程或協程,而本示例就是一個簡單的異步爬蟲與同步爬蟲的對比。
通常需要用爬蟲的場景都需要并發或并行,也就離不開進程、線程或協程,而本示例就是一個簡單的異步爬蟲與同步爬蟲的對比。
代碼
異步爬蟲代碼:
import asyncio
import json
import aiohttp
from typing import List Optional
from datetime import datetime
class Spider:
def __init__(self urls: List[str] headers: Optional[dict] = None cookie: Optional[str] = None):
self.urls = urls
self.headers = headers
self.cookies = None if cookie else {cookie: cookie}
self.loop = asyncio.get_event_loop()
self.result = list()
def excute(self):
self.loop.run_until_complete(self.spiders())
self.loop.close()
with open(main.json w) as f:
json.dump(self.result f)
async def spiders(self):
semaphore = asyncio.Semaphore(250)
spider = [self.run(url semaphore) for url in self.urls]
await asyncio.wait(spider)
async def run(self url semaphore):
async with semaphore:
async with aiohttp.ClientSession(loop=self.loop headers=self.headers cookies=self.cookies) as session:
async with session.get(url) as response:
text = await response.text()
self.result.append(json.loads(text))
if name == "__main__":
urls = []
for i in range(1 1001):
urls.append(fhttp://httpbin.org/anything?page={i})
s = Spider(urls)
start = datetime.now()
s.excute()
end = datetime.now()
print((end - start).total_seconds() "秒")
同步爬蟲代碼:
import json
import requests
from datetime import datetime
if name == "__main__":
start = datetime.now()
result = []
for i in range(1 1001):
url = fhttp://httpbin.org/anything?page={i}
result.append(requests.get(url).json())
with open(test.json w) as f:
json.dump(result f)
end = datetime.now()
print((end - start).total_seconds() "秒")
結果
異步
20.837937 秒
同步(我實在沒想到會耗時這么久...)
650.712683 秒
從結果來看,在爬取1000條鏈接的場景中,異步爬蟲效率是同步爬蟲的30多倍。
資源消耗相對較小,效率提升卻如此巨大,所以在以后的爬蟲中,我就優先考慮異步了。
有興趣的朋友,可以嘗試一下與多線程和多進程的效率對比,請在本貼貼出對比結果。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/125892.html
摘要:一般用進程池維護,的設為數量。多線程爬蟲多線程版本可以在單進程下進行異步采集,但線程間的切換開銷也會隨著線程數的增大而增大。異步協程爬蟲引入了異步協程語法。 Welcome to the D-age 對于網絡上的公開數據,理論上只要由服務端發送到前端都可以由爬蟲獲取到。但是Data-age時代的到來,數據是新的黃金,毫不夸張的說,數據是未來的一切。基于統計學數學模型的各種人工智能的出現...
摘要:編寫異步代碼可能是一種不同的體驗,尤其是對異步控制流而言?;卣{函數的準則在編寫異步代碼時,要記住的第一個規則是在定義回調時不要濫用閉包。為回調創建命名函數,避免使用閉包,并將中間結果作為參數傳遞。 本系列文章為《Node.js Design Patterns Second Edition》的原文翻譯和讀書筆記,在GitHub連載更新,同步翻譯版鏈接。 歡迎關注我的專欄,之后的博文將在專...
摘要:任務,它是對協程對象的進一步封裝,包含了任務的各個狀態。代表將來執行或還沒有執行的任務,實際上和沒有本質區別。 文章目錄 文章知識點一、異步爬蟲概述二、線程池的基...
摘要:面向對象的分布式爬蟲框架一簡介概述是一個面向對象的分布式爬蟲框架。分布式集群集群方式維護爬蟲爬蟲運行數據,可通過或定制實現。 《面向對象的分布式爬蟲框架XXL-CRAWLER》 showImg(https://segmentfault.com/img/remote/1460000011842697);showImg(https://segmentfault.com/img/remote...
閱讀 3514·2023-04-25 20:09
閱讀 3720·2022-06-28 19:00
閱讀 3035·2022-06-28 19:00
閱讀 3058·2022-06-28 19:00
閱讀 3133·2022-06-28 19:00
閱讀 2860·2022-06-28 19:00
閱讀 3015·2022-06-28 19:00
閱讀 2611·2022-06-28 19:00