Requests库的作者是大名鼎鼎的kennethreitz,它的口号是“HTTP For Humans”,为人类使用HTTP而生。
requests常用来进行接口请求,爬取网页等,相对于原生的urllib,它发起请求更加简洁和容易理解,支持HTTP连接保持和连接池、cookie保持会话、文件上传和支持自动确定响应内容的编码等。
开源地址:https://github.com/kennethreitz/requests
pip install requests
通过查看源码我们可以发现,后面6种方法都是在调用request()
方法。
def get(url, params=None, **kwargs): return request('get', url, params=params, **kwargs) def post(url, data=None, json=None, **kwargs): return request('post', url, data=data, json=json, **kwargs)
request()
方法参数说明:
requests.request(method, url, **kwagrs)
method: 请求方式,对应get/post等6种方法
url: 获取页面的url链接
**kwargs: 控制访问的参数,共有13个:
params: 字典或字节序列,作为参数增加到url中
data:字典,字节序列或文件对象,作为Request的内容
json: JSON格式的数据,作为Request的内容
headers: 字典, HTTP定制头
cookie: 字典或CooKiJar, Request中的cookie
auth: 元祖,支持HTTP认证功能
files: 字典类型,传输文件
timeout: 设定超时时间,秒为单位
proxies: 字典类型,设定访问代理服务器,可以增加登录认证
allow_redirects: True/False,默认为True,重定向开关
stream: True/False,默认为True,获取内容立即下载开关
verity: True/False默认Ture,认证ssl证书开关
cert: 本地ssl证书路径
import requests r = requests.get('http://www.baidu.com') print('响应码',r.status_code) #返回接口响应码 print('响应信息',r.text) #返回html 输出 响应码 200 响应信息 <!DOCTYPE html> <!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always........................>
import requests data = {'name': 'xiaoming', 'age': '22'} r = requests.get("http://httpbin.org/get", params=data) print(r.json())
#随机获取图片地址 #请求方式:POST #请求地址:https://api.apiopen.top/getImages data= {'page':'1','count':'2'} r = requests.post('https://api.apiopen.top/getImages',data=data) print('响应码',r.status_code) print('响应信息',r.text) 输出 响应码 200 响应信息 {"code":200,"message":"成功!","result":[{"id":674,"time":"2020-02-16 04:00:00","img":"https://img.lijinshan.site/images/70def23833844b0fa0e6e74041421e37"},{"id":675,"time":"2020-02-16 04:00:00","img":"https://img.lijinshan.site/images/999cf7f9728b45deacc0740de53aaff1"}]}
print('请求url',r.request.url) print('请求参数',r.request.body) print('请求header',r.request.headers)
print(r.content)#获取bytes类型的响应 print('响应码',r.status_code) print('响应信息',r.text) #响应信息,文本,字符串 print('响应信息字典',r.json())#响应信息,json print('响应信息字典值',r.json()['xxx']) print('响应cookies',r.cookies) print('响应headers',r.headers)
服务器反爬虫机制会判断客户端请求头中的User-Agent是否来源于真实浏览器,可以指定UA伪装成浏览器发起请求
import requests data = {'name': 'xiaoming', 'age': '22'} headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36' } response = requests.post("http://httpbin.org/post", data=data, headers=headers) print(response.json())
import requests files = {'file': open('test.txt', 'rb')} response = requests.post("http://httpbin.org/post", files=files) print(response.text)
当发起一个请求遇到服务器响应非常缓慢时,可以指定 timeout 来设置请求超时时间,单位是秒,超过该时间还没有连接服务器成功时,请求将强行终止。
r = requests.get('http://www.baidu.com', timeout=5)
通过同一时间请求太多会被服务器判定为爬虫,所以很多时候我们使用代理IP来伪装客户端的真实IP,代理服务器就是用来转发请求和响应。可以让代理服务器转发请求从而更换请求的原始ip地址。
import requests proxies = { 'http': 'http://127.0.0.1:1080', 'https': 'http://127.0.0.1:1080', } r = requests.get('http://www.kuaidaili.com/free/', proxies=proxies, timeout=2)
一般登录后,需要保持会话状态,需要每次都指定 cookies,有如下三种处理方式:
cookie放到headers中
将cookie封装到headers字典中,将该字典作用到get/post方法的headers参数中
import requests url= ‘http://httpbin.org/post' headers = { "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36", "Cookie":"XXXXX"} } requests.get(url,headers=headers)
cookie字典传给cookies参数
res=requests.get(url,headers=headers,cookies=cookies)
使用session对象
在使用session进行请求发送的过程中,如果产生了cookie,则cookie会被自动存储到session对象中,后续直接使用该对象进行请求即可。
import requests session = requests.session() response = session.get(url)
更多requests库的用法,大家可以学习下官方文档:
http://docs.python-requests.org/zh_CN/latest/index.html