Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。
Python3中安装利用 pip3 完成安装:pip3 install requests
params 接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不用urlencode()
Requests(params={}传参数自动url编码,data post传参,proxies={"http":"127"}代理)
如果我们想跳过 12306 的证书验证,把 verify 设置为 False 就可以正常请求了。
requests库发送请求将网页内容下载下来以后,并不会执行js代码,这需要我们自己分析目标站点然后发起新的request请求
建议在正式学习requests前,先熟悉下HTTP协议: http://www.cnblogs.com/linhaifeng/p/6266327.html
取消requests 警告错误: requests.packages.urllib3.disable_warnings()
基于GET请求:
headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36', }
response = requests.get("http://www.baidu.com/s?", params = kw, headers = headers)
添加 headers 和 查询参数
如果想添加 headers,可以传入headers参数来增加请求头中的headers信息。如果要将参数放在url中传递,可以利用 params (参数自动帮我们汉字urlencode编码)。
#如果查询关键词是中文或者有其他特殊符号,则不得不进行url编码 from urllib.parse import urlencode wd='egon老师' encode_res=urlencode({'k':wd},encoding='utf-8')
keyword=encode_res.split('=')[1]
# 然后拼接成url url='https://www.baidu.com/s?wd=%s&pn=1' %keyword
响应Response
# 查看响应内容,response.text 返回的是解码后数据
print(response.text)
# 查看响应内容,response.content返回的字节流数据(二进制)
print(response.content)
# 查看完整url地址
print(response.url)
# 查看响应头部字符编码
print(response.encoding)
# 查看响应码
print(response.status_code)
print(respone.headers)
print(respone.cookies)
print(respone.cookies.get_dict())
print(respone.cookies.items())
print(respone.history) 页面跳转后history可以看到跳转之前的页面
解析json
res2=response.json() #直接获取json数据
指定allow_redirects=False,则响应头中即便出现Location也不会跳转到新页面,r2代表的仍然是老页面的response
r2=requests.post('https://github.com/session', data=data, cookies=r1_cookie, allow_redirects=False )
#编码问题 response.encoding='gbk'
#通常我们在发送请求时都需要带上请求头,请求头是将自身伪装成浏览器的关键,常见的有用的请求头如下
Host Referer #大型网站通常都会根据该参数判断请求的来源
User-Agent #客户端
Cookie #Cookie信息虽然包含在请求头里,但requests模块有单独的参数来处理他,headers={}内就不要放它了
Cookies={ 'user_session':'wGMHFJKgDcmRIVvcA14_Wrt_3xaUyJNsBnPbYzEL6L0bHcfc', } response=requests.get('https://github.com/settings/emails', cookies=Cookies) #github对请求头没有什么限制,我们无需定制user-agent,对于其他网站可能还需要定制
基本POST请求(data参数):
#GET请求
HTTP默认的请求方法就是GET
* 没有请求体
* 数据必须在1K之内!
* GET请求数据会暴露在浏览器的地址栏中
GET请求常用的操作:
1. 在浏览器的地址栏中直接给出URL,那么就一定是GET请求
2. 点击页面上的超链接也一定是GET请求
3. 提交表单时,表单默认使用GET请求,但可以设置为POST
#POST请求
(1). 数据不会出现在地址栏中
(2). 数据的大小没有上限
(3). 有请求体
(4). 请求体中如果存在中文,会使用URL编码!
#!!!requests.post()用法与requests.get()完全一致,特殊的是requests.post()有一个data参数,用来存放请求体数据
response = requests.post("http://www.baidu.com/", data = data)
代理(proxies参数)
如果需要使用代理,你可以通过为任意请求方法提供 proxies 参数来配置单个请求
proxies={ "http":"211.159.177.212:3128",
"https":"119.28.138.104:3128",}
response = requests.get("http://www.baidu.com/", proxies=proxies)
你也可以通过环境变量 HTTP_PROXY 和 HTTPS_PROXY 来配置代理。
export HTTPS_PROXY="http://12.34.56.79:9527"
#超时设置
#两种超时:float or tuple
#timeout=0.1 #代表接收数据的超时时间
#timeout=(0.1,0.2)#0.1代表链接超时 0.2代表接收数据的超时时间
import requests
respone=requests.get('https://www.baidu.com', timeout=0.0001)
Stream模式分块读取
import requests
r = requests.get('http://zt.bdinfo.net/speedtest/wo3G.rar', stream=True)
f = open("logo.png", "wb")
for chunk in r.iter_content(chunk_size=512):
if chunk:
f.write(chunk)
f.close()
5.1 私密代理
# 如果代理需要使用HTTP Basic Auth,可以使用下面这种格式:
proxies = { "http":"trygf521:a4c4avg9@114.67.228.126:16818/" }
response = requests.get("http://www.baidu.com", proxies = proxy)
web客户端验证:如果是Web客户端验证,需要添加 auth = (账户名, 密码)
auth=('test', '123456')
response = requests.get('http://192.168.199.107', auth = auth)
Cookies 和 Sission
如果一个响应中包含了cookie,那么我们可以利用 cookies参数拿到:
import requests
response = requests.get("http://www.baidu.com/")
# 返回CookieJar对象:
cookiejar = response.cookies
# 将CookieJar转为字典:
cookiedict = requests.utils.dict_from_cookiejar(cookiejar)
print(cookiejar)
print(cookiedict)
#没有指定请求头,#默认的请求头:application/x-www-form-urlencoed
#如果我们自定义请求头是application/json,并且用data传值, 则服务端取不到值
requests.post(url='', json={' ':1,}, ) #默认的请求头:application/json
使用Session实现人人网登录
import requests
# 1. 创建session对象,可以保存Cookie值
ssion = requests.session()
# 2. 处理 headers
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
# 3. 需要登录的用户名和密码
data = {"email":"yangguangfu2017@163.com", "password":"afu123456"}
# 4. 发送附带用户名和密码的请求,并获取登录后的Cookie值,保存在ssion里
ssion.post("http://www.renren.com/PLogin.do", data = data)
# 5. ssion包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面
response = ssion.get("http://www.renren.com/880792860/profile")
# 6. 打印响应内容
print(response.text)
Requests也可以为HTTPS请求验证SSL证书:
如果我们想跳过 12306 的证书验证,把 verify 设置为 False 就可以正常请求了。
response = requests.get("https://www.12306.cn/mormhweb/", verify = False)
print(response.content.decode("utf-8"))
大文件要循环下载(文本,wb)
if response.status_code == 200:
#保存图片名字为logo.jpg
with open('logo.jpg', 'wb') as f:
for block in response.iter_content(1024×1024):
#判断是否还有内容,没有就退出for循环
if not block:
break
#把取出的内容写入文件
f.write(block)
文件上传
import requests
files={'file':open('a.jpg','rb')}
respone=requests.post('http://httpbin.org/post',files=files)
print(respone.status_code)
异常处理
import requests
from requests.exceptions import * #可以查看requests.exceptions获取异常类型
try:
r=requests.get('http://www.baidu.com',timeout=0.00001)
except ReadTimeout:
print('===:')
except RequestException: print('Error')
认证设置
#认证设置:登陆网站是,弹出一个框,要求你输入用户名密码(与alter很类似),此时是无法获取html的
# 但本质原理是拼接成请求头发送
# r.headers['Authorization'] = _basic_auth_str(self.username, self.password)
# 一般的网站都不用默认的加密方式,都是自己写
# 那么我们就需要按照网站的加密方式,自己写一个类似于_basic_auth_str的方法
# 得到加密字符串后添加到请求头
# r.headers['Authorization'] =func('.....')
#看一看默认的加密方式吧,通常网站都不会用默认的加密设置
import requests
from requests.auth import HTTPBasicAuth
r=requests.get('xxx',auth=HTTPBasicAuth('user','password'))
print(r.status_code)
#HTTPBasicAuth可以简写为如下格式
import requests
r=requests.get('xxx',auth=('user','password'))
print(r.status_code)