前阵子,偶然闻同学道,想从某某网站爬取几十万条数据来做数据分析,可是速度实在太慢,为此甚是发愁。。。其实可以提速爬虫的方法常见有多线程,多进程,异步协程等,而小编要说的就是异步协程为爬虫提速!

爬虫之所以慢,往往是因为程序等待IO而被阻塞,比如爬虫中常见的阻塞有:网络阻塞,磁盘阻塞等;细点再来讲网络阻塞,假如用requests来进行请求,如果网站的响应速度过慢,程序一直等待在网络响应,最后就导致爬虫效率极其低下!

那么何为异步爬虫呢?

通俗来讲就是:当程序检测到IO阻塞,就会自动切换到程序的其他任务,这样把程序的IO降到最低,程序处于就绪状态的任务就会增多,以此对操作系统瞒天过海,操作系统便以为程序IO较少,从而尽可能多的分配CPU,达到提升程序执行效率的目的。

一,协程

import asyncio
import timeasync def func1():  # asnyc 定义一个协程print('隔壁老王!')await asyncio.sleep(3)  # 模拟阻塞 异步操作  await 将其异步等待print('隔壁老王')async def func2():  # asnyc 定义一个协程print('哈士奇')await asyncio.sleep(2)  # 模拟阻塞 异步操作  await 将其异步等待print('哈士奇')async def func3():  # asnyc 定义一个协程print('阿拉斯加')await asyncio.sleep(1)  # 模拟阻塞 异步操作  await 将其异步等待print('阿拉斯加')async def main():tasks = [  # tasks:任务,它是对协程对象的进一步封装,包含了任务的各个状态asyncio.create_task(func1()),asyncio.create_task(func2()),asyncio.create_task(func3()),]await asyncio.wait(tasks)if __name__ == '__main__':start_time = time.time()asyncio.run(main())  # 一次性启动多个任务(协程)print('程序总耗时\033[31;1m%s\033[0ms' % (time.time() - start_time))

二,异步请求aiohttp及异步写入aiofiles

随便在网上拿几张图片链接地址作为练习

import aiohttp
import aiofiles
import asyncio
import osif not os.path.exists('./Bantu'):os.mkdir('./Bantu')async def umei_picture_download(url):name = url.split('/')[-1]picture_path = './Bantu/' + nameasync with aiohttp.ClientSession() as session:  # aiohttp.ClientSession() 相当于 requestsasync with session.get(url) as resp:  # 或session.post()异步发送# resp.content.read()读二进制(视频,图片等),resp.text()读文本,resp.json()读jsondown_pict = await resp.content.read()  # resp.content.read()相当于requests(xxx).contentasync with aiofiles.open(picture_path, 'wb') as f:  # aiofiles.open() 异步打开文件await f.write(down_pict)  # 写入内容也是异步的,需要挂起print('爬取图片完成!!!')async def main():tasks = []for url in urls:tasks.append(asyncio.create_task(umei_picture_download(url)))await asyncio.wait(tasks)if __name__ == '__main__':urls = ['https://tenfei02.cfp.cn/creative/vcg/veer/1600water/veer-158109176.jpg','https://alifei03.cfp.cn/creative/vcg/veer/1600water/veer-151526132.jpg','https://tenfei05.cfp.cn/creative/vcg/veer/1600water/veer-141027139.jpg','https://tenfei03.cfp.cn/creative/vcg/veer/1600water/veer-132395407.jpg']# asyncio.run(main())loop = asyncio.get_event_loop()  # get_event_loop()方法创建了一个事件循环looploop.run_until_complete(main())  # 调用了loop对象的run_until_complete()方法将协程注册到事件循环loop中,然后启动

三,异步协程半秒扒光一本小说

