怎么爬取网站上的数据(高效率异步爬虫)

协程(本节的概念需要重点理解和实际操作)我们需要安装asynico库:pip install asyncio学习之前我们先来看下这段代码:import time

def get_request(url):
print('正在请求的url:', url)
time.sleep(2)
print('请求结束:', url)
return 'bono'

if __name__ == '__main__':
get_request('www.1.com')运行后,我们可以看到,结果会先打印第一段,2秒后打印了第二段。我们再来看一个特殊的函数。为什么叫它特殊函数呢?因为它比普通的函数多了一个async关键词修饰import time

async def get_request(url):
print('正在请求的url:', url)
time.sleep(2)
print('请求结束:', url)

if __name__ == '__main__':
get_request('www.1.com')运行特殊的函数,我们发现并没有打印我们想要的结果!特殊的函数:如果一个函数的定义被async修饰后,则该函数就变成了一个特殊的函数特殊之处:该特殊的函数调用后,函数内部的实现语句不会被立即执行该特殊函数被调用后会返回一个协程对象协程对象:对象。通过特殊函数的调用返回一个协程对象# c就是一个协程对象
c = get_request('www.1.com')于是我们得知:协程 == 特殊函数 == 一组制定的操作协程 == 一组制定的操作任务对象我们再来看一个概念:任务对象任务对象就是一个高级的协程对象,(任务对象就是对协程对象的进一步封装)既然是封装,那么还是协程对象。于是我们得知:任务 == 协程 == 特殊函数 == 一组指定操作任务 == 一组制定的操作那么我们该如何创建一个任务对象:asyncio.ensure_future(协程对象)if __name__ == '__main__':
# c就是一个协程对象
c = get_request('www.1.com')

# 任务对象task 就是对协程对象的进一步封装
task = asyncio.ensure_future(c)任务对象的高级之处:可以给任务对象绑定回调:task.add_done_callback(task_callback)回调函数的调用时机:任务被执行结束后,才可以调用回调函数回调函数的参数只可以有一个:表示的就是该回调函数的调用者(任务对象)使用回调函数的参数调用result() 返回的就是任务对象表示的特殊函数return结果import asyncio
import time

async def get_request(url):
print('正在请求的url:', url)
time.sleep(2)
print('请求结束:', url)
return 'bono'

# 回调函数的封装
# 参数t:就是该回调函数的调用者(任务者:task任务)
def task_callback(t):
print('I am task_callback(),参数t:', t)
# result返回的就是特殊函数的返回值
print('t.result()返回的是:', t.result())

if __name__ == '__main__':
# c就是一个协程对象
c = get_request('www.1.com')

# 任务对象就是对协程对象的进一步封装
task = asyncio.ensure_future(c)
# 给task绑定一个回调函数
task.add_done_callback(task_callback)此时还是没有结果的。事件循环对象也是一个对象。作用:可以将多个任务对象注册/装载到事件循环对象中如果开启了事件循环后,则其内部注册/装载的任务对象表示的指定操作就会被基于异步的被执行(开始执行)创建方式:loop = asyncio.get_event_loop()注册且启动方式:loop.run_until_complete(task)# 创建事件循环对象
loop = asyncio.get_event_loop()
# 将任务对象注册到事件循环中且开启事件循环
loop.run_until_complete(task)以上就是这三个步骤:创建协程对象,创建任务对象+回调函数,创建事件循环对象。我们来看下完整代码:import asyncio
import time

async def get_request(url):
print('正在请求的url:', url)
time.sleep(2)
print('请求结束:', url)
return 'bono'

# 回调函数的封装
# 参数t:就是该回调函数的调用者(任务者)
def task_callback(t):
print('I am task_callback(),参数t:', t)
# result返回的就是特殊函数的返回值
print('t.result()返回的是:', t.result())

if __name__ == '__main__':
# c就是一个协程对象
c = get_request('www.1.com')

# 任务对象就是对协程对象的进一步封装
task = asyncio.ensure_future(c)
# 给task绑定一个回调函数
task.add_done_callback(task_callback)
# 创建事件循环对象
loop = asyncio.get_event_loop()
# 将任务对象注册到事件循环中且开启事件循环
loop.run_until_complete(task)运行结果如下:概念是比较抽象的!但写一个协程很简单,就是上述三个步骤!关注 Python涛哥!学习更多Python知识!


本文出自快速备案,转载时请注明出处及相应链接。

本文永久链接: https://www.xiaosb.com/beian/44127/