Python urllib库使用起来很麻烦,尤其是在进行网络爬取时。比如在处理网页验证和cookies的时候,需要编写Opener和Handler来处理。为了更方便地实现这些操作,有一个更强大的Requests库。
安装requests
requests是第三方库,不是Python内置库,需要手动安装。
相关链接
- GitHub:HTTPS://github.com/psf/requests
- PyPI:https ://pypi.org/project/requests/
- 官方文档:https ://docs.python-requests.org/en/latest/
通过 pip 安装
可以通过pip来安装requests,在命令行界面运行以下命令,完成requests库的安装:
pip install requests
requests的基本用法
下面的代码示例使用requests中的 get ()方法发送一个 get 请求。
import requests
# 发送 get 请求
r = requests.get('https://www.baidu.com')
# 检查响应类型
print(type(r))
# 检查状态码
print(r.status_code)
# 检查响应内容类型
print(type(r.text))
# 检查响应内容
print(r.text)
# 检查 cookie
print(r.cookies)
这里get()调用该方法实现与urllib库中的urlopen()一致,结果返回一个响应对象,然后分别输出响应对象类型、状态码、响应体内容类型、响应体内容、Cookies。
从运行结果可以知道,响应对象requests.models.Response的类型,响应体内容str的类型,Cookies的类型是RequestCookieJar。如果要发送其他类型的请求,可以直接调用其对应的方法:
r = requests.post('https://www.baidu.com')
r = requests.put('https://www.baidu.com')
r = requests.delete('https://www.baidu.com')
r = requests.head('https://www.baidu.com')
r = requests.options('https://www.baidu.com')
获取请求
构建一个GET请求,请求https://www.baidu.com(网站会判断如果客户端发起GET请求,会返回相应的信息)
import requests
r = requests.get('http://httpbin.org/get')
print(r.text)
输出将如下所示:

- 如果要添加请求参数,例如添加两个请求参数,其中name值为jack,age值为20。可以写成:
r = requests.get(' http://httpbin.org/get?name=jack&age=20' )
但是推荐最佳的写法如下:
import requests
data = {
'name':'jack',
'age':20,
}
r = requests.get(' http://httpbin.org/get',params=data )
print(r.text)
输出将如下所示:

网页返回内容的类型为 type str。如果符合 json 格式,可以使用json()方法将其转为字典类型,方便解析。
import requests
r = requests.get('http://httpbin.org/get' )
# str type
print(type(r.text))# 以字典形式返回
print(r.json())
print(type(r.json()))
输出:

POST 请求
发送 POST 请求
import requests
r = requests.post(' http://httpbin.org/post' )
print(r.text)
输出:
POST 请求
发送 POST 请求
import requests
r = requests.post(' http://httpbin.org/post' )
print(r.text)
输出:

Prepared封装请求头
有时如果需要设置请求头,需要用一个Request对象来表示。在 requests 库中,有一个类似的类,叫做 Prepared Request。
from requests import Request,Session
url = 'http://httpbin.org/post'
data = {
'name':'jack'
}
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0'
}
s = Session()
req = Request('POST',url,data=data, headers=headers)
prepped = s.prepare_request(req)
r = s.send(prepped)
print(r.text)
Request这里引入,然后Request用url、data和headers参数构造一个对象。这时候就需要调用prepare_request()Session的方法将其转化为Prepared Request对象,然后调用该send()方法发送。
这样做的好处是可以使用Request把请求当成一个独立的对象,这样对于队列调度非常方便,后面会用来构造一个Request队列。




