国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

異步爬蟲和同步單線程爬蟲對比

Tecode / 2007人閱讀

摘要:通常需要用爬蟲的場景都需要并發或并行,也就離不開進程線程或協程,而本示例就是一個簡單的異步爬蟲與同步爬蟲的對比。

通常需要用爬蟲的場景都需要并發或并行,也就離不開進程、線程或協程,而本示例就是一個簡單的異步爬蟲與同步爬蟲的對比。

代碼
異步爬蟲代碼:

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

相關文章

  • 關于Python爬蟲種類、法律、輪子的一二三

    摘要:一般用進程池維護,的設為數量。多線程爬蟲多線程版本可以在單進程下進行異步采集,但線程間的切換開銷也會隨著線程數的增大而增大。異步協程爬蟲引入了異步協程語法。 Welcome to the D-age 對于網絡上的公開數據,理論上只要由服務端發送到前端都可以由爬蟲獲取到。但是Data-age時代的到來,數據是新的黃金,毫不夸張的說,數據是未來的一切。基于統計學數學模型的各種人工智能的出現...

    lscho 評論0 收藏0
  • 《Node.js設計模式》基于回調的異步控制流

    摘要:編寫異步代碼可能是一種不同的體驗,尤其是對異步控制流而言?;卣{函數的準則在編寫異步代碼時,要記住的第一個規則是在定義回調時不要濫用閉包。為回調創建命名函數,避免使用閉包,并將中間結果作為參數傳遞。 本系列文章為《Node.js Design Patterns Second Edition》的原文翻譯和讀書筆記,在GitHub連載更新,同步翻譯版鏈接。 歡迎關注我的專欄,之后的博文將在專...

    Chiclaim 評論0 收藏0
  • Python爬蟲--高性能的異步爬蟲(五)

    摘要:任務,它是對協程對象的進一步封裝,包含了任務的各個狀態。代表將來執行或還沒有執行的任務,實際上和沒有本質區別。 文章目錄 文章知識點一、異步爬蟲概述二、線程池的基...

    leeon 評論0 收藏0
  • 面向對象的分布式爬蟲框架XXL-CRAWLER

    摘要:面向對象的分布式爬蟲框架一簡介概述是一個面向對象的分布式爬蟲框架。分布式集群集群方式維護爬蟲爬蟲運行數據,可通過或定制實現。 《面向對象的分布式爬蟲框架XXL-CRAWLER》 showImg(https://segmentfault.com/img/remote/1460000011842697);showImg(https://segmentfault.com/img/remote...

    anquan 評論0 收藏0
  • Node_模塊

    摘要:當某個執行完畢時,將以時間的形式通知執行操作的線程,線程執行了這個事件的回調函數。為了處理異步,線程必須有事件循環,不斷的檢查是否有未處理的時間。這種處理機制,稱為事件環機制。方面使用第三方模塊。 簡介 V8引擎本身就是用于Chrome瀏覽器的JS解釋部分,但是Ryan Dahl,把V8搬到服務器,用于做服務器的軟件。Node是一個專注于實現高性能Web服務器優化的專家,在遇到V8而誕...

    zero 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<