requests库快速学习
requests库的作者是大名鼎鼎的kennethreitz,它口号是“HTTP For Humans”,为人类使用HTTP而生。
requests常用来进行接口请求,爬取网页等,相对于原生的urllib,它发起请求更加简洁和容易理解,支持HTTP连接保持和连接池、cookie保持会话、文件上传和支持自动确定响应内容的编码等。
开源地址:https://github.com/kennethreitz/requests
安装
pip install requests
Requests库提供了7种请求方法:
方法 | 说明 |
---|---|
requests.request() | 构造一个请求,支撑以下各方法的基础方法 |
requests.get() | 获取HTML网页的主要方法,对应于HTTP的GET |
requests.head() | 获取HTML网页头信息的方法,对应于HTTP的HEAD |
requests.post() | 向HTML网页提交POST请求的方法,对应于HTTP的POST |
requests.put() | 向HTML网页提交PUT请求的方法,对应于HTTP的PUT |
requests.patch() | 向HTML网页提交局部修改请求,对应于HTTP的PATCH |
requests.delete() | 向HTML网页提交删除请求,对应于HTTP的DELETE |
通过查看源码我们可以发现,后面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证书路径
模拟get请求
import requests
#构造get请求
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'}
response = requests.get("http://httpbin.org/get", params=data)
print(response.json())
模拟post请求
#随机获取图片地址
#请求方式: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"}]}
http请求的基本属性
print('请求url',r.request.url)
print('请求参数',r.request.body)
print('请求header',r.request.headers)
http响应的基本属性
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)
常见请求操作
添加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)
HTTP请求处理cookie的三种方式
一般登录后,需要保持会话状态,需要每次都指定 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对象中,后续直接使用该对象进行请求即可。
Session对象的创建:requests.Session()
import requests session = requests.session() response = session.get(url)
更多requests库的用法,大家可以学习下官方文档:
http://docs.python-requests.org/zh_CN/latest/index.html
