单线程+多任务异步协程: asyncio

事件循环 loop: 无限循环的对象,事件循环中最终需要将一些特殊的函数注册到该事件循环中特殊的函数: 被ansyc关键字修饰的函数协程: 本质上是一个对象,可以把协程对象注册到事件循环中,任务对象:就是对协程对象进一步的封装.绑定回调函数(即在执行完特殊函数之后执行这个回调函数):task.add_done_callback(func)- func(task) :task 参数表示的就是绑定的任务对象- task.result()  返回的就是任务对象对应的特殊函数内部的返回值- 回调函数 多被用作爬虫的解析方法(就是标签定位和解析数据)await: 在执行任务函数的时候,如果出现了阻塞,则必须在前面加一个await进行修饰

异步操作的体现:

  当将多个协程对象注册到事件循环中后,事件循环开启时,则会循环执行其内部的协程对象.

  假如事件循环对象在执行某一个协程对象时,发生了阻塞,则事件循环会执行下一个协程对象

aiohttp模块: 支持异步的网络请求模块  查看中文文档 点击这里

环境安装: aiohttp
如何进行UA伪装:session.get(url=url,headers=headers)
参数的伪装:session.get(url=url ,headers=headers ,data/params)
代理ip:session.get(url=url,headers=headers,proxy='http://代理ip:代理端口')

 实例 : 爬取喜马拉雅郭德纲的相声

import requests
import asyncioimport aiphttp

url = 'https://www.ximalaya.com/revision/play/album?albumId=19366477&pageNum=1&sort=1&pageSize=2'headers={    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'    }

url_list=[]

#从url中获取到每一个音频文件的数据(这里我们要将这个协程对象包装成任务对象)async def get_audio_data(url):  #这里的这个aiphttp.ClientSession()就相当于实例化一个requests对象(可以发送网络请求的对象)  async with aiphttp.ClientSession() as session:    #通过这个session对象发送get请求获取到响应数据    async with await session.get(url=url,headers=headers) as response:      #将响应数据的格式转化为2进制流的形式      audio_data=await response.read()  # read是aiphttp中获取2进制流的方法      return {'data':audio_data,'url':url} 

def save_data(task):  audio_data = task.result()  name = audio_data['url'].split('/')[-1]  data = audio_data['data']  with open(name,'wb') as fp:    fp.write(data)  print(name,'下载成功!!')

page_text = requests.get(url=url,headers=headers).json()#从页面数据中找到所有的url,并将它们添加到url_list中for dic in page_text['data']['trackAudioPlay']:  audio_url=dic['src']  url_list.append(audio_url)

task_list = []for url in url_list:  #创建协程对象  audio_data = get_audio_data(url)  #将协程对象包装成任务对象  task = asyncio.ensure_future(audio_data)  #绑定回调函数  async.add_done_callback(save_data)  #这里我们添加到列表中是为了下面的异步执行任务对象做准备  task_list.append(task)

#创建事件循环对象loop = asyncio.get_event_loop()#将任务对象列表放到事件循环中,实现异步效果(将任务对象注册到事件循环中,并执行事件循环)loop.run_until_complate(asyncio.wait(tasks))

执行步骤:

       先从大的url中获取到每一个音频的url,将他们添加到一个列表中,然后逐个对这个列表发送请求,获取到每一个页面数据,通过解析获取到音频的数据,然后创建协程对象,将协程对象包装成任务对象(async),然后给每一个任务对象添加回调函数(在这里回调函数的作用就是保存数据),然后将所有的任务对象都添加到一个列表中,然后创建事件循环对象(asyncio.get_event_loop()),将之前弄好的那个任务对象列表放到这个事件循环对象中(loop.run_util_complate()),就实现了异步执行的效果.

这里总结一下这里的注意事项:

在封装任务对象的时候,前面加上async 就行,但是要注意,函数内部不允许出现不支持异步代码的模块,还有函数内部中的所有阻塞操作必须使用await进行修饰;requests模块就是不支持异步代码的模块,解决方法就是使用支持异步代码的模块(aiohttp模块);任务对象就是用async修饰的函数,回调函数就是一个普通的函数;

  

转载于:https://www.cnblogs.com/zty1304368100/p/11025262.html

爬虫第四章 单线程+多任务异步协程相关推荐

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

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

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

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

  3. 11 单线程+多任务异步协程 爬虫

    # from lxml import etree import asyncio import aiohttp import time def callback(task): # 回调函数page = ...

  4. 小爬爬4.协程基本用法多任务异步协程爬虫示例(大数据量)

    1.测试学习 (2)单线程: from time import sleep import time def request(url):print('正在请求:',url)sleep(2)print(' ...

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

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

  6. python爬虫02-提升爬取效率、多线程,多线程传参,多进程,线程及线程池概念,协程,多任务异步协程,异步请求aiohttp模块,视频站工作原理

    1.提升爬取效率 使用多线程,多进程,携程,异步 2.多线程 进程是资源单位,每个进程,都会有一个默认的主线程 线程是执行单位 执行多线程需要导包: from threading import Thr ...

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

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

  8. Python分别用单线程,多线程,异步协程爬取一部小说,最快仅需要5s

    文章目录 单线程爬取 多线程爬取 异步协程爬取 本文运用了三种方式爬取一整部小说,分别运用了单线程爬取,多线程爬取和异步协程爬取. 小说网址:` http://www.doupo321.com/dou ...

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

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

最新文章

  1. 斯坦福大学报告称中国AI论文引用率首超美国!但李国杰院士也发文灵魂拷问...
  2. Javascript 的addEventListener()及attachEvent()区别分析
  3. Android 开发常用代码片段
  4. Spring源码编译及过程中的一些问题总结
  5. 颠覆性Windows平台资源管理器,急速管理文件----闪电人生
  6. JavaScript——String转DOM对象解决方案
  7. SIFT算法原理(不带公式)
  8. xcode中工程引用设置
  9. python坐标轴刻度设置对数_用对数刻度设置刻度
  10. C++ 基类和派生类的构造函数
  11. 阿里第二代微服务强势崛起,你还敢往简历上写“精通”吗?
  12. Web应用启动时,后台自动启动一个线程
  13. Mysql数据库性能优化配置:my.cnf/my.ini配置说明详解(测试机器为16GB内存)
  14. matlab 分式拟合,如何用matlab拟合微分方程
  15. matlab如何做小波包去噪,小波去噪和小波包去噪的对比.doc
  16. 三向振动台的计算机辅助测试实验分析原因,振动试验原理及试验考虑的条件
  17. 【Unity3D】分离路面导航
  18. android hci设备,android-hci相关操作
  19. 帮你举例说明什么是Python鸭子类型
  20. OA是什么意思?什么是OA? OA系统是什么?

热门文章

  1. MySQL中table_schema的基本操作
  2. linux yum坏了怎么办,yum坏掉的解决
  3. unity图片变成马赛克如何取像素并改变颜色_Unity3D-2.5D像素游戏随机地形构造tilemap(rule tile)...
  4. html在线拖拽环绕,用HTML5原生实现拖放或排序
  5. java 线程重入,java synchronized加载加锁-线程可重入详解及实例代码
  6. win10 休眠设置无效_睡眠模式在Windows 10系统上不起作用?
  7. @RequestParam注解用法
  8. 服务器系统是指什么,服务器操作系统指的是什么
  9. java map集合使用_JAVA中Map集合的使用举例
  10. python 输入中文_【提醒】Python新手开发人员注意事项:不要误输入中文标点符号...