摘要:通常需要用爬虫的场景都需要并发或并行,也就离不开进程线程或协程,而本示例就是一个简单的异步爬虫与同步爬虫的对比。
通常需要用爬虫的场景都需要并发或并行,也就离不开进程、线程或协程,而本示例就是一个简单的异步爬虫与同步爬虫的对比。
代码
异步爬虫代码:
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
摘要:一般用进程池维护,的设为数量。多线程爬虫多线程版本可以在单进程下进行异步采集,但线程间的切换开销也会随着线程数的增大而增大。异步协程爬虫引入了异步协程语法。 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...
阅读 3474·2023-04-25 20:09
阅读 3685·2022-06-28 19:00
阅读 2995·2022-06-28 19:00
阅读 2995·2022-06-28 19:00
阅读 3048·2022-06-28 19:00
阅读 2834·2022-06-28 19:00
阅读 2969·2022-06-28 19:00
阅读 2578·2022-06-28 19:00