分享

Python第三方库的王者:requests

 编程教室 2025-04-16 发布于江苏

一个月被下载6亿多发,github 5万多star,什么项目的数据这么炸?

说起python第三方库,你最先想到的是哪家?数据分析的pandas?图像处理的pillow?还是用Django来做Web开发?没错,它们都很牛叉,但这个库的下载量竟然比它们都要大。

关注编程教室,学习编程知识,今天我们就来讲讲这个号称“最人性化”的HTTP库--requests

怎么个人性化法?

假如你要通过一个天气API接口获取某个城市的气温变化,用requests来写,仅仅需要这样两行代码:

import requestsr = requests.get('http://api./tq.php?dz=南京')print(r.text)

而其他一些常见的网络请求操作,如:

提交带参数的post请求

修改网页的编码(encoding)

解码json数据

自定义请求头(headers)

添加cookie

设定请求等待时长(timeout)

诸如此类的操作都可以通过requests提供的属性或方法,在一两行代码内轻松拿下。

而想要得到这些,你所要做的仅仅是通过 pip install 安装一下,以及通过官方文档了解模块的使用方法。

pip install requests

你可能要说了,这些难道Python内置的模块不能实现?诶,那倒不至于,只是……没那么方便。

比如,我现在要请求一个:

限制了浏览器类型、需要提交一组参数的POST接口,而返回结果是编码为UTF8的JSON格式数据,另外还做了gzip压缩。

如果用Python默认的库来做,每一步都需要手动来处理,代码比较繁琐。

from urllib.request import Request, urlopenfrom urllib.parse import urlencodeimport gzipimport json
headers = {'User-Agent': 'Chrome'}data = {'username': 'test_user', 'password': '123456'}url = 'https://api./login'
# 编码请求数据data_encoded = urlencode(data).encode('utf-8')# 创建请求对象,设定请求数据、请求头、请求方法req = Request(url, data=data_encoded, headers=headers, method='POST')# 发送请求response = urlopen(req)# 读取返回结果recv_data = response.read()# 对返回结果进行gzip解压if response.getheader("Content-Encoding") == "gzip": recv_data = gzip.decompress(recv_data)# 对返回结果进行UTF-8解码json_string = recv_data.decode('utf-8')# 将返回结果按JSON格式进行解析result = json.loads(json_string)print(result)# 关闭请求response.close()

换成requests,则只需要在post函数中提供字典类型的headers和data参数,就完成了对请求头和数据的设定。而至于返回结果的gzip解压和utf8解码,都会自动帮你搞定。假如编码没有被识别,也只要一个赋值就可以成功运行。

最后再用json函数把结果解析成直接可用的字典类型。开发者省去了很多琐碎的工作,代码量大大减轻。

import requests
headers = {'User-Agent': 'Chrome'}data = {'username': 'test_user', 'password': '123456'}url = 'https://api./login'
# 设定请求数据、请求头,发送POST请求response = requests.post(url, headers=headers, data=data)# 设定返回结果的编码response.encoding = 'utf-8'# 将返回结果按JSON格式进行解析result = response.json()print(result)

更不要说,如果想要实现登录后的状态保持,原本的内置库要用 http.cookiejar 和 urllib.request 配合实现,写出来的代码是这样的:

from urllib.request import build_opener, HTTPCookieProcessor, Requestfrom urllib.parse import urlencodeimport http.cookiejar
login_url = 'https:///login'login_data = {'username': 'test_user', 'password': '123456'}headers = {'User-Agent': 'Chrome'}
data_encoded = urlencode(login_data).encode('utf-8')# 创建 CookieJar 和 opener 来管理会话cookie_jar = http.cookiejar.CookieJar()opener = build_opener(HTTPCookieProcessor(cookie_jar))# 使用 opener 发送登录请求login_request = Request(login_url, data=data_encoded, headers=headers, method='POST')login_response = opener.open(login_request)# 使用同一 opener 访问登录后页面protected_url = 'https:///profile'profile_request = Request(protected_url, headers=headers, method='GET')profile_response = opener.open(profile_request)print(profile_response.read().decode('utf-8'))login_response.close()profile_response.close()

而requests就简单多了,直接增加一个Session对象,就能在几乎不改动之前代码的情况下,实现登录状态的保持。

import requests
login_url = 'https:///login'login_data = {'username': 'test_user', 'password': '123456'}headers = {'User-Agent': 'Chrome'}
# 创建 Session 对象session = requests.Session()# 使用 Session 发送登录请求login_response = session.post(login_url, data=login_data, headers=headers)# 使用同一 Session 访问登录后页面protected_url = 'https:///profile'profile_response = session.get(protected_url, headers=headers)print(profile_response.text)

两种写法的差别,对比非常明显。一旦你有过requests的经验,就打开了网络请求的新世界,再也不想用内置的urllib来实现。

就连各家大厂的Python项目,网络请求也常常用requests来解决。毕竟这么好用的模块,相信谁都不会拒绝。

广泛的使用率也让requests始终霸榜在PyPI排行的前列。

而如此强大的类库,最初仅仅是一个程序员的个人项目。2011年某个下午,一个叫做 Kenneth 的小伙子因为无法忍受Python内置的urllib库,决定施展一下他的开发技术,写一个真正人性化的HTTP请求库,没想到竟写成了Python生态的重要支柱。

说到这个Kenneth,也是技术圈里充满话题的人物。在软件开发之外,他还热衷于音乐和摄影艺术。从他不同时期的照片就能看出,他本人的故事也一定很丰富。 (参见:这个男人让你的爬虫开发效率提升8倍)

除了requests,另一个很受欢迎的Python虚拟环境管理工具 Pipenv,也是由他发布。凭借这些项目,他一度是Github上获得star最多的Python用户。

不过如今,他已将大部分项目移交给了Python开源社区管理维护。每一个Python开发者都有机会向项目贡献自己的技术。

如果你是Python初学者,还没进行过第三方模块的学习,那不妨从requests做起,它上手简单文档清晰,是开发爬虫和API请求必学的神器。

如果你已经入门了Python,想要进一步提升自己的编程能力,也可以把requests项目当做进阶学习的案例,阅读源代码、学习代码风格和程序结构的设计,甚至提交代码改进项目中的问题,为开源项目贡献一份力。



    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多