Python 的七个HTTP请求库对比小结
作者:wusp1994
本文主要介绍了Python 的七个HTTP请求库对比小结,文中通过图表,示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Python HTTP请求库对比
库名称 | 特点 | 优点 | 缺点 |
---|---|---|---|
requests | 简单易用的HTTP库,基于urllib3 。 | - 语法简洁 - 社区支持强大 - 易于上手和维护 | - 阻塞式调用,不支持异步操作 - 相比 aiohttp 体积较大 |
http.client | Python标准库中的低级HTTP库。 | - 无需安装第三方库 - 提供底层访问,可自定义程度高 | - API使用相对复杂 - 缺少高级HTTP功能 |
aiohttp | 异步的HTTP网络通信库,支持HTTP/1.1和HTTP/2。 | - 支持异步操作,适合高并发 - 支持WebSockets | - 异步编程模型学习曲线陡峭 - 较新,社区支持不如 requests |
urllib | Python标准库,提供URL处理。 | - 无需安装第三方库 - 功能全面,包括请求和错误处理 | - 易用性不如requests - 不支持异步操作 |
httpx | 支持HTTP/1.1和HTTP/2的异步HTTP库。 | - 支持同步和异步请求 - 支持HTTP/2 - 可扩展性好 | - 相对于requests ,知名度和社区支持较小 |
treq | 基于Twisted 的异步HTTP客户端,使用requests 的API风格。 | - 异步操作 - 与 requests 类似的API- 适用于 Twisted 用户 | - 依赖于Twisted 框架- 社区支持有限 |
requests-toolbelt | requests 的官方扩展,提供额外功能。 | - 增加requests 没有的功能- 流式上传下载支持 | - 作为扩展,需要与requests 结合使用- 功能较为特定 |
在选择库时,应该考虑以下因素:
- 项目需求:是否需要异步支持,是否处理大量并发请求。
- 易用性:API的简洁性和学习曲线。
- 社区和文档:活跃的社区和详尽的文档可以加快开发速度。
- 性能:不同库在不同场景下的性能表现。
- 兼容性:是否支持需要的HTTP特性,如HTTP/2或WebSockets。
实战请求豆瓣排行榜
curl ^"https://movie.douban.com/j/chart/top_list_count?type=11&interval_id=100^%^3A90&action=^" ^ -H "Accept: */*" ^ -H "Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7" ^ -H "Connection: keep-alive" ^ -H ^"Cookie: ll=^\^"118282^\^"; bid=p6VTwxlhQxU; _pk_id.100001.4cf6=1960560bd6f348cf.1717555113.; __utmc=30149280; __utmc=223695111; __yadk_uid=vu9yRywnfgofYdkNxlDGN1LGZumZZlP3; _vwo_uuid_v2=DB54A160968C09D586B65593E774AC10A^|93b3f99adf2e8bfe6ce4a84c068e3f82; _pk_ref.100001.4cf6=^%^5B^%^22^%^22^%^2C^%^22^%^22^%^2C1717727676^%^2C^%^22https^%^3A^%^2F^%^2Fwww.heywhale.com^%^2F^%^22^%^5D; push_noty_num=0; push_doumail_num=0; __utmv=30149280.19806; __utma=30149280.912128761.1717555113.1717725025.1717728345.3; __utmz=30149280.1717728345.3.2.utmcsr=google^|utmccn=(organic)^|utmcmd=organic^|utmctr=(not^%^20provided); __utma=223695111.1475293929.1717555113.1717727676.1717728345.4; __utmz=223695111.1717728345.4.2.utmcsr=google^|utmccn=(organic)^|utmcmd=organic^|utmctr=(not^%^20provided)^" ^ -H ^"Referer: https://movie.douban.com/typerank?type_name=^%^E5^%^89^%^A7^%^E6^%^83^%^85&type=11&interval_id=100:90&action=^" ^ -H "Sec-Fetch-Dest: empty" ^ -H "Sec-Fetch-Mode: cors" ^ -H "Sec-Fetch-Site: same-origin" ^ -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" ^ -H "X-Requested-With: XMLHttpRequest" ^ -H ^"sec-ch-ua: ^\^"Google Chrome^\^";v=^\^"125^\^", ^\^"Chromium^\^";v=^\^"125^\^", ^\^"Not.A/Brand^\^";v=^\^"24^\^"^" ^ -H "sec-ch-ua-mobile: ?0" ^ -H ^"sec-ch-ua-platform: ^\^"Windows^\^"^"
这个curl
命令包含了一个HTTP GET请求,它发送到豆瓣电影的某个API端点,请求某种类型的电影排行数据。请求中包含了多个HTTP头,例如Accept
、Accept-Language
、Connection
、Cookie
、Referer
、Sec-Fetch-*
、User-Agent
、X-Requested-With
和sec-ch-ua
等。这些头信息通常用于控制请求的行为,或者提供客户端环境的额外信息。
以下是使用几种不同的Python HTTP请求库来模拟这个curl
请求的示例:
1. 使用 requests 库
import requests url = "https://movie.douban.com/j/chart/top_list_count?type=11&interval_id=100:90&action=" headers = { "Accept": "*/*", "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", "Connection": "keep-alive", # Cookie 头过长,需要按实际值填充 # ... "Referer": "https://movie.douban.com/typerank?type_name=剧情&type=11&interval_id=100:90&action=", # 其他 headers 按需填充 # ... "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers) print(response.text)
2. 使用 aiohttp 库(异步)
import aiohttp import asyncio async def fetch(url, headers): async with aiohttp.ClientSession() as session: async with session.get(url, headers=headers) as response: return await response.text() url = "https://movie.douban.com/j/chart/top_list_count?type=11&interval_id=100:90&action=" headers = {...} # 同上 loop = asyncio.get_event_loop() html = loop.run_until_complete(fetch(url, headers)) print(html)
3. 使用 http.client(Python 标准库)
import http.client import urllib.parse conn = http.client.HTTPSConnection("movie.douban.com") # 将参数编码为URL params = urllib.parse.urlencode({ 'type': '11', 'interval_id': '100:90', 'action': '' }) url = f"/j/chart/top_list_count?{params}" headers = { # 同上 } conn.request("GET", url, headers=headers) response = conn.getresponse() data = response.read() print(data.decode('utf-8')) conn.close()
注意事项
- 由于
Cookie
和其他一些headers可能非常长,这里没有完全展示它们的值。在实际使用中,你需要将它们完整地填入headers字典中。 - 在
requests
示例中,我们使用同步方式发送请求并打印响应内容。 - 在
aiohttp
示例中,我们使用异步方式发送请求。aiohttp
是处理并发请求的好选择,特别是在需要处理大量网络I/O操作时。 - 在
http.client
示例中,我们使用了Python标准库中的低级HTTP客户端。这种方式比较繁琐,但它不依赖于任何外部库。
根据你的需求和偏好,选择最适合你的库来执行HTTP请求。如果你需要处理大量并发请求,可能会倾向于使用aiohttp
。如果你需要简单快速地发起请求,并且不想引入额外的依赖,可能会选择requests
。如果你正在编写一个需要精细控制网络层面的底层应用,可能会选择http.client
。
到此这篇关于Python 的七个HTTP请求库对比小结的文章就介绍到这了,更多相关Python HTTP请求库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!