requests 之 高级用法:文件上传、Cookie设置、Session保持、SSL证书验证、超时设置、身份认证...

requests 库还具有一些高级用法,如文件上传、Cookie设置、Session保持、SSL证书验证、超时设置、身份认证等。

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)

运行输出结果如下:

requests 之 高级用法:文件上传、Cookie设置、Session保持、SSL证书验证、超时设置、身份认证..._第1张图片

2、Cookie 设置

requests 相比 urllib 操作 Cookie 更加简便。

获取 Cookie 方式如下

# ********************************
# requests.get get cookies
# ********************************
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)

运行输出结果如下:

requests 之 高级用法:文件上传、Cookie设置、Session保持、SSL证书验证、超时设置、身份认证..._第2张图片

使用 cookies 属性维持登录状态。

登录网站,将请求头中的 Cookie 内容进行复制,并将其设置到 requests.get 的请求头里面,如下所示:

# ********************************
# requests.get: use cookies to keep login status
# ********************************
import requests
headers = {
    'Cookie':'_octo=GH1.1.678963360.1671760847; preferred_color_mode=light; tz=Asia%2FShanghai; color_mode=%7B%22color_mode%22%3A%22auto%22%2C%22light_theme%22%3A%7B%22name%22%3A%22light%22%2C%22color_mode%22%3A%22light%22%7D%2C%22dark_theme%22%3A%7B%22name%22%3A%22dark%22%2C%22color_mode%22%3A%22dark%22%7D%7D; logged_in=yes; dotcom_user=xxxxxx'
}
url = 'https://github.com/'
response = requests.get(url=url, headers=headers)
print(response.text)

运行输出结果包含了需要登录才能包含的结果,说明使用 Cookie 成功模拟了 登录状态。

通过 cookies 参数来设置 Cookie 的信息。构造 RequestsCookieJar 对象,然后使用复制的 cookies 对 Cookie 进行赋值,使用方式如下:

import requests
cookies = '_octo=GH1.1.678963360.1671760847; preferred_color_mode=light; tz=Asia%2FShanghai; color_mode=%7B%22color_mode%22%3A%22auto%22%2C%22light_theme%22%3A%7B%22name%22%3A%22light%22%2C%22color_mode%22%3A%22light%22%7D%2C%22dark_theme%22%3A%7B%22name%22%3A%22dark%22%2C%22color_mode%22%3A%22dark%22%7D%7D; logged_in=yes; dotcom_user=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 库请求证书错误的网站,如下:

import requests
url = 'https://ssr2.scrape.center/'
response = requests.get(url)
print(response.status_code)
运行输出结果如下,出现 SSLError:
requests.exceptions.SSLError: HTTPSConnectionPool(host='ssr2.scrape.center', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1051)')))

设置 requests 方法不验证证书,即 verify=False,则可跳过验证网站证书,从而获取网页内容:

import requests
url = 'https://ssr2.scrape.center/'
response = requests.get(url=url, verify=False)
print(response.status_code)

运行输出结果如下,报出 InsecureRequestWarning 警告,但得到了请求成功的状态码:

...\lib\site-packages\urllib3\connectionpool.py:1063: InsecureRequestWarning: Unverified HTTPS request is being made to host 'ssr2.scrape.center'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  InsecureRequestWarning,
200

5、超时设置

为了防止网络状况不好,服务器不能及时响应而报错,可以通过 timeout 参数设置超时时间。

# ********************************
# requests.get: 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 参数设置,实现身份认证功能。使用方法如下:

# ********************************
# requests.get: auth
# ********************************
import requests
url = 'https://ssr3.scrape.center/'
auth = ('admin', 'admin')
response = requests.get(url=url, auth=auth)
print(response.status_code)

状态码返回 200,即表示身份认证成功;否则返回 401,表示认证失败。

6、代理设置

在大规模爬虫的时候,频繁的请求会触发网站的反爬虫机制,爬虫客户 IP 会被标记异常,通常会需要重新登录或输入验证码证明非爬虫操作,或者会被直接封禁 IP,使得一定时间内禁止访问。

requests 库可以通过 proxies 参数设置代理伪装成多个机器对网站的访问,解决反爬虫机制的影响。使用方法如下:

# ********************************
# requests.get: 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)

后续公众号会发布系列教程,更多内容请关注公众号:程序猿学习日记

你可能感兴趣的:(Python,python,爬虫)