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

相关推荐
科技小花2 小时前
全球化深水区,数据治理成为企业出海 “核心竞争力”
大数据·数据库·人工智能·数据治理·数据中台·全球化
X56614 小时前
如何在 Laravel 中正确保存嵌套动态表单数据(主服务与子服务)
jvm·数据库·python
FQNmxDG4S4 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
ZhengEnCi4 小时前
03ab-PyTorch安装教程 📚
python
前端老石人4 小时前
HTML 字符引用完全指南
开发语言·前端·html
matlab_xiaowang4 小时前
Redux 入门:JavaScript 可预测状态管理库
开发语言·javascript·其他·ecmascript
狐狐生风5 小时前
LangChain 向量存储:Chroma、FAISS
人工智能·python·学习·langchain·faiss·agentai
虹科网络安全5 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
狐狐生风5 小时前
LangChain RAG 基础
人工智能·python·学习·langchain·rag·agentai
2301_771717215 小时前
解决mysql报错:1406, Data too long for column
android·数据库·mysql