目录
一、 发送 GET 请求
1.不携带 url 参数的 GET 请求
2.携带 url 参数的 GET 请求
二、发送 POST 请求
三、处理响应
1.获取网页源代码
2.获取图片
一、 发送 GET 请求
当用户在浏览器的地址栏中直接输入某个 URL 地址或者单击网页上的某个超链接时,浏
览器会使用 GET 方法向服务器发送请求。例如,在浏览器的地址栏中分别输入
https://www.baidu.com/ 和 https://www.baidu.com/s?wd=python ,按 Enter 键后打开百度首页和
python 关键词的查询结果页面。此时我们用 Fiddler 工具捕获刚刚发送的两个请求,可以看到
这两个请求的请求方法都是 GET 。
在 Requests 库中, get() 函数用于向服务器发送 GET 请求。该函数会根据传入的 URL 构
建一个请求(每个请求都是 Request 类的对象),之后将该请求发送给服务器。 get() 函数的声
明如下:
get(url, params=None, headers=None, cookies=None, verify=True,proxies=None, timeout=None, **kwargs)
上述函数中各参数的含义如下。
- url:必选参数,表示请求的 URL。
- params:可选参数,表示请求的查询字符串。该参数支持 3 种类型的取值,分别为字
典、元组列表、字节序列。当该参数的值是一个字典时,字典的键为 url 参数,字典的值为 url
参数对应的值,例如 {"ie": "utf-8","wd": "python"} 。
- headers:可选参数,表示请求的请求头,该参数只支持字典类型的值。
- cookies:可选参数,表示请求的 Cookie 信息,该参数支持字典或 CookieJar 类的对象。第 3 章 抓取静态网页数据 045
- verify:可选参数,表示是否启用 SSL 证书,默认值为 True。
- proxies:可选参数,用于设置代理服务器,该参数只支持字典类型的值。
- timeout:可选参数,表示请求网页时设定的超时时长,以秒为单位。
下面分别以访问百度首页和 python 关键词的查询结果页面为例,演示如何使用 get() 函数
发送不携带 url 参数和携带 url 参数的 GET 请求。
1.不携带 url 参数的 GET 请求
若 GET 请求的 URL 中不携带参数,我们在调用 get() 函数发送 GET 请求时只需要给 url 参
数传入指定的 URL 即可。例如,使用 get() 函数发送 GET 请求访问百度首页,具体代码如下。
import requests
# 准备 URL
base_url = 'https://www.baidu.com/'
# 根据 URL 构造请求,发送 GET 请求,接收服务器返回的响应信息
response = requests.get(url=base_url)
# 查看响应码
print(response.status_code)
上述代码中,首先定义了一个代表请求 URL 地址的变量 base_url ,然后调用 requests 库
中的 get() 函数发送 GET 请求。当百度服务器接收到请求后会返回响应信息,并将响应信息保
存到 response 中。最后通过访问 response 的 status_code 属性查看响应状态码,以确认此次访
问是否成功。
运行代码,输出如下结果。
200
从输出的结果可以看出,服务器返回的响应状态码为 200 ,说明成功访问了百度首页。
2.携带 url 参数的 GET 请求
如果 GET 请求的 URL 中携带参数,那么我们在调用 get() 函数时可以采用两种方式发送
GET 请求。第 1 种方式是将参数以“ ? 参数名 1= 值 1& 参数名 2= 值 2... ”的形式拼接到 URL 后
面,进而手动构建完整的 URL ,例如 https://www.baidu.com/s?wd=python ,并将完整的 URL
传入 url 参数;第 2 种方式是将 url 参数转换为字典,之后将该字典传入 params 参数。
第 1 种方式的实现代码如下。
import requests
base_url = 'https://www.baidu.com/s'
param = 'wd=python'
# 拼接完整的 URL
full_url = base_url + '?' + param
# 根据 URL 构造请求,发送 GET 请求,接收服务器返回的响应信息
response = requests.get(full_url)
# 查看响应码
print(response.status_code)
运行代码,输出如下结果。
200
第 2 种方式的实现代码如下。
import requests
base_url = 'https://www.baidu.com/s'
wd_params = {'wd': 'python'}
# 根据 URL 构造请求,发送 GET 请求,接收服务器返回的响应
response = requests.get(base_url, params=wd_params)
# 查看响应码
print(response.status_code)
运行代码,输出如下结果。
200
通过观察两次的输出结果可知,服务器返回的响应状态码都为 200 。这说明我们成功访问
了 python 关键词的查询结果页面。
二、发送 POST 请求
如果网页上 form 表单的 method 属性的值为 POST ,那么当用户提交表单时,浏览器将使
用 POST 方法提交表单内容,并将各个表单元素及数据作为 HTTP 请求信息中的请求数据发
送给服务器。例如登录美多商城时发送的请求是 POST 请求。此时使用 Fiddler 工具捕获该请
求,可以看到发送该请求时的请求数据,具体如图 3-1 所示。
在 Requests 中, post() 函数用于向服务器发送 POST 请求。该函数会根据传入的 URL 构建
一个请求,将该请求发送给服务器,并接收服务器成功响应后返回的响应信息。 post() 函数的
声明如下:
post(url, data=None, headers=None, cookies=None, verify=True, proxies=None, timeout=None, json=None, **kwargs)
post()与 get() 函数的参数大致相同,除了 get() 函数中介绍过的参数以外, post() 函数中其
他参数的含义如下。
- data:可选参数,表示请求数据。该参数可以接收 3 种类型的值,分别为字典、字节
序列和文件对象。当参数值是一个字典时,字典的键为请求数据的字段,字典的值为请求数
据中该字段对应的值,例如 {"ie": "utf-8","wd": "python"} 。
- json:可选参数,表示请求数据中的 JSON 数据。
下面以美多商城网站为例,为大家演示如何使用 post() 函数请求美多商城网站首页,具体
代码如下。
import requests
base_url = 'http://mp-meiduo-python.itheima.net/login/'
# 准备请求数据
form_data = { 'csrfmiddlewaretoken':
'FDb8DNVnlcFGsjIONtwiQoi6PtmCLeBsRgyjx2o2nsZ4MXDEGDeM2dUImEkj9O7t', 'username': 'admin', 'pwd': 'admin', 'remembered': 'on'
}
# 根据 URL 构造请求,发送 POST 请求,接收服务器返回的响应信息
response = requests.post(base_url, data=form_data)
# 查看响应信息的状态码
print(response.status_code)
运行代码,输出如下结果。
200
从输出结果可以看出,服务器返回的响应状态码为 200 。这说明我们成功访问了美多商
城网站首页。
三、处理响应
当服务器返回的响应状态码为 200 时,说明本次 HTTP 请求成功,此时可以接收到由服
务器返回的响应信息。在 Requests 库中, Response 类的对象中封装了服务器返回的响应信息,
那些响应信息包括响应头和响应内容等。除了前面介绍的 status_code 属性之外, Response 类
还提供了一些其他属性。 Response 类的常用属性如表 3-1 所示。
在表 3-1 中, text 属性和 content 属性都可以获取响应内容。其中, text 属性会根据
Requests 库推测的编码方式将响应内容编码为字符串类型的数据; content 属性用于获取二进
制形式的响应内容。若需要从响应内容中提取文本,则可以使用 text 属性获取响应内容;若
需要从响应内容中提取图片、文件等,则可以使用 content 属性获取响应内容。
接下来,为大家演示如何使用 text 属性和 content 属性获取网页源代码和图片。
1.获取网页源代码
通过访问 Response 类的对象的 text 属性可以获取字符串形式的网页源代码。例如,访问 3.2.1
节请求百度首页示例中 Response 对象的 text 属性获取百度首页源代码,具体代码如下。
# 获取网页源代码
print(response.text)
运行代码,控制台输出了一段 HTML 代码。由于这段代码的格式比较混乱,所以我们在
这里按 HTML 标准格式调整了代码,调整后的结果如下。
<!DOCTYPE html>
<!--STATUS OK-->
<html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> <meta content="always" name="referrer" /> <link rel="stylesheet" type="text/css" href="https://ss1.bdstatic.com/ 5eN1bjq8A
AUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css" />
<title>ç™¾åº¦ä¸ ä¸‹ï
¼Œä½ 就知é "</title> </head> <body link="#0000cc"> ......(部分省略)</div> </div> </div> </body>
</html>
对照浏览器中查看的百度首页的源代码可知,标签<title> 中的中文没有正常显示,而是出
现了乱码。这是因为 Requests 库推测的编码格式 ISO-8859-1 与百度首页实际使用的编码格式
UTF-8 不一致。此时需要通过 Response 对象的 encoding 属性将编码格式设置为 UTF-8 。
在 3.2.1 节请求百度首页示例中发送请求的代码之后,增加设置 Response 对象编码格式的
代码,改后的代码如下。
import requests
# 准备 URL
base_url = 'https://www.baidu.com/'
# 根据 URL 构造请求,发送 GET 请求,接收服务器返回的响应信息
response = requests.get(url=base_url)
# 设置响应内容的编码格式
response.encoding = 'utf-8'
# 查看响应内容
print(response.text)
再次运行代码,输出如下结果。
<html> <head></head> <body link="#0000cc"> <!--STATUS OK--> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> <meta content="always" name="referrer" /> <link rel="stylesheet" type="text/css" href="https://ss1.bdstatic.com/5eN1bjq8
AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css" /> <title>百度一下,你就知道</title> ……(部分省略)</body>
</html>
从输出结果可以看出,网页源代码中的中文已经能够正常显示了。
2.获取图片
百度首页上除了文字信息之外,还包含一个百度标志(Logo )图片。若希望获取百度 Logo
的图片,则需要先根据该图片对应的请求 URL 发送请求,再使用 content 属性获取该图片对
应的二进制数据,并将数据写入本地文件中,具体代码如下。
import requests
base_url = 'https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png'
response = requests.get(base_url)
# 获取百度 Logo 图片对应的二进制数据
print(response.content)
# 将二进制数据写入程序所在目录下的 baidu_logo.png 文件中
with open('baidu_logo.png', 'wb') as file: file.write(response.content)
运行代码,在程序所在的目录下可以看到新创建的文件 baidu_logo.png ,打开该文件后显
示的内容如图 3-2 所示。