Python 自带的 urllib 网络请求库基本可满足我们的需要,但是在实际开发过程中使用 起来还是有些烦琐,表现在以下几个方面
- 发送 GET 和 POST 请求。
- Cookie 处理。
- 设置代理。
urllib 默认不支持压缩,要返回压缩格式,必须在请求头里写明 accept- encoding,然后在获取返回数据时,它以响应头里是否有 accept-encoding 来判断是否需要解码。当然也可 以对 urllib 进行一些常用的封装,以规避此类问题。而更多时候,我们会选择使用 Requests 库来模拟请求。
1.Requests 库介绍
Requests 库基于 urllib 库,是采用 Apache2 Licensed 开源协议的 HTTP 库,更加简单且 功能强大。该库支持如下功能。
- International Domains and URLs:国际化域名和 URL。
- Keep-Alive & Connection Pooling:Keep-Alive & 连接池。
- Sessions with Cookie Persistence:带持久 Cookie 的会话。
- Browser-style SSL Verification:浏览器式的 SSL 认证。
- Basic/Digest Authentication:基本/摘要式的身份认证。
- Elegant Key/Value Cookies:简洁的 Key/Value Cookie。
- Automatic Decompression:自动解压。
- Automatic Content Decoding:自动内容解码。
- Unicode Response Bodies:Unicode 响应体。
- Multipart File Uploads:文件分块上传。
- HTTP(S) Proxy Support:HTTP(S)代理支持。
- Connection Timeouts:连接超时。
- Streaming Downloads:流下载。
- .netrc Support:支持.netrc。
- Chunked Requests:Chunked 请求。
[官方文档为](http://www.python-requests. org/en/master/)
直接通过 pip 安装库即可
pip install requests
- window电脑点击win键+R,输入:cmd
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a5CBbZGu-1670765565287)(9.每天进步一点点—Python-Requests HTTP 请求库.assets/image-20221124184205449.png)]
2.安装requests,pip 命令安装 ,我们使用豆瓣的镜像源来安装
pip install requests -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GEdc34Qh-1670765565289)(Python爬虫image/image-20221211211133611.png)]
2.Requests HTTP 基本请求
Requests 支持各种请求方式:GET、POST、PUT、DELETE、HEAD、OPTION。使用 代码示例如下
r1 = requests.get("http://xxx", params={"x": 1, "y": 2}) r2 = requests.post("http://xxx", data={"x": 1, "y": 2}) r3 = requests.put("http://xxx") r4 = requests.delete("http://xxx") r5 = requests.head("http://xxx") r6 = requests.options("http://xxx")
注意事项:
- URL 链接里有中文时会自动转码
- 使用 post 时,如果传递的是一个 str 而不是一个 dict,则会直接发送出去(如 JSON 字符串)
- 使用 post 时,如果传递的是一个 str 而不是一个 dict,则会直接发送出去(如 JSON 字符串).
- post 可以通过 file 参数上传文件,如 post(url, files={‘file’: open(‘report.xls’, ‘rb’)})
3.Requests 请求常用设置
Requests 请求的相关设置如下:
设置请求头:headers={'xxx':'yyy'} 代理:proxies={'https':'xxx'} 超时(单位秒):timeout=15
4.Requests 处理返回结果
Requests 请求会返回一个 requests.models.Response 对象,可以通过调用表中的字段获取响应信息。
字段 | 描述 |
status_code | 获取状态码 |
reason | 状态信息 |
url | 获取请求的 URL |
content | 获取 byte 类型的返回结果,相当于 urllib.urlopen().read |
raw | 获得原始的返回结果,请求里需要设置 stream=True |
text | 获取 str 类型的返回结果,会自动根据响应头部的字符编码进行解码; 可以调用 r.encoding 获得编码方式,或者在调用 text 之前先用 r.encoding='编码’来设置编码类型,text 就会按照对应的编码进行解析 |
json | 解析序列化为 JSON 格式的数据,可以直接通过[‘xxx’]获取数据。 如果解析错误,则会抛出异常:ValueError: No JSON object could be decoded |
除此之外,还可以使用 headers 获得响应头,代码示例如
r = requests.get('http://gank.io/api/data/Android/50/1') # 直接根据键获得值 print(r.headers.get('Date')) # 遍历获得请求头里所有键值 for key, value in r.headers.items(): print(key + " : " + value)
如 果 想 获 取 请 求 头 信 息 , 可 以 调 用r.request.headers
。 除 此 之 外 , 还 可 调 用 raise_for_status()
,当响应码不是 200 时,会抛出 HTTPError 异常,可用于响应码校验。另 外,由 Requests 发起的请求,当相应内容经过 gzip
或 deflat
e 压缩时,Requests 会自动解包, 可以通过 content 获得 byte 方式的响应结果。
请接着看下一博客笔记