社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python第三方库的王者:requests

IT服务圈儿 • 2 周前 • 43 次点击  


来源 | 经授权转自 Crossin的编程教室(ID:crossincode)
作者 | Crossin先生

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

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

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

怎么个人性化法?

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

import requestsr = requests.get('http://api.tangdouz.com/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.example.com/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.example.com/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://example.com/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://example.com/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://example.com/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://example.com/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项目当做进阶学习的案例,阅读源代码、学习代码风格和程序结构的设计,甚至提交代码改进项目中的问题,为开源项目贡献一份力。


1、凌晨三点,一条 SQL 语句,把我从床上炸起来了
2、mmap是如何巧妙绕过传统IO性能陷阱的?
3、Cursor编辑代码功能是如何实现的?
4、MySQL同步ES的6种方案!
5、讲透一个强大算法模型,Transformer!!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/182174
 
43 次点击