Python3基本请求库-requests
requests
基本请求
import requests
r=request.get('https://www.baidu.com/')
print(type(r))
print(r.status_code)
print(r.cookies)
#get post put delete patch 请求
GET请求
当使用get请求需要填写参数时r=request.get('https://www.baidu.com/',params=xxx)
,如果返回结果得到的是一个json数据可以直接利用r.json()
返回dict字典,也可以利用json.loads(r)
,当返回结果不是JSON格式时,就会出现解析错误json.decoder.JSONDecodeError
import requests
r = requests.get('https://scrape.center/favicon.ico')
#写二进制模式
with open('favicon.ico', 'wb') as f:
#返回一个二进制类型的数据
f.write(r.content)
POST请求
在requests.codes
中有一系列返回值
高级用法
# 文件上传二进制,文件要在当前目录下
import requests
files = {
'file': open('favicon.ico', 'rb')
}
r=requests.post('https://www.httpbin.org/post',files=files)
print(r.text)
Cookie设置
#获取Cookie
import requests
r=requests.post('https://www.baidu.com')
#获取Cookie
print(r.cookies)
for key,val in r.cookies.items():
#将Cookie转为元组组成的列表
print(key+'='+value)
#type类型为RequestsCookieJar
在请求中使用Cookie保持登录状态可以在
headers={'Cookie':'xxx'}
request.get('xxx',headers=headers)
。也可以通过cookies参数设置Cookie的信息,通过构造一个RequestsCookieJarimport requests cookies = 'BIDUPSID=E16F55A9FF7CF6BF07906FA4BEDCF543; PSTM=1680413378; BD_UPN=123253; BAIDUID=E16F55A9FF7CF6BF731AB63A82BC5E32:SL=0:NR=10:FG=1; sug=3; ORIGIN=0; bdime=0; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; BDUSS=H5oTTVFZ1lFWHZoSlVLeTRBSX5rem1aNGZqNU1YSW9hWWVlRlZzWFJUODRibDlrSVFBQUFBJCQAAAAAAAAAAAEAAAC7Iq14yKK49sP719ZqYsTRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADjhN2Q44TdkN; BDUSS_BFESS=H5oTTVFZ1lFWHZoSlVLeTRBSX5rem1aNGZqNU1YSW9hWWVlRlZzWFJUODRibDlrSVFBQUFBJCQAAAAAAAAAAAEAAAC7Iq14yKK49sP719ZqYsTRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADjhN2Q44TdkN; BA_HECTOR=alak04ag8g0h20a48h8g0ld61i3ndoi1m; BAIDUID_BFESS=E16F55A9FF7CF6BF731AB63A82BC5E32:SL=0:NR=10:FG=1; ZFY=3aeAMdk:BG1PVSEjejdIhwUS5bzhZswS3Qh1RcMHJnJ8:C; delPer=1; BD_CK_SAM=1; BD_HOME=1; sugstore=0; channel=baidusearch; PSINO=6; baikeVisitId=7a9d5db3-1be9-44e6-97a2-5e4a0db6ae12; COOKIE_SESSION=4537_0_8_6_21_10_1_0_8_6_1_0_13751_0_0_0_1681633025_0_1681637560%7C9%230_0_1681637560%7C1; H_PS_645EC=23b5%2FDlrjdjm5ydHb7GX6HzG4g7dotMV1q%2F8vhfTWf4zNlGxitUBfmBkvrI; BDRCVFR[ibifSmLtzfY]=mk3SLVN4HKm; H_PS_PSSID=' # 获取RequestsCookieJar对象 jar = requests.cookies.RequestsCookieJar() headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' } # 通过截取cookies中的键值对进行赋值 for cookie in cookies.split(';'): key, val = cookie.split('=', 1) jar.set(key, val) # 将Cookie使用RequestsCookieJar传播 r=requests.get('https://www.baidu.com',headers=headers,cookies=jar) print(r.text)
SSL
当遇到需要SSL证书的网站,导致出现您的连接不是私密连接这样的错误时,如果直接请求网站会抛出SSLError错误,因为请求的URL证书是无效的
如果想解决可以在请求中添加
verify=False
,如果不设置默认为True会自动验证证书。但是设置False后还会显示警告,建议给它指定的证书。可以通过urllib3.disable.warnings()
来忽略警告(from requests.packages import urllib3)。或者捕获警告到日志logging.captureWarnings(True)
(from logging)也可以通过本地证书来用作客户端证书,这可以是单个文件(包含密钥和证书或者一个包含两个文件路径的元组)
cert=('xxx.crt','xxx。key‘)
,本地的key必须是解密状态
超时时间 timeout
当服务器响应过慢后者本地网络状况不佳,最后因为收不到响应而报错,可以使用
timeout=
默认为秒,也可以传入一个元组指连接和读取的时间总和不能超过规定时间。如果永久等待可以设为None,默认为None
身份验证
# 当遇到网站开启了基本身份认证
import requests
from requests.auth import HTTPBasicAuth
r=requests.get('https://ssr3.scrape.center/',auth=HTTPBasicAuth('admin','admin'))
print(r.status_code)
requests中提供元组传入默认使用HTTPBasicAuth r=requests.get('https://ssr3.scrape.center/',auth=('admin','admin'))
代理设置
当请求网站几次能够正常获取内容,但是大规模且频繁爬取,可能会弹出验证码或者跳转到登录认证页面也可能会直接禁封IP。
import requests
proxies={
'http':'http://10.10.10.10:8080',
'https':'http://10.10.10.10:8080'
}
request.get('https://www.httpbin.org/get',proxies=proxies)
身份认证类似https://user:password@10.10.10.10:8080/
,SOCKS协议代理需要导入 pip3 install 'requests[socks]'
https://socks5://user:password@host:port
Prepared Request
在使用requests请求时会在内部构造一个Request对象,并给这个对象赋各种参数,包括url、headers、data等。并把这个Request对象发送出去,请求成功后解析Response对象。
from requests import Request,Session
url='https://www.httpbin.org/post'
data={'name':'kang'}
headers={
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'
}
s=Session()
req=Request('POST',url,data=data,headers=headers)
prepped=s.prepare_request(req)
r=s.send(perpped)
print(r.text)
#Request对象可以更灵活的实现请求和各种操作