← 返回

[Muxi_k] Python 异步爬虫

1、同步和异步的区别

  • 同步: 所有的操作都做完,才返回给用户。这样用户在线等待的时间太长,给用户一种卡死了的感觉

  • 异步: 不等所有操作做完 ,就返回给用户。操作已经启动程序会将它加到消息队列当中,慢慢执行,不会给用户卡死的感觉

2、使用Asynico 进行异步编程

  • Asynico - 异步 I/O

    • asyncio 是用来编写 并发 代码的库,使用 async/await 语法。

    • asyncio 被用作多个提供高性能 Python 异步框架的基础,包括网络和网站服务,数据库连接库,分布式任务队列等等。

    • asyncio 往往是构建 IO 密集型和高层级 结构化 网络代码的最佳选择。

python 3.5 后才可以使用async/await 语法

异步请求图片示例:

安装异步http 请求库

$ pip install aiohttp
  • 导入 asyncio 以及异步请求aiohttp
 # !/usr/bin/env python
 
 import asyncio
 import aiohttp
  • fetch
 async def fetch(session, url):
     async with session.get(url, headers={
         "referer": "https://www.mzitu.com/",
         "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
         }) as response:
         return await response.read()
 
  • download_image()
async def download_image(url):
    async with aiohttp.ClientSession() as session:
        result = await fetch(session, url)
        with open(url.split("/")[-1], 'wb') as f:
            f.write(result)
        f.close()
  • main()
if __name__ == '__main__':
    
    # 添加多个任务
    tasks = [
            asyncio.ensure_future(download_image("https://csdnimg.cn/cdn/content-toolbar/csdn-logo.png?v=20200416.1")),
            asyncio.ensure_future(download_image("https://csdnimg.cn/public/common/toolbar/images/[email protected]"))
            ]
    # 打开时间循环
    loop = asyncio.get_event_loop()
    
    loop.run_until_complete(asyncio.gather(*tasks))

参考

https://docs.python.org/zh-cn/3/library/asyncio.html

https://docs.aiohttp.org/en/stable/

M

评论

还没有评论,来说第一句吧。

留下评论