静态网页发送基本请求

目录

一、 发送 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>&ccedil;™&frac34;&aring;&ordm;&brvbar;&auml;&cedil; &auml;&cedil;‹&iuml;
&frac14;Œ&auml;&frac12; &aring;&deg;&plusmn;&ccedil;Ÿ&yen;&eacute; "</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 所示。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值