网站首页 文章专栏 python requests
requests是python中比较好用的请求网络数据的库,接口简洁,开发难度低于urllib。
requests可以自动处理cookies、session,自定义headers,上传与保存二进制文件,文档编码自动猜测等。
独立请求的含义是,如果有两个或多个requests调用,这些requests之间的cookies和headers是独立的,互不共享。
如果请求1添加了一些cookies,且请求2需要使用这些cookies,那么需要在发起请求2时显式地添加这些cookies。
调用方法:
## get
ret = requests.get(url=url, cookies=cookies, headers=headers)
## post 与 get非常类似
ret = requests.post(url=url, data=data, cookies=cookies, headers=headers)
典型参数:
headers
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36',
'Referer': 'your_referer',
'Accept-Language': 'zh,zh-CN;q=0.9,en;q=0.8,zh-TW;q=0.7',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
data
## 一个简单的字典结构
data = {'a':'a'}
cookies
## cookies实际为RequestsCookieJar,它的行为和字典类似,但接口更为完整,适合跨域名跨路径使用一个增强的字典
jar = requests.cookies.RequestsCookieJar()
jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
url = 'http://httpbin.org/cookies'
r = requests.get(url, cookies=jar)
r.text
## 输出'{"cookies": {"tasty_cookie": "yum"}}'
session的含义是在多个请求中共享cookies和headers,并且如果网站设置了新的cookies,session可以自动更新或添加cookies。
session适合于爬取需要用户登录的页面。
调用方法:
import requests
s = requests.session()
s.headers = your_headers
s.post(login_url, data=data)
s.get(url_you_want)
import requests
ret = requests.get('https://www.baidu.com')
# 查看状态码(int型)
ret.status_code
# 查看请求header(包含请求的cookies)
ret.request.headers
# 查看cookies(首先检查是否有Cookie)
ret.request.headers['Cookie']
# 查看请求body
ret.request.body
# 查看response headers
ret.headers
# 查看response 内容, text模式
ret.text
# 查看response 内容,二进制模式
ret.content
# 查看response编码
ret.encoding
# 如果请求的是图片,encoding返回None,这时需要在headers里面找图片类型
ret.headers['Content-Type']
目前发现的工具是http://httpbin.org/
,发送请求到这个网站,会以json格式返回自己的请求数据。
http://httpbin.org/get
http://httpbin.org/post
http://httpbin.org/cookies
一般网页在登陆后其有效状态可以维持很长时间,每启动一次都要登陆太麻烦。这时可以将整个session保存到本地,使用时加载,如果失效重新获取。
也有一些应用场景需要大量用户的session,以防止网站反爬虫。这种需要构建cookies pool,目前的思路是用redis,将session序列化后存入,守护进程定时刷新。
序列化有两种方案。
将session分为cookies和headers两部分,使用ret.cookies.get_dict()
可以获得字典形式的cookies,之后再用json.dumps()
可以序列化字典。headers是一个字典可以直接用json序列化。
这种方法可以生成字符串形的数据,人类可读。但丢失了cookies中的domin和 expire time信息。
直接使用pickle.dump(sess,open('sess.dat','wb'))
存储整个session。
缺点是人类不可读,可能无法与其他非python程序共享。
with open('massive-body') as f:
requests.post('http://some.url/streamed', data=f)
显示进度条有多种方案,比如自己做个file adapter,或者使用requests_toolbelt库。
file adapter可以在参考目录中的《Progress of Python requests post》找到。
from requests_toolbelt import MultipartEncoder, MultipartEncoderMonitor
import requests
def my_callback(monitor):
## Your callback function
print monitor.bytes_read
e = MultipartEncoder(
fields={'field0': 'value', 'field1': 'value',
'field2': ('filename', open('file.py', 'rb'), 'text/plain')}
)
m = MultipartEncoderMonitor(e, my_callback)
r = requests.post('http://httpbin.org/post', data=m,
headers={'Content-Type': m.content_type})
参考:
- 官方教程
- Progress of Python requests post
- requests高级用法