参考
requests官方文档
Python爬虫利器一之Requests库的用法
前言
在看这篇文章之前你要对HTTP有较深以及全面的了解,不了解的可以参见我的博客:
Http协议-你需要收藏了
一篇文章带你搞懂HTTP
此外,requests属于第三方库,在python标准库中有与该库相同功能的库:urllib.request,二者的区别在于requests相对urllib.request来说较为上层,urllib.request是用c来开发的。其实二者之间的关系就像c语言中的系统函数与库函数。
在一般的开发中,使用requests即可,简单好用,值得推荐
安装与导入
pip install requests
import requests
发送Http请求
r = requests.get('url')
r = requests.post('url', data = {'key':'value'}) # post方法会上传数据,因此data参数是必须的
r = requests.delete("url")
r = requests.head("url")
r = requests.options("url")
响应对象:Response
如果了解HTTP协议,你应该知道响应报文这个概念,这里的Response对象包含的就是响应报文的内容
r.text # HTML文本
r.encoding # 响应内容的编码,可以修改
r.status_code # 查看响应报文的状态码
r.url # 查看请求url
r.headers # 查看响应报文头
r.headers['Content-Type']
r.headers.get('content-type')
二进制响应内容
对于非文本请求,例如图片,视频等,你可以以字节的方式访问请求响应内容。
Requests 会自动为你解码
gzip
和deflate
传输编码的响应数据。
r.content # 以二进制的响应输出内容,适合图片,视频
JSON响应内容
有时我们请求的是一个JSON文件,这个时候我们需要使用解析文件
r.json() # 如果 JSON 解码失败, r.json() 就会抛出一个异常。
原始响应内容?
r = requests.get('https://github.com/timeline.json', stream=True)
r.raw # 获取来自服务器的原始套接字响应,请你确保在初始请求中设置了 stream=True
HTTP GET
1. 基本的Get请求
r = requests.get("url")
2. 向url
中添加请求参数
-
以字典形式传入url查询参数
payload = {'key1': 'value1', 'key2': 'value2'} r = requests.get("http://httpbin.org/get", params=payload)
则此时的URL就变成了:
http://httpbin.org/get?key2=value2&key1=value1
注意字典里值为
None
的键都不会被添加到 URL 的查询字符串里。如果此处看不懂的话,不妨到任意一个网站,在搜索栏中输入关键字,查看最终的url,你就会发现区别(前提是你得懂url的结构)
-
将列表作为值传入
payload = {'key1': 'value1', 'key2': ['value2', 'value3']} r = requests.get('http://httpbin.org/get', params=payload)
此时完整的url就变成了:
http://httpbin.org/get?key1=value1&key2=value2&key2=value3
3. 向GET
请求中添加请求头部
headers = {'content-type': 'application/json'}
r = requests.get("http://httpbin.org/get", params=payload, headers=headers)
注意: 所有的 header 值必须是
string
、bytestring 或者 unicode。
HTTP POST
基本POST
请求:发送表单形式数据
注意,在POST请求中,我们是一定要有请求参数的,而Get中是不一定需要请求参数的。
payload = {'key1': 'value1', 'key2': 'value2'}
payload = (('key1', 'value1'), ('key1', 'value2'))
response = requests.post("http://httpbin.org/post", data=payload)
传送JSON形式数据
payload = {'some': 'data'}
r = requests.post(url, data=json.dumps(payload))
或 r = requests.post(url, json=payload) #2.4.2后支持
传送文件
files = {'file': open('filename', 'rb')}
r = requests.post(url, files=files)
状态码
r.status_code # 查看响应状态吗
r.status_code = requests.codes.ok #查看状态码是否ok
如果请求失败(返回的状态码不是202),则可以用r.raise_for_status()来抛出异常。
r.raise_for_status()
Traceback (most recent call last):
File "requests/models.py", line 832, in raise_for_status
raise http_error
requests.exceptions.HTTPError: 404 Client Error
# 当返回状态码为200时,该函数返回为None
Cookie
1. 发送Cookie
cookies = dict(cookies_are='working')
response = requests.get(url, cookies=cookies)
2.查看响应报文中的Cookie
response.cookies['cookie_name']
重定向和请求历史
默认情况下,除了 HEAD, Requests 会自动处理所有重定向。
可以使用响应对象的
history
方法来追踪重定向。
response.history
# 禁用重定向处理
response = requests.get('http://github.com', allow_redirects=False)
# 对HEAD启用重定向
response = requests.head('http://github.com', allow_redirects=True)
超时
所有的生产代码都应该使用这一参数。如果不使用,你的程序可能会永远失去响应:
requests.get('http://github.com', timeout=0.001)
timeout
并不是整个下载响应的时间限制,而是如果服务器在timeout
秒内没有应答,将会引发一个异常.
错误和异常
- 遇到网络问题(如:DNS 查询失败、拒绝连接等)时,Requests 会抛出一个
ConnectionError
异常。- HTTP 请求返回了不成功的状态码,
Response.raise_for_status()
会抛出一个HTTPError
异常。- 请求超时,则抛出一个
Timeout
异常。- 请求超过了设定的最大重定向次数,则会抛出一个
TooManyRedirects
异常。- Requests显式抛出的异常都继承自
requests.exceptions.RequestException
。