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

相关推荐
嘘神秘用5 小时前
布:AI 驱动的 Redis 客户端,更快、更直观
数据库·人工智能·redis
我是坏垠6 小时前
Crypto、Cipher与Password:Java加密开发的三个核心概念
java·开发语言·python
white_ant7 小时前
JDK LTS 版本升级迁移注意事项大全
java·开发语言
Bobolink_7 小时前
跨境业务网络环境评估,“干净、一致、独享”三个关键指标
开发语言·网络·php·跨境网络·网络环境
你怎么知道我是队长7 小时前
JavaScript的变量和数据类型介绍
开发语言·javascript·ecmascript
东北小狐狸-Hellxz7 小时前
Redis 哨兵搭建+ACL权限控制
数据库·redis
xingke7 小时前
C 语言多文件编程:(一)头文件、extern、编译链接
c语言·开发语言·多文件
测试秃头怪7 小时前
如何评估自动化测试脚本的编写时间和维护工作量?
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
姚青&8 小时前
测试左移体系
python·自动化
技术民工之路8 小时前
Python Socket编程零基础实战教程(TCP/UDP通信完整版)
python·tcp/ip·udp