摘要:通常需要用爬蟲的場景都需要并發(fā)或并行,也就離不開進程線程或協(xié)程,而本示例就是一個簡單的異步爬蟲與同步爬蟲的對比。
通常需要用爬蟲的場景都需要并發(fā)或并行,也就離不開進程、線程或協(xié)程,而本示例就是一個簡單的異步爬蟲與同步爬蟲的對比。
代碼
異步爬蟲代碼:
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() "秒")
結(jié)果
異步
20.837937 秒
同步(我實在沒想到會耗時這么久...)
650.712683 秒
從結(jié)果來看,在爬取1000條鏈接的場景中,異步爬蟲效率是同步爬蟲的30多倍。
資源消耗相對較小,效率提升卻如此巨大,所以在以后的爬蟲中,我就優(yōu)先考慮異步了。
有興趣的朋友,可以嘗試一下與多線程和多進程的效率對比,請在本貼貼出對比結(jié)果。
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/125892.html
摘要:一般用進程池維護,的設為數(shù)量。多線程爬蟲多線程版本可以在單進程下進行異步采集,但線程間的切換開銷也會隨著線程數(shù)的增大而增大。異步協(xié)程爬蟲引入了異步協(xié)程語法。 Welcome to the D-age 對于網(wǎng)絡上的公開數(shù)據(jù),理論上只要由服務端發(fā)送到前端都可以由爬蟲獲取到。但是Data-age時代的到來,數(shù)據(jù)是新的黃金,毫不夸張的說,數(shù)據(jù)是未來的一切?;诮y(tǒng)計學數(shù)學模型的各種人工智能的出現(xiàn)...
摘要:編寫異步代碼可能是一種不同的體驗,尤其是對異步控制流而言?;卣{(diào)函數(shù)的準則在編寫異步代碼時,要記住的第一個規(guī)則是在定義回調(diào)時不要濫用閉包。為回調(diào)創(chuàng)建命名函數(shù),避免使用閉包,并將中間結(jié)果作為參數(shù)傳遞。 本系列文章為《Node.js Design Patterns Second Edition》的原文翻譯和讀書筆記,在GitHub連載更新,同步翻譯版鏈接。 歡迎關注我的專欄,之后的博文將在專...
摘要:任務,它是對協(xié)程對象的進一步封裝,包含了任務的各個狀態(tài)。代表將來執(zhí)行或還沒有執(zhí)行的任務,實際上和沒有本質(zhì)區(qū)別。 文章目錄 文章知識點一、異步爬蟲概述二、線程池的基...
摘要:面向?qū)ο蟮姆植际脚老x框架一簡介概述是一個面向?qū)ο蟮姆植际脚老x框架。分布式集群集群方式維護爬蟲爬蟲運行數(shù)據(jù),可通過或定制實現(xiàn)。 《面向?qū)ο蟮姆植际脚老x框架XXL-CRAWLER》 showImg(https://segmentfault.com/img/remote/1460000011842697);showImg(https://segmentfault.com/img/remote...
閱讀 3539·2023-04-25 20:09
閱讀 3740·2022-06-28 19:00
閱讀 3061·2022-06-28 19:00
閱讀 3082·2022-06-28 19:00
閱讀 3176·2022-06-28 19:00
閱讀 2881·2022-06-28 19:00
閱讀 3050·2022-06-28 19:00
閱讀 2638·2022-06-28 19:00