资讯专栏INFORMATION COLUMN

异步爬虫和同步单线程爬虫对比

Tecode / 1926人阅读

摘要:通常需要用爬虫的场景都需要并发或并行,也就离不开进程线程或协程,而本示例就是一个简单的异步爬虫与同步爬虫的对比。

通常需要用爬虫的场景都需要并发或并行,也就离不开进程、线程或协程,而本示例就是一个简单的异步爬虫与同步爬虫的对比。

代码
异步爬虫代码:

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多倍。

资源消耗相对较小,效率提升却如此巨大,所以在以后的爬虫中,我就优先考虑异步了。

有兴趣的朋友,可以尝试一下与多线程和多进程的效率对比,请在本贴贴出对比结果。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/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元查看
<