前面在讲 Requests 这个模块的使用时,我们是以没有反爬的 Requests 模块官网为例进行的请求练习,但是平时爬取的很多网站或多或少都会有反爬虫机制的存在,今天我们带大家学习一个爬虫的简单伪装。
HTTP 请求头,简称请求头,是 HTTP 协议传输过程中规定的一系列键值对,它用来描述客户端的环境信息、请求偏好等。请求头是 HTTP 请求的一部分,包含了操作系统、浏览器类型、请求方法(GET、POST 等)、语言等信息。服务器根据这些信息来处理请求并生成适当的响应。
我们说请求头中包含了操作系统、浏览器类型等一系列信息,那么我们前面写的 Requests 发送请求的代码是没有请求头的,所以目标服务器收到请求以后有合理的理由来判定收到的这个请求不正常,可以把请求拒绝掉,返回给我们就是我们所说的 403、418 等状态码,所以爬虫伪装是非常重要的。
我们先找一个网站,来尝试请求一下,使用豆瓣电影 Top250 排行榜:https://movie.douban.com/top250
import requests
URL = 'https://movie.douban.com/top250'
response = requests.get(url=URL)
print("状态码:", response.status_code)
# 状态码:418
上面的代码大家很熟悉了,返回的结果为 418,这个状态码我们在可狱可囚的爬虫系列课程 02:爬虫必会概念这篇文章中讲到过,此处就不再赘述,直接给大家说原因及解决办法:豆瓣电影 Top250 认为我们发出去的请求是一个爬虫,并非正常用户的请求,那么我们只需要借助请求头 Headers 中的 User-Agent 字段即可解决。直接给大家上代码,一会再解释:
import requests
URL = 'https://movie.douban.com/top250'
Headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
}
response = requests.get(url=URL, headers=Headers)
print("状态码:", response.status_code)
# 状态码:200
大家看上述代码,我将请求头 Headers 这个字典与 Requests 进行了结合,在 Requests 发送请求时携带上 Headers,Headers 中借助了 User-Agent 这个键值对,User-Agent 是做什么的呢?
User-Agent 是用户代理,简称“UA”,它是一个特殊字符串头。网站服务器通过识别“UA”来确定用户所使用的操作系统版本、CPU 类型、浏览器版本等信息。 简言之我们借助这个 User-Agent 来将爬虫伪装成正常用户从而骗过网站服务器。
User-Agent 这个键对应的值大家不用记忆,我告诉大家怎么找。
第一步:随便找一个网站,在浏览器中打开的这个网站界面上“右键”,选择“检查”选项打开“开发者工具”(程序员推荐使用谷歌浏览器、火狐浏览器等专业浏览器)。
第二步:在开发者工具的工具栏有一个“Network”的选项,切换过去。
第三步:第二步完成以后你还看不到界面上的内容,此时 Network 窗口下是空白的,我们需要不关闭开发者工具情况下刷新页面,监听到页面加载的内容。
第四步:监听到的文件随便点击一个,在右侧弹出来的窗口中找到“Headers”标签,滚动到最下方,你就能看到 User-Agent 了,然后复制下图中红色椭圆区域的内容即可。
注意:并不是每一个文件一定有 User-Agent,一个文件没有换下一个。