Python爬虫入门 ~ 爬虫相关概念(三)

102 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第15天,点击查看活动详情

请求对象的定制

url的组成

在一个url连接中,例如:https://juejin.c:443n/vip?utm_source=web_nav#anchorPoint,有6个组成部分:

  • 协议:http或者https是协议部分
  • 主机/域名:juejin.cn是域名部分
  • 端口号:443https协议的默认端口号,如果是http协议则默认为80
  • 路径:vip
  • 参数:utm_source=web_nav,问号后面有xxxx=xxxx的均为参数,多参数使用&符号连接
  • 锚点:anchorPoint#后面的是锚点

案例演示 同样是打开百度网站,但是我们这次换成了https协议,结果请求到的数据却很少,跟前面http拿到的天差地别。

image.png

这是由于反爬限制了我们的请求,我们需要定制一个请求对象,来避开它的一个反爬策略才行。

UA

User Agent:用户代理(User Agent,简称 UA),是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

想跟深入了解的小伙伴,可以点击查看更多

我们可以在浏览器中打开任意一个页面,按F12来打开以下窗口,选择Network标签页,找任意一个请求,选择Headers,拉到最下方即可看到User Agent

image.png

了解了UA之后,我们就拿它来定义一个新的请求对象,让对方误以为我们是正常的浏览器请求吧。

  1. 首先,我们将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'
}
  1. 在将urlheaders组装成一个Request对象
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
print(response.read().decode())
  1. 再次运行代码,这次就可以看到正常请求到的源码了

image.png

注意: 这里有一个点需要注意的是,之前我们通过 urllib.request.urlopen()都是传入的参数,这次我们传入的是一个Request对象,按住Ctrl键点击urlopen()函数,我们可以看到它有这样一段提示:

image.png

说传入的参数要字符串,或者是Request对象。由于上面的参数中并没有headers的存在,所以我们只能组装出一个Request对象作为参数传递进来使用。

image.png

Request对象的构造函数中,就有着urlheaders这两个属性的存在。