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

单线程+多任务异步协程: 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

时间: 2024-10-04 15:28:51

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

单线程多任务异步协程

目录  1. 概念讲解 2. 多任务异步协程理解 3.基于aiohttp模块异步网络请求实现数据爬取及数据解析 一.需要了解的概念 特殊函数:如果async修饰了一个函数的定义,那么该函数就变成了一个特殊函数, 特殊之处:特殊函数被调用后函数内部实现语句不会被立即执行 该函数调用之后会返回一个协程对象 协程对象:特殊函数调用后可以返回一个协程对象 协程 == 特殊函数 任务对象:对协程对象的进一步封装,就是一个高级协程对象 任务对象 == 协程对象 == 特殊的函数 绑定回调:task.add_

单线程实现了多任务异步协程

单线程+多任务异步协程: 意义:提升爬取数据的效率,我们也可以使用线程池, 异步爬虫方式: 多线程/多进程(电脑吃不消,没办法无节制开启)不建议 池:池中的线程或进程也是无法任意开启. 单线程+多任务异步协程(推荐)(500个协程,最优) 概念: 协程:本质就是一个对象,协程对象,怎么去获取?可以使用asynic该关键字去修饰一个函数定义,此时的函数就叫它特殊函数,当该特殊函数被调用之后,就可以返回一个协程对象,特殊之处不仅仅是返回一个协程对象,当函数内部实现的语句不会被立即执行(时间循环开启后

python爬虫--多任务异步协程, 快点,在快点......

多任务异步协程asyncio 特殊函数: - 就是async关键字修饰的一个函数的定义 - 特殊之处: - 特殊函数被调用后会返回一个协程对象 - 特殊函数调用后内部的程序语句没有被立即执行 - 协程 - 对象.协程==特殊的函数.协程表示的就是一组特定的操作. - 任务对象 - 高级的协程(对协程的进一步的封装) - 任务对象==协程==特殊的函数 - 任务对象==特殊的函数 - 绑定回调: - task.add_done_callback(task) - 参数task:当前回调函数对应的任务

多任务异步协程,asyncio及aiohttp

要实现异步协程,需要满足几个条件: 1,创建协程对象,且协程内部操作需要支持异步. 2,创建任务对象,如需为协程执行结果进行进一步处理,则需要为任务对象绑定回调函数. 3,创建事件循环,并将任务启动. 1 import asyncio 2 import requests 3 from lxml import etree 4 import aiohttp 5 import os 6 7 headers = { 8 9 'User-Agent': 'Mozilla/5.0 (Windows NT 1

06爬虫-异步协程

1. 前言(目的就是大大提升爬虫效率) 在执行IO密集型任务的时候,代码常常遇到IO操作而等待.例如我们在爬虫的时候,用到requests请求的时候,网页响应慢,一直等待着,那么爬虫的效率会大大的降低. 为了解决这类问题,本文就来探讨一下 Python 中异步协程来加速的方法,此种方法对于 IO 密集型任务非常有效.如将其应用到网络爬虫中,爬取效率甚至可以成百倍地提升. 注:本文协程使用 async/await 来实现,需要 Python 3.5 及以上版本. 2. 基本了解 在了解异步协程之前

单线程+异步协程

event_loop:事件循环,相当于一个无限循环(不清楚循环多少次),我们可以把一些特殊函数注册(放置)到这个事件循环上,当满足某些条件的时候,函数就会被循环执行.程序是按照设定的顺序从头执行到尾,运行的次数也是完全按照设定.当在编写异步程序时,必然其中有部分程序的运行耗时是比较久的,需要先让出当前程序的控制权,让其在背后(挂起)运行,让另一部分的程序先运行起来.当背后运行的程序完成后,也需要及时通知主程序已经完成任务可以进行下一步操作,但这个过程所需的时间是不确定的,需要主程序不断的监听状态

爬虫 + 数据分析 - 4 异步协程, selenium使用, 自动登录

一.单线程+异步协程 1.基本概念: event_loop:事件循环,相当于一个无限循环,我们可以把一些特殊函数注册(放置)到这个事件循环上, 当满足某些条件的时候,函数就会被循环执行.程序是按照设定的顺序从头执行到尾,运行的次数也是完全按照设定. 当在编写异步程序时,必然其中有部分程序的运行耗时是比较久的,需要先让出当前程序的控制权,让其在背后运行, 让另一部分的程序先运行起来.当背后运行的程序完成后,也需要及时通知主程序已经完成任务可以进行下一步操作, 但这个过程所需的时间是不确定的,需要主

单线程多任务异步抓取(asyncio)

协程 import asyncio import time #定义了一个特殊的函数 #特殊:调用后会返回一个协程对象,且函数内部的实现语句不会被立即执行 #创建一个协程对象 # async def test(num): # print(num) # # c = test(10) # print(c) #封装一个任务对象 # async def test(num): # print(num) # # c = test(10) # #根据协程对象封装了一个任务对象 # task = asyncio.

爬虫速度太慢?来试试用异步协程提速吧!

1. 前言 在执行一些 IO 密集型任务的时候,程序常常会因为等待 IO 而阻塞.比如在网络爬虫中,如果我们使用 requests 库来进行请求的话,如果网站响应速度过慢,程序一直在等待网站响应,最后导致其爬取效率是非常非常低的. 为了解决这类问题,本文就来探讨一下 Python 中异步协程来加速的方法,此种方法对于 IO 密集型任务非常有效.如将其应用到网络爬虫中,爬取效率甚至可以成百倍地提升. 注:本文协程使用 async/await 来实现,需要 Python 3.5 及以上版本. 2.