网站首页 文章专栏 python requests
python requests
创建于:2021-07-04 08:21:03 更新于:2024-05-03 04:11:20 羽瀚尘 438

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

    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)
    

使用request对象调试

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格式返回自己的请求数据。

  • GET http://httpbin.org/get
  • POST http://httpbin.org/post
  • COOKIES http://httpbin.org/cookies

请求持久化、共享

一般网页在登陆后其有效状态可以维持很长时间,每启动一次都要登陆太麻烦。这时可以将整个session保存到本地,使用时加载,如果失效重新获取。

也有一些应用场景需要大量用户的session,以防止网站反爬虫。这种需要构建cookies pool,目前的思路是用redis,将session序列化后存入,守护进程定时刷新。

序列化有两种方案。

json

将session分为cookies和headers两部分,使用ret.cookies.get_dict()可以获得字典形式的cookies,之后再用json.dumps()可以序列化字典。headers是一个字典可以直接用json序列化。

这种方法可以生成字符串形的数据,人类可读。但丢失了cookies中的domin和 expire time信息。

pickle

直接使用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高级用法