复杂的网络请求
Request类简介
上一节的urlopen方法能够发送一个基本的网络请求,但这并不是一个完整的网络请求。一个完整的网络请求,需要包括Headers, Cookies和代理IP等内容,这样才能更好的模拟一个浏览器所发送的网络请求。?Request类则可以为我们解决这个问题
其语法的基本格式如下
urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
# ***************************
# 参数说明:
# url : 需要访问网站的URL的完整地址
# data : 该参数默认为None,通过该参数确认请求方式;
# 若为None,则以GET
# 否则的话为POST,在发送POST请求时,参数data需要以字典形式的数据作为参数的值
# 并且需要将字典形式的参数值转化为字节类型的数据才可以实现POST请求
# headers : 设置请求头部信息, 该参数为字典型。添加请求头最常用的方法就是修改 User-Agent 来伪装 # 成浏览器。例如:
# headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)/
# AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'}
# 伪装成谷歌浏览器进行网络请求
# origin_req_host : 用于是设置请求方的host名称或者IP
# unverifiable : 用于验证网页是否需要验证,默认为False
# method : 用于设置请求方法
设置请求头信息
import urllib.parse
import urllib.request
url = 'https://www.httpbin.org/post'
# 定义请求头部信息
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'}
# 将表单数据转化bytes类型,并编码方式为UTF-8
dict1 = {'hello': 'python'}
data = bytes(urllib.parse.urlencode(dict1), encoding='utf-8')
# 创建 Request 对象
r = urllib.request.Request(url=url, data=data, headers=headers, method='POST')
response = urllib.request.urlopen(r)
print(response.read().decode('utf-8'))
运行结果如下
{
"args": {},
"data": "",
"files": {},
"form": {
"hello": "python"
},
"headers": {
"Accept-Encoding": "identity",
"Content-Length": "12",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "www.httpbin.org",
# 自定义的请求头信息
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36",
"X-Amzn-Trace-Id": "Root=1-616c0fa1-36cc80405a3d11116f912a4a"
},
"json": null,
"origin": "61.190.213.226",
"url": "https://www.httpbin.org/post"
}
进程已结束,退出代码为 0
Cookie 的获取与设置
在实现爬虫的模拟登录中,首选需要获取登录的请求地址,然后通过POST的请求方式将正确的用户名和密码发送至登录验证的后台地址
(1)在谷歌浏览器中打开地址(http://site2.rjkflm.com:666/), 然后单击网页中右上角的“登录”
(2) 按下F12 进入开发者模式勾选 Preserve log (持续记录)
?(3) 在登陆界面输入正确的用户名和密码,然后单击立即登入, 然后在开发者模式界面,请求列表中找到 “chklogin.html”文件
?(4) 向下找到登入验证所需要的表单数据
?(5)接下来使用POST请求方式实现模拟的登录
import urllib.request
import urllib.parse
url = 'http://site2.rjkflm.com:666/index/index/chklogin.html'
# 将表单数据转化为bytes
dict1 = {'username': '********', 'password': '*******'}
data = bytes(urllib.parse.urlencode(dict1), encoding='utf-8')
# 创建Request对象
r = urllib.request.Request(url=url, data=data, method='POST')
response = urllib.request.urlopen(r)
print(response.read().decode('utf-8'))
运行结果如下
{"status":true,"msg":"登录成功!"}
进程已结束,退出代码为 0
|