之前学过urllib,但在实现功能时有些比较复杂,比如处理网页验证的cookies时,需要写opener和handle来处理。为了更加方便的实现这些操作,这就有了更为强大的库request,有了它,cookies、登录验证、代理设置等操作都不是事。
import requests
r = requests.get('http://baidu.com')
1.1 实例化对象r的一些方法:
type(r) # 实例化对象的类型:requests.models.Response
r.status_code # 状态码
type(r.text) # 响应体为str格式(有时是JSON格式,JSON = str(字典)则需要用json()方法转换为字典)
r.text # 响应体(返回的网页,后续提取网页信息)
r.cookies # 得到cookies
r.headers # 获取响应头
r.url # 获取URL
r.history
1.2 除了get请求外,类似的实现其他请求(还有其他参数后面介绍)
r = requests.post('http://httpbin.org/post')
r = requests.put('http://httpbin.org/put')
r = requests.delete('http://httpbin.org/delete')
r = requests.head('http://httpbin.org/get')
r = requests.options('http://httpbin.org/get')
1.3 在get请求中加入一些参数(等于加在网址上)
data = {
'name':'daguo',
'age':'23'
} # 添加get信息,相当于在url后附加:http://httpbin.org/get?age=22&name=daguo
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
} # 添加请求头
r = requests.get('http://httpbin.org/get',params=data, headers = headers) # params:参数
r = requests.get('https://github.com/favicon.ico') # 获取二进制文件的链接
with open('favicon.ico','wb') as f: # 新建文件二进制写入
f.write(r.content)
# 这里用r.content:为r中包含的原始内容(此处为二进制格式,直接写入即可)
# 不用r.text:因为text将r中内容转换为了字符串格式(r.text = str(r.content))
r = requests.post('http://httpbin.org/post')
3.1 提交表单
data = {
'name':'daguo',
'age':'23'
} # 添加表单
# GET请求中的data是添加参数(args),相当于修改URL,params = data
# POST请求中的data是添加表单(form),能提供更多信息,data = data
r = requests.post('http://httpbin.org/get',data = data)
3.2 文件上传
files = {'file':open('favicon.ico','rb')} # 以字典的形式上传文件
r = requests.post('http://httpbin.org/post',files = files)
3.3 获取和设置cookies(可以直接通过请求头设置)
# 获取cookies
r = requests.get('http://www.baidu.com')
print(r.cookies) # 获取
# cookies里面都是一个个键值对,为方便咱看:
# 用item()将cookies装化成元组组成的列表
for key,value in r.cookies.items():
print(key + '=' + value)
# 设置cookies
headers = {
'Cookie':'从浏览器复制的已登录的Cookies',
'Host':'www.zhihu.com',
'User-Agent':'从浏览器复制下来'
} # 通过请求头设置Cookies
r = requests.get('https://www.zhihu.com',headers=headers)
3.4 保持会话(Session)
使会话保持连续,即cookies动态变化,不需要手动操控
s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.text)
# 运行结果
{
'cookies':{
'number':123456789
}
}
SSL证书验证
有的网站需要验证证书,没证书不让访问
通过verify强制让网站不验证
verify = True(验证)
verify = False(验证)
r = requests.get('https://www.12306.cn',varify = False)
虽然不验证但是有个警告建议验证
解决方案有三种:1.忽略警告;2.捕获警告到日志;3.指定本地证书进行验证
1.忽略警告
import requests
from requests.packages import urllib3
urllib3.disable_warnings()
r = requests.get('https://www.12306.cn',varify = False)
2.捕获警告到日志
import logging
import requests
logging.captureWarnings(True)
r = requests.get('https://www.12306.cn',varify = False)
3.指定本地证书进行验证
本地需要有crt和key(解密状态)
import requests
r = requests.get('https://www.12306.cn',cert = ('/path/server.crt','/path/key'))
代理设置
普通代理proxies
proxies = {
'http':'http://10.10.1.10:3128'
'https':'http://10.10.1.10.1080'
}
r = requests.get('https://www.taobao.com',proxies = proxies)
需要使用HTTP Basic Auth 的代理
代理格式:http://user:password@host:port
proxies = {
'http':'http://user:[email protected]:3128'
'https':'http://user:[email protected]'
}
r = requests.get('https://www.taobao.com',proxies = proxies)
SOCKS协议的代理(需要安装:request[socks])
proxies = {
'http':'socks5://user:[email protected]:3128'
}
r = requests.get('https://www.taobao.com',proxies = proxies)
超时设置
import requests
# 默认timeout = None:永久等待
r = requests.get('http://www.taobao.com',timeout = 1)
身份认证(账号密码)
import requests
r = requests.get('http://localhost:5000',auth = ('username','password'))
from requests import Request, Session
url = 'http://httpbin.org/post'
data = {
'name':'daguo'
}
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
} # 添加请求头
s = Session()
req = Request('POST',url, data=data, headers=headers) # 用参数构造Request对象
preppd = s.prepare_request(req) # 将Request对象转换为Prepared Request对象
r = s.send(preppd) # 将Prepared Request对象发送给r
print(r.text)