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 关键字参数传递字典类型数据,数据中包含 http
和https
的键。值的格式分别为: 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)