requests之高级用法:文件上传、Cookie设置、Session保持、SSL证书验证、超时设置、身份认证、URL编码与解码、获取二进制数据
作者:YXN-python 阅读量:377 发布日期:2022-11-24
1、文件上传
requests 通过 post 实现文件上传方式如下:
import requests
url = 'https://www.httpbin.org/post'
with open('favicon1.ico', 'rb') as file:
files = {'file':file}
response = requests.post(url=url, files=files)
print(response.text)
2、Cookie 设置
requests 相比 urllib 操作 Cookie 更加简便。
获取 Cookie 方式如下
import requests
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'
}
url = 'https://www.baidu.com'
response = requests.get(url=url, headers=headers)
print(response.cookies)
for key, value in response.cookies.items():
print(key+' = '+value)
使用 cookies 属性维持登录状态。
登录网站,将请求头中的 Cookie 内容进行复制,并将其设置到 requests.get 的请求头里面,如下所示:
import requests
headers = {
'Cookie':'xxxxxx'
}
url = 'https://github.com/'
response = requests.get(url=url, headers=headers)
print(response.text)
运行输出结果包含了需要登录才能包含的结果,说明使用 Cookie 成功模拟了 登录状态。
通过 cookies 参数来设置 Cookie 的信息。
构造 RequestsCookieJar 对象,然后使用复制的 cookies 对 Cookie 进行赋值,使用方式如下:
import requests
cookies = 'xxxxxx'
jar = requests.cookies.RequestsCookieJar()
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'
}
for cookie in cookies.split(';'):
key, value = cookie.split('=',1)
jar.set(key, value)
url = 'https://github.com/'
response = requests.get(url=url, cookies=jar, headers=headers)
print(response.text)
先创建了一个RequestCookieJar对象,利用split对cookie进行分割,然后利用set方法设置每条cookie的键值对。通过requests库的get方法并把RequestsCookieJar对象通过cookies参数传递到函数,实现维持登录。
3、Session 维持
直接利用 requests 库中的 get 或 post 方法可以做到模拟网页的请求,但实际上相当于打开了两个浏览器,具有不同的 Session;验证方法如下:
import requests
url = 'https://www.httpbin.org/cookies/set/username/admin001'
response = requests.get(url)
cookies = requests.get('https://www.httpbin.org/cookies')
print(cookies.text)
运行输出结果如下,多次请求不能获取设置的 cookie:
{
"cookies": {}
}
而利用 Session 对象,可以更方便的维护 Session,不用担心 Cookie问题,示例如下:
import requests
url = 'https://www.httpbin.org/cookies/set/username/admin001'
session = requests.Session()
session.get(url)
response = session.get('https://www.httpbin.org/cookies')
print(response.text)
运行输出结果如下,多次请求能够获取设置的 cookie:
{
"cookies": {
"username": "admin001"
}
}
4、SSL 证书验证
有些网站没有设置好 HTTPS 证书,或者 HTTPS 证书不被 CA 机构认可,这些网站就会出现 SSL 证书错误提示。使用 requests 库请求证书错误的网站,设置 requests 方法不验证证书,即 verify=False,则可跳过验证网站证书,从而获取网页内容:
import requests
url = 'https://ssr2.scrape.center/'
response = requests.get(url=url, verify=False)
print(response.status_code)
报出 InsecureRequestWarning 警告,但得到了请求成功的状态码:
5、超时设置
为了防止网络状况不好,服务器不能及时响应而报错,可以通过 timeout 参数设置超时时间。
import requests
url = 'https://www.httpbin.org/get'
response = requests.get(url=url, timeout=100)
print(response.status_code)
timeout 参数表示该时间范围内没有响应,就抛出timeout异常,该参数默认为 None,表示只要服务器还在运行,就不会返回超时错误。
6、身份认证
requests 库可以通过 auth 参数设置,实现身份认证功能。使用方法如下:
import requests
url = 'https://ssr3.scrape.center/'
auth = ('admin', 'admin')
response = requests.get(url=url, auth=auth)
print(response.status_code)
状态码返回 200,即表示身份认证成功;否则返回 401,表示认证失败。
7、代理设置
在大规模爬虫的时候,频繁的请求会触发网站的反爬虫机制,爬虫客户 IP 会被标记异常,通常会需要重新登录或输入验证码证明非爬虫操作,或者会被直接封禁 IP,使得一定时间内禁止访问。
requests 库可以通过 proxies 参数设置代理伪装成多个机器对网站的访问,解决反爬虫机制的影响。使用方法如下:
import requests
proxies = {
'http':'http://47.109.52.147:80',
'https':'https://47.109.52.147:80'
}
url = 'https://www.httpbin.org/get'
response = requests.get(url=url, proxies=proxies, verify = False)
print(response.status_code)
其他
URL编码与解码
从地址栏里拿出数据 都会被Url进行编码和解码
from urllib import parse # 内置模块 info1 = parse.quote('Mr.梅') # 编码 info2 = parse.unquote('Mr.%E6%A2%85') # 解码 print(info1) # Mr.%E6%A2%85 print(info2) # Mr.梅
响应Response
import requests # Response对象有很多属性和方法
header = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)AppleWebKit/537.36(KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36', }
respone = requests.get('https://www.jianshu.com', params={'name': 'Like', 'age': 20}, headers=header)
# respone属性
print(respone.text) # 响应体的文本内容
print(respone.content) # 响应体的二进制内容
print(respone.status_code) # 响应状态码
print(respone.headers) # 响应头
print(respone.cookies) # 响应cookie
print(respone.cookies.get_dict()) # cookieJar对象,获得到真正的字段
print(respone.cookies.items()) # 获得cookie的所有key和value值
print(respone.url) # 请求地址
print(respone.history) # 访问这个地址,可能会重定向,放了它冲定向的地址
print(respone.encoding) # 页面编码
获取二进制数据
图片
res = requests.get('https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fup.enterdesk.com%2Fedpic_source%2F81%2F71%2F2b%2F81712bdce2d6966b9942f249031aba8e.jpg&refer=http%3A%2F%2Fup.enterdesk.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1671809061&t=bc2a02c107ba2835560c30bb4811c822')
with open('MeiNu.jpg', 'wb')as f:
f.write(res.content)
视频
res=requests.get('https://vd3.bdstatic.com/mda-mk21ctb1n2ke6m6m/sc/cae_h264/1635901956459502309/mda-mk21ctb1n2ke6m6m.mp4')
with open('美女.mp4', 'wb') as f:
for line in res.iter_content():
f.write(line)
自动重试
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))
def safe_download():
response = requests.get(url, stream=True)
if response.status_code != 200:
raise Exception('错误')
return response
YXN-python
2022-11-24