美文网首页
异步爬虫和同步单线程爬虫对比

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

作者: thepoy | 来源:发表于2020-12-07 20:54 被阅读0次

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

代码

异步爬虫代码:

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(f'http://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 = f'http://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多倍。
异步爬虫既能提高效率,占用的资源相对来说又少,还不赶快从多线程爬虫转为异步爬虫吗?

相关文章

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

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

  • scrapy自定义Pipline

    第一个事mysql 同步Pipline,适用爬虫量小 异步mysql 的pipline, 适用爬虫量大。 自定义...

  • python爬虫11:gevent queue

    同步和异步的概念 异步:gevent库 多协程,是非抢占式的异步方法,使用多协程,能让多个爬虫用异步方式交替执行多...

  • JavaScript异步编程

    目录 JavaScript采用单线程模式工作的原因 单线程的优势和弊端 同步模式与异步模式同步模式异步模式同步模式...

  • 详解Python分布式爬虫原理及应用——scrapy-redis

    之前写的爬虫,无论是单线程,多线程异步等都是在自己的电脑上运行。好处是单个爬虫方便管理,调试;但当有了大量的URL...

  • 爬虫精进(十) ------ 多协程(爬虫军队)

    要实现异步的爬虫方式的话,需要用到多协程。 一.gevent库 同步的爬虫方式爬取这8个网站 : 程序运行后,你会...

  • python爬虫

    爬虫分为多线程,单线程爬虫,其中单线程爬虫的步骤主要分成三部分. 第一部分:读取目标网页的内容,如果遇到多个网址,...

  • Python网络爬虫的同步和异步

    一、同步与异步 模板 tips:await表达式中的对象必须是awaitablerequests不支持非阻塞aio...

  • Python网络爬虫的同步和异步

    一、同步与异步 模板 tips: await表达式中的对象必须是awaitable requests不支持非阻塞 ...

  • Python异步

    multiprocessing中Pool实现异步# 关于异步与同步可以做一个例子来解释一下。 拿爬虫为例,目前需要...

网友评论

      本文标题:异步爬虫和同步单线程爬虫对比

      本文链接:https://www.haomeiwen.com/subject/hnztgktx.html