开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第15天,点击查看活动详情
请求对象的定制
url的组成
在一个url连接中,例如:https://juejin.c:443n/vip?utm_source=web_nav#anchorPoint,有6个组成部分:
- 协议:
http或者https是协议部分 - 主机/域名:
juejin.cn是域名部分 - 端口号:
443是https协议的默认端口号,如果是http协议则默认为80 - 路径:
vip - 参数:
utm_source=web_nav,问号后面有xxxx=xxxx的均为参数,多参数使用&符号连接 - 锚点:
anchorPoint,#后面的是锚点
案例演示
同样是打开百度网站,但是我们这次换成了https协议,结果请求到的数据却很少,跟前面http拿到的天差地别。
这是由于反爬限制了我们的请求,我们需要定制一个请求对象,来避开它的一个反爬策略才行。
UA
User Agent:用户代理(User Agent,简称 UA),是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
想跟深入了解的小伙伴,可以点击查看更多
我们可以在浏览器中打开任意一个页面,按F12来打开以下窗口,选择Network标签页,找任意一个请求,选择Headers,拉到最下方即可看到User Agent。
了解了UA之后,我们就拿它来定义一个新的请求对象,让对方误以为我们是正常的浏览器请求吧。
- 首先,我们将
UA定义成为一个字典对象
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
}
- 在将
url与headers组装成一个Request对象
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
print(response.read().decode())
- 再次运行代码,这次就可以看到正常请求到的源码了
注意: 这里有一个点需要注意的是,之前我们通过 urllib.request.urlopen()都是传入的参数,这次我们传入的是一个Request对象,按住Ctrl键点击urlopen()函数,我们可以看到它有这样一段提示:
说传入的参数要字符串,或者是Request对象。由于上面的参数中并没有headers的存在,所以我们只能组装出一个Request对象作为参数传递进来使用。
在Request对象的构造函数中,就有着url和headers这两个属性的存在。