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)返回值的内容。

相关推荐
秋月的私语3 分钟前
遥感影像拼接线优化工具:基于Qt+GDAL+OpenCV的从零到一实践
开发语言·qt·opencv
正在走向自律8 分钟前
企业级数据库行标识技术深度解析:OID与ROWID的双轨架构实战
数据库·oracle·oid·rowid
xwz小王子12 分钟前
智元发布 GO-2:动作空间推理 + 全生命周期闭环,让机器人稳定可靠落地
开发语言·golang·机器人
charlie11451419112 分钟前
通用GUI编程技术——图形渲染实战(二十八)——图像格式与编解码:PNG/JPEG全掌握
开发语言·c++·windows·学习·图形渲染·win32
PD我是你的真爱粉12 分钟前
向量数据库原理与检索算法入门:ANN、HNSW、LSH、PQ 与相似度计算
数据库·人工智能·算法
ZC跨境爬虫12 分钟前
批量爬取小说章节并优化排版(附完整可运行脚本)
前端·爬虫·python·自动化
不爱吃大饼13 分钟前
redis主从节点
数据库·redis·bootstrap
ths51214 分钟前
Python 正则表达式实战指南:从入门到精通(12 个高频案例)(三)
python·正则表达式
ZC跨境爬虫15 分钟前
海南大学交友平台登录页开发实战day4(解决python传输并读取登录信息的问题)
开发语言·前端·python·flask·html
Wyawsl16 分钟前
Python操作MySQL数据库
数据库·python·mysql