粗柳簸箕细柳斗,谁嫌爬虫男人丑 之 异步协程半秒扒光一本小说相关推荐

  1. 爬虫的单线程+多任务异步协程:asyncio 3.6

    单线程+多任务异步协程:asyncio 3.6 事件循环 无限循环的对象.事件循环中最终需要将一些 特殊的函数(被async关键字修饰的函数) 注册在该对象中. 协程 本质上是一个对象.可以把协程对象 ...

  2. python爬虫 单线程的多任务异步协程

    在input().sleep(2).request.get()等时,都会导致线程阻塞,协程可以解决IO等操作时的阻塞现象,提高CPU利用效率. 1.单线程的多任务异步协程 main.py " ...

  3. Python高并发爬虫测评(2): 多进程, 多线程和异步协程哪个快?

    在Python爬虫下一代网络请求库httpx和parsel解析库测评一文中我们对比了requests的同步爬虫和httpx的异步协程爬虫爬取链家二手房信息所花的时间(如下所示:一共580条记录),结果 ...

  4. python获取get请求的耗时时间_突破python爬取极限,超牛逼的异步协程爬虫

    异步协程 1. event_loop 2. coroutine 中文翻译叫协程,在 Python 中昌指代为协程对象类型,可以将协程对象注册到时间循环中被调用.使用 async 关键字来定义的方法在调 ...

  5. 10-异步爬虫(线程池/asyncio协程)实战案例

    异步爬虫: 基于线程池 基于单线程+多任务的异步爬虫 线程池 from multiprocessing.dummy import Pool map(callback,alist) 可以使用callba ...

  6. 超牛逼的异步协程爬虫

    写在前面: 本来这篇文章只是用来记录一下学习异步协程爬虫的笔记,感谢CSDN的大力支持,引来了很多关注和浏览,也有很多大佬的批评指针. 事先声明:本文只是学习使用,在爬虫的实战应用中还要添加诸多限制, ...

  7. python爬虫 asyncio aiohttp aiofiles 单线程多任务异步协程爬取图片

    python爬虫 asyncio aiohttp aiofiles 多任务异步协程爬取图片 main.py """=== coding: UTF8 ==="&q ...

  8. 爬虫第四章 单线程+多任务异步协程

    单线程+多任务异步协程: asyncio 事件循环 loop: 无限循环的对象,事件循环中最终需要将一些特殊的函数注册到该事件循环中特殊的函数: 被ansyc关键字修饰的函数协程: 本质上是一个对象, ...

  9. python 异步协程爬虫-半次元图片

    python 异步协程爬虫-半次元图片 1. 页面分析 2.代码大体构思 3.源码分析 3.1 完成效果 4.异步协程的优势 5.难点分析 6.可扩展性 欢迎私信或评论区交流 爬取网址 : https ...

  10. 5 爬虫 异步协程 梨视频

    # 如何提升requests模块爬取数据的效率?- 多进程或多线程(不建议) 太耗费资源- 线程池或进程池(适当使用) - 单线程 + 异步协程(推荐) # 线程池使用案例 # 梨视频 下载作业 im ...

最新文章

  1. 登陆成功率 99%,云知声携手平安好医生推声纹登录系统
  2. 【 C 】关于相邻字符串常量自动合并的标准(新旧标准)(新旧风格)(陷阱)
  3. Visual Studio 2005 2008 2010样式
  4. LinkedBlockingQueue源码
  5. 自己动手写CPU(8)加载存储指令的实现
  6. linux kvm安装win7,ubuntu14.04 使用kvm安装win7系统
  7. xpath helper小工具的安装
  8. Unix/Linux编程:Unix文件系统回顾
  9. ros重置后地址_RouterOS中BGP软重新配置 - ROS软路由论坛 - ROS教程 - RouterOS - ROS之家 - ROS脚本生成器 - Powered by Discuz!...
  10. ##稻盛和夫的名言##
  11. demonstration记忆_怎样快速记单词方法高效记忆单词法
  12. python实现迷宫小游戏(附源码 简单易懂)
  13. 配置 hosts 浏览器访问仍然不生效
  14. body 没有被撑开_div层为什么没有被自动撑开
  15. 货拉拉 Android 动态资源管理系统原理与实践(上)
  16. IDEA中配置Vue启动Configurations
  17. 项目启动成功,但是Eureka页面不显示
  18. webpack打包图片资源问题
  19. ARM汇编语言编程入门实践
  20. linux系统:rm-rf执行以后,怎么办?我来教你恢复文件

热门文章

  1. 树莓派CM4_Tiny(双HDMI)扩展板基于Retropie的游戏配置操作演示
  2. 淘宝原数据商品详情API调用示例
  3. 夜神模拟器 Nox Player 雷电模拟器 掉线 连不上 运行不显示的解决方案
  4. Unity学习笔记——TimeLine的简单使用方法(一)
  5. Hashmasks背后的故事:以太坊上最牛艺术品诞生之路
  6. Kafka学习征途:不再依赖ZK的KRaft
  7. c语言切蛋糕问题程序设计报告,c语言切蛋糕问题,问题如图。望大神指教。
  8. 解决Page index must not be less than zero问题
  9. ORA-01790: expression must have same datatype as corresponding expression
  10. Linux机器24项安全合规设置