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