Python HTTP请求库对比,以实战请求豆瓣排行榜为例

简介: 对比了Python的几个HTTP请求库,包括`requests`、`http.client`、`aiohttp`、`urllib`、`httpx`、`treq`和`requests-toolbelt`,各有特点和优缺点。选择时应考虑项目需求(如异步支持)、易用性、社区支持、性能和兼容性。示例展示了如何使用`requests`和`aiohttp`库发送豆瓣电影排行榜的GET请求。

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头,例如AcceptAccept-LanguageConnectionCookieRefererSec-Fetch-*User-AgentX-Requested-Withsec-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

目录
相关文章
|
4天前
|
人工智能 算法 Python
【随手记】python的heapq库的基本用法
【随手记】python的heapq库的基本用法
17 1
|
17小时前
|
数据采集 机器学习/深度学习 数据可视化
利用Python和Pandas库构建高效的数据分析流程
在数据驱动的时代,数据分析已成为企业决策的关键环节。本文介绍如何利用Python编程语言及其强大的数据分析库Pandas,构建一套高效且可扩展的数据分析流程。与常规的数据分析流程不同,本文不仅涵盖数据加载、清洗、转换等基础步骤,还强调数据可视化、模型探索与评估等高级分析技巧,并通过实际案例展示如何在Python中实现这些步骤,为数据分析师提供一套完整的数据分析解决方案。
|
3天前
|
Java 应用服务中间件 API
Tomcat处理一个HTTP请求的执行流程的详细解析
Tomcat处理一个HTTP请求的执行流程的详细解析
13 4
|
2天前
|
开发框架 Python
Python的`pygame`库用于2D游戏开发,涵盖图形、音频和输入处理。
【6月更文挑战第21天】Python的`pygame`库用于2D游戏开发,涵盖图形、音频和输入处理。要开始,先通过`pip install pygame`安装。基本流程包括:初始化窗口、处理事件循环、添加游戏元素(如玩家和敌人)、响应用户输入、更新游戏状态及结束条件。随着项目发展,可逐步增加复杂性。
6 1
|
4天前
|
Python
Python中使用os库管理环境变量
在Python中,可以使用os库来管理操作系统的环境变量。通过os.environ对象,我们可以获取、修改和删除环境变量的值。
11 3
|
4天前
|
机器学习/深度学习 人工智能 自然语言处理
豆瓣评分9.5!清华大牛熬夜整理的Python深度学习教程开发下载!
深度学习目前已经成为了人工智能领域的突出话题。它在“计算机视觉和游戏(AlphaGo)等领域的突出表现而闻名。 今天给小伙伴们分享的这份手册,详尽介绍了用 Python 和 Keras进行深度学习的探索实践,涉及计算机视觉、自然语言处理、生成式模型等应用。
|
4天前
|
存储 JSON JavaScript
Python教程:一文了解Python中的json库
JSON(JavaScript Object Notation)是一种轻量级数据交换格式,易于人类阅读和编写,也易于计算机解析和生成。在Python中,JSON通常用于数据交换和存储,因为它与Python的字典和列表类型相似。
16 2
|
4天前
|
API Python
Python库`openpyxl`是一个用于读取和写入Excel 2010 xlsx/xlsm/xltx/xltm文件的库。
【6月更文挑战第19天】`openpyxl`是Python处理xlsx文件的库,支持读写Excel 2010格式。使用`pip install openpyxl`安装。基本操作包括加载文件、读写单元格、操作行和列。例如,加载Excel后,可以读取单元格`A1`的值,或将“Hello, World!”写入`A1`。还可修改单元格内容,如加1后保存到新文件。更多功能,如样式和公式,见官方文档[1]。 [1]: <https://openpyxl.readthedocs.io/en/stable/>
23 1
|
4天前
|
开发工具 git Python
安装和使用`libnum`是一个用于数字理论函数的Python库
【6月更文挑战第19天】`libnum`是Python的数字理论函数库。安装可通过`git clone`,进入目录后运行`python setup.py install`,也可用`pip install libnum`。示例:使用`int_to_hex`将十进制数42转换为十六进制字符串'2a'。注意,信息可能已过时,应查最新文档以确保准确性。如遇问题,参考GitHub仓库或寻求社区帮助。
15 1
|
3天前
|
安全 搜索推荐
基础入门 HTTP数据包&Postman构造&请求方法&请求头修改&状态码判断
基础入门 HTTP数据包&Postman构造&请求方法&请求头修改&状态码判断