requests - 请求http协议链接

requests是请求http协议链接的第三方库。

官方文档链接:https://docs.python-requests.org/zh_CN/latest/

安装以及导入

安装:

> pip install requests

导入:

import requests   # 以下代码块中将省略导入库代码

访问链接

根据http协议的请求类型,requests库以同名函数的方式一一对应:

requests.get(url)
requests.post(url)
requests.put(url)
requests.delete(url)
requests.head(url)
requests.options(url)

例:
r = requests.get('https://www.baidu.com')

传递参数

get请求中,使用 params 关键字参数传递字典类型的数据。requests会自行将数据组合到url中。

r = requests.get('http://www.baidu.com', params={'k1': 'v1'})
print(r.url)
# 结果为:http://www.baidu.com/?k1=v1

post 请求中,使用 data 关键字参数传递字典类型的数据。

import requests

r = requests.post('http://www.baidu.com', data={'k1': 'v1'})
print(r.url)
# 

返回内容

通过 requests访问url后,返回一个对象。若打印此对象,可展示的对象名字中有状态码。对象中有一系列属性和方法可以处理访问url后得到的数据。

r = requests.get('http://www.baidu.com')
print(r)  # 结果为:<Response [200]>
r = requests.get('http://www.baidu.com/cs')
print(r)  # 结果为:<Response [404]>

属性与方法:

- text                  返回字符串类型的数据,若是网页则返回字符串类型的html代码
- content               返回二进制的数据,若是网页则返回二进制的html代码
- json()                返回列表或字典,一般仅用于访问API接口
- encoding              查看当前数据的编码格式,通过赋值可修改编码格式
- raise_for_status()    状态码非200时会报错,状态码为200时为None
- status_code           返回状态码
- url                   返回请求的url
- history               返回列表,列表内的元素是重定向的请求对象
- headers               响应的headers部分
- request.headers       请求的headers部分

例:
r = requests.get('https://api.github.com/events')
print(type(r.text))               # 结果为:<class 'str'>
print(type(r.content))            # 结果为:<class 'bytes'>
print(r.encoding)                 # 结果为:utf-8
print(type(r.json()))             # 结果为:<class 'list'>
print(r.raise_for_status())       # 结果为:None
print(r.status_code)              # 结果为:200

headers

通过 headers 关键字参数传递字典类型的数据,修改 Reqeust Headers 中的属性。在开发者工具中,网页请求中的 Reqeust Headers 项中的属性都可以修改。

请求后,可使用 headers[<key>] 或者 headers.get(<key>)获取响应头信息。

headers = {'user-agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"}
r = requests.get('http://httpbin.org/cookies', headers=headers)

print(r.headers['Content-Type'])  # 结果为:application/json
print(r.headers.get('Date'))      # 结果为:Tue, 02 Nov 2021 03:29:03 GMT

cookies

通过cookies关键字参数传递字典类型的数据。

cookies = {'k11': 'v11'}
r = requests.get('http://httpbin.org/cookies', cookies=cookies)
print(r.json())  # 结果为:{'cookies': {'k11': 'v11'}}

超时

通过timeout关键字参数设置超时时间。若请求时间超出设置时间,则报错。

r = requests.get('http://www.baidu.com', timeout=0.01)
# 'Connection to www.baidu.com timed out. (connect timeout=0.01)'

会话对象

通常使用爬虫时,需要登录等认证信息的情况下,一般认证信息都保存在cookie中,我们在浏览器中登录并直接从浏览器中拿到这些cookie,并直接在代码中设置这些cookie。是可以通过登录认证的。

但是如果认证有过期时间或者其他原因失效了,我们需要手动再操作一遍并修改代码。这不是一个很好的方式。session() 会话就是很棒的处理方式。

session() 会话可以进行多次url请求,并且url请求会保持请求时设定的cookie

# 创建一个会话
s = requests.Session()
# 在会话对象中使用 get 方式请求 url,此url为设置cookie,模拟登录
s.get('http://httpbin.org/cookies/set/k1/v1')
# 在会话对象中使用 get 方式请求 url,此url为获取已设置的cookie
r = s.get("http://httpbin.org/cookies")
print(r.json())  # 结果为:{'cookies': {'k1': 'v1'}}

注意:即使使用会话,在请求中设置的参数仅此请求有效。长期有效必须将参数设置在会话中:

s = requests.Session()
# 在请求中添加cookie
r = s.get("http://httpbin.org/cookies", cookies={"k1": "v1"})
print(r.json())
# 上次请求中添加的cookie在本次请求中无效
r = s.get("http://httpbin.org/cookies")
print(r.json())

# 在会话中设置cookie
s.headers.update({"Cookie": "k1=v1"})
# 请求中不设置cookie也有效
r = s.get("http://httpbin.org/cookies")
print(r.json())

代理

代理使用 proxies 关键字参数传递字典类型数据,数据中包含 httphttps的键。值的格式分别为: http://<IP>:<PORT>https://<IP>:<PORT>

proxies = {
    'http': "",
    'https': "http://36.112.139.146:3128"
}

r = requests.get('https://www.baidu.com', proxies=proxies)
print(r.status_code)