python3网络爬虫开发实战 第二版:绑定回调

复制代码
import asyncio
import requests

async def request():
    url = 'https://www.baidu.com'
    status = requests.get(url)  # 同步阻塞的GET请求

    print("This is :",status)
    print("Text is :",status.text)

    return status

def callback(task):
    print('Status:',task.result())

coroutine = request()   # 创建协程对象(此时协程未执行)

task = asyncio.ensure_future(coroutine)     # 将协程包装为Future/Task对象
task.add_done_callback(callback)        # 为任务绑定回调:任务完成后执行callback
print('Task:',task)

loop = asyncio.get_event_loop()     # 获取默认的事件循环对象
loop.run_until_complete(task)       # 启动事件循环,直到task执行完毕
print('Task:',task)

核心理解:requests.get(url) 是什么?

requests.get() 是 Python requests 库提供的同步阻塞式 HTTP GET 请求方法,作用是向指定的 URL 发送 HTTP GET 请求,等待服务器响应并返回一个 Response 响应对象。

结合你的代码分析 requests.get(url)

1. 代码中的执行逻辑

你在异步协程函数 request() 中调用了这行代码:

复制代码
async def request():
    url = 'https://www.baidu.com'
    status = requests.get(url)  # 重点分析这行
    return status
  • 同步特性 :当事件循环驱动协程执行到 requests.get(url) 时,整个程序会阻塞在这里 ------CPU 会一直等待网络请求的往返(从发送请求到收到百度服务器的响应),期间无法做任何其他事,直到拿到响应结果后,才会执行 return status
  • 返回值这行代码的返回值是 requests.models.Response 对象(你代码中赋值给了 status 变量),这个对象包含:
    • 状态码(status_code,比如 200 表示成功);
    • 响应头(headers);
    • 响应内容(text 是网页源码,content 是二进制内容)等。
  • 你后续通过 task.result() 拿到的就是这个 Response 对象,所以回调函数打印的是 <Response [200]>(200 是 HTTP 状态码)。

运行结果:

增加了以下两行代码:

复制代码
print("This is :",status)
    print("Text is :",status.text)

这两行代码测试requests.get(url)返回值的内容。

相关推荐
databook2 分钟前
探索视觉的边界:用 Manim 重现有趣的知觉错觉
python·动效
随逸1774 分钟前
《Milvus向量数据库从入门到实战,手把手搭建语义检索系统》
数据库
神秘的猪头1 小时前
🚀 React 开发者进阶:RAG 核心——手把手带你玩转 Milvus 向量数据库
数据库·后端·llm
明月_清风1 小时前
Python 性能微观世界:列表推导式 vs for 循环
后端·python
明月_清风1 小时前
Python 性能翻身仗:从 O(n) 到 O(1) 的工程实践
后端·python
helloweilei17 小时前
python 抽象基类
python
用户83562907805117 小时前
Python 实现 PPT 转 HTML
后端·python
IvorySQL19 小时前
PostgreSQL 技术日报 (3月6日)|为什么 Ctrl-C 在 psql 里让人不安?
数据库·postgresql·开源
NineData20 小时前
数据库管理工具NineData,一年进化成为数万+开发者的首选数据库工具?
运维·数据结构·数据库