您现在的位置是:网站首页 > 博客日记 >

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