一,基本用法
Ⅰ,GET请求
1,get()方法
用于构建GET请求
参数:
requests.get(url,params,**kwargs)
params:用于添加额外的参数
**kwargs:12个控制访问的参数,如headers
返回的类型:
requests.models.Response对象
*属性:
status_code:状态码
text:HTTP响应内容的字符串形式
content:HTTP响应内容的二进制形式
cookies:为了识别用户身份,保持对话而存储用户本地终端上的数据
encoding:
apparent_encoding:
2,基本实例
json()方法:
若想直接解析返回结果,得到一个字典格式,可用json()方法
import requests
params = {
'name':'lucy',
'age':'17'
}
url = 'http://httpbin.org/get'
response = requests.get(url,params)
print(response.status_code)
print(response.text)
print(response.json())
3,抓取网页
搁置,待学习正则表达式后回看
4,抓取二进制数据
用于抓取图片、音频、视频等文件
代码:
import requests
url = 'https://github.com/favicon.ico'
response = requests.get(url)
with open('image1.ico','wb') as file:
file.write(response.content)
5,添加headers
import requests
url = 'https://www.zhihu.com/signin?next=%2F'
headers = {
'use-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36'
}
response = requests.get(url,headers)
print(response.text)
Ⅱ,响应
requests.codes:
状态码查询对象
状态码及相应的查询条件:https://blog.csdn.net/qq_51102350/article/details/116034703
示例:
import requests
url = 'https://www.baidus.com/'
response = requests.get(url)
if not response.status_code == requests.codes.ok:
exit('fail')
else:
print('sucess')
Ⅲ,POST请求
import requests
url = 'https://httpbin.org/post'
data = {
'name':'lucy',
'age':'17'
}
response = requests.post(url,data)
print(response.text)
二,高级用法
文件上传、Cookies设置、代理设置等
Ⅰ,文件上传
import requests
url = 'https://httpbin.org/post'
with open('image1.ico','rb') as file:
files = {
'file':file}
response = requests.post(url,files=files)
print(response.text)
Ⅱ,Cookies
1,获取Cookies
获得Resposne对象
调用cookies属性
使用items或keys或values将其转换为元组
import requests
url = 'https://www.baidu.com/'
response = requests.get(url)
#调用Resposne类的cookeis属性即可得到Cookies,它是一个RequestCookieJar类型
print(response.cookies)
for key,value in response.cookies.items():
print(key + '=' + value)
for key in response.cookies.keys():
print(key)
for value in response.cookies.values():
print(value)
2,用Cookie来维持登录状态
将cookie和host设置到headers里
import requests
url = 'https://www.zhihu.com/'
#user-agent,host,cookie缺一不可
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36',
'host':'www.zhihu.com',
'cookie':'_zap=3d90c69e-1aa6-47ca-adde-e1023587981b; d_c0="'
'ANBW9PS0qxKPTrCJL6c4zPNdLBWOi8Ewgd4=|1613540697"; '
'_xsrf=8PnDnt1HjUCMRIFBZ03bUN5ma02HM3QE; z_c0=Mi4xM'
'FpFVUJRQUFBQUFBMEZiMDlMU3JFaGNBQUFCaEFsVk5QVmNzWVFDc'
'UdIZWZpU25iZTgxZm43em1oT0JNZDF5SlFn|1614743869|0a0ac1f'
'3ae38f7bd64503ac0ae748e9df5fa78c9; q_c1=c26ba9b21fe94775'
'b92ceffbc3e1a12a|1614744111000|1614744111000; tshl=; tst'
'=r; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1618470143,161'
'8538688,1618548247,1619146657; Hm_lpvt_98beee57fd2ef70ccdd5'
'ca52b9740c49=1619146657; SESSIONID=2R7Ov9bK6YTluPMAco1wcSlMQ'
'apZgai3n3v2tCKSJvo; JOID=UVwVBEN7Lh-PouzeU38iy8-oXXlCTngvz9_'
'SuB9GcE_k2LeUFtoaleuu791bCPhbhipkaUu-UxYDPtxKSpvDDsE=; osd=V'
'FEWA01-IxyIrOnTUHgszsKrWndHQ3sowdrfuxhIdULn37mRG9kdm-6j7NpVDf'
'VYgSRhZEi5XRMOPdtET5bACc8=; KLBRSID=af132c66e9ed2b57686ff5c489976b91|1619146666|1619146652'
}
response = requests.get(url,headers=headers)
print(response.text)
3,会话维持
问题:
requets中,直接利用get()或post()模拟的网页的请求相当于不同的会话,也就是说相当于从两个浏览器中打开不同的界面。
如:假设先用post()登录了一个界面,又用get()访问,那么get()是无法获得登录后的内容的。
解决方法一:两次都采用post()方法,在两次请求时设置一样的cookies。
解决方法二:维持同一个会话,即:在同一个浏览器中打开一个新的选项卡而不是打开一个新的浏览器。此方案要借助Session()方法创建Session对象。
附:http测试网址:http://httpbin.org/
*待深入学习后回看
4,SSL证书验证
SSL:加密套接字协议层
SSL证书:用于服务器身份验证和数据传输加密,由官方CA机构颁发
参数verify:
get(),post()等的参数
bool类型
对于证书未被官方CA机构信任的网站,可以将verify参数设置为False来访问。
5,代理设置
一些网站,刚开始时可以爬,请求太频繁它就不让你爬了
设置HTTP代理:
参数proxies:
get(),post()等的参数
用于设置代理
字典类型
import requests
url = 'https://www.taobao.com'
proxies = {
'http':'http://10.10.1.10:3128',
'https':'https://10.10.1.10:3128'
}
#此处设置的是无效代理,有效代理需购买
response = requests.get(url,proxies=proxies)
6,超时设置
参数timeout:
get(),post()等的参数
发出请求到服务器返回响应的时间
请求分为两部分:连接(connect)和读取(read)
可以用元组分别设置这两部分的值,也可直接设置总和
若不设置,则会永久等待
import requests
url = 'https://www.taobao.com'
timeout1 = 1#请求时间总和
timeout2 = (2,4)#前者为连接时间,后者为读取时间
response = requests.get(url,timeout = timeout1)
response = requests.get(url,timeout = timeout2)
7,身份认证
问题:访问网站时,可能要求我们输入用户名和密码
baisicauth:基本认证
HTTP认证:
auth参数:
get(),post()等的参数
用于设置用户名和密码
接受requests.auth.HTTPBasicAuth类
import requests
import requests.auth
url = 'https://mail.qq.com/'
#可传HTTPBasicAuth类
response = requests.get(url,auth=requests.auth.HTTPBasicAuth('3530809393','Hwc020504'))
print(response.text)
#可直接传元组,会默认使用HTTPBasicAuth类来认证
response = requests.get(url,auth=('3530809393','Hwc020504'))
print(response.text)
8,Prepared Request
将请求表示为数据结构,各个参数都可以通过一个Request对象来表示。
该数据结构叫做Prepared Request。
requests.Request()方法:
功能:可以建立一个Request对象。
参数:请求的相关参数,如请求方法(get或post),url,data,headers等
返回:返回一个Request对象
Session对象prepare_request()方法:
功能:将Request对象转换为Prepared Request对象。
参数:Request对象
返回值:Prepared Request对象
Session对象send()方法:
参数:Prepared Request对象实例
返回:返回requests.models.Response对象
代码:
import requests
import requests.auth
url = 'https://httpbin.org/post'
data = {
'name':'lucy',
'age':'19'
}
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebK'
'it/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36 Edg/90.0.818.46'
}
#建立Request对象实例
req = requests.Request('POST',url=url,headers=headers,data=data)
#建立Session对象
s = requests.Session()
#借用Request对象实例建立Prepared Request对象实例
preq = s.prepare_request(req)
#建立Response对象
response = s.send(preq)
print(response.text)