异步爬虫

Posted freedom0923

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异步爬虫相关的知识,希望对你有一定的参考价值。

协程的基本使用asyncio

  • 特殊的函数
    • 一个函数表示一组指定的操作。
    • 如果一个函数的定义被async关键字修饰后,则该函数就变成了一个特殊的函数。
    • 特殊之处:
      • 当特殊的函数被调用函数内部的实现语句不会被立即执行。
      • 这个特殊函数被调用后会给我们返回一个协程对象。
  • 协程
    • 对象。协程对象 == 特殊函数 == 一组指定的操作
    • 协程 == 一组指定的操作
  • 任务
    • 任务对象。所谓任务对象就是对协程对象进一步的封装。
      • 任务对象 == 高级协程对象 == 特殊函数
      • 任务对象 == 特殊函数 == 一组指定的操作
    • 给任务对象绑定回调:
      • task.add_done_callback(func)
  • 事件循环(核心)
    • 一个容器对象。这个对象需要装载一个或者多个任务对象。生成的任务对象必须注册或者装载到事件循环对象中,然后如果事件循环对象启动后,就可以异步的将其内部装载的任务对象进行异步执行。
import asyncio
from time import sleep
#回调函数必须要有一个参数,表示的就是add_done_callback方法的调用者,就是任务对象本身
def callback(task):
    print(‘i am callback!,参数task=‘,task)
    print(task.result()) #获取特殊函数内部的返回值
#无法获取特殊函数内部的返回值
async def get_request(url):
    print(‘正在下载:‘,url)
    sleep(2)
    print(‘下载完成,‘,url)
    return url
#创建事件循环对象
c = get_request(‘www.baidu.com‘)
task = asyncio.ensure_future(c) #获得了一个任务对象
#给任务对象绑定回调函数
task.add_done_callback(callback)
#事件循环对象目前是独立于协程和任务对象
loop = asyncio.get_event_loop() #创建了一个事件循环对象
#将任务对象注册装载到事件循环对象中并且启动事件循环对象
loop.run_until_complete(task)
  • 通过给任务对象绑定回调的方式获取特殊函数内部的返回值
    • 回调函数的参数表示的就是任务对象本身
    • task.result()返回的就是特殊函数内部的返回值

以上是关于异步爬虫的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫--高性能的异步爬虫

06爬虫-异步协程

(转)新手写爬虫v2.5(使用代理的异步爬虫)

Ruia异步爬虫框架快速开始教程

爬虫日记(105):Twisted:怎么样处理一个函数同步代码返回和异步对象返回

[python]新手写爬虫v2.5(使用代理的异步爬虫)