当你开始进行网页爬取时,你会发现脚本有时会莫名其妙地被阻止。网站似乎知道你不是在使用真实的浏览器,察觉到你的意图后就会阻止你的访问。解决这个问题其实很简单——只需更改你的用户代理头。
请继续阅读,了解什么是用户代理、最常见的用户代理有哪些,以及如何调整代码来模拟浏览器的用户代理头。
什么是用户代理,为什么它对网页爬取很重要?
当你通过浏览器或像 Python 的 Requests 库这样的 HTTP 客户端向服务器发送请求时,请求会包含 HTTP 头部信息,这些头部信息里包含了关于请求的各种信息。
其中一个重要的信息就是用户代理头部,它是一个名称,让服务器识别请求来自什么类型的应用程序。
你可以使用下面的代码来查看它的样子。这段代码使用 Requests 库从你的设备发送一个请求,然后在控制台打印出该请求的 HTTP 头部信息。
import requests response = requests.get("https://example.com/") print(response.request.headers)
它应该打印出如下内容:
{'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '11', 'Content-Type': 'application/x-www-form-urlencoded'}
这里的关键头部信息就是第一个。正如你所看到的,Requests 库会告诉服务器你正在使用它。真是个“告密者”!
网页浏览器的用户代理头部与独立应用程序的用户代理头部略有不同。浏览器的用户代理头部会列出浏览器版本、操作系统以及其他一些细节,这些信息可以帮助服务器决定向用户提供什么样的内容。
例如,下面是运行在 Windows 系统上的最新版本 Chrome 浏览器的用户代理字符串(以本文撰写时为准):
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36
台式机和移动浏览器的用户代理字符串也不同。例如,这是移动浏览器的用户代理:
Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Mobile Safari/537.36
通过将用户代理字符串从默认值更改为浏览器使用的字符串,你可以让网站认为请求来自真实的浏览器,从而隐藏你正在进行网页爬取的事实。
如何更改用户代理?
大多数用于网页爬取的 HTTP 客户端应用程序都允许你轻松更改用户代理字符串的内容,从而模拟使用真实的浏览器。
在这一部分,你将学习如何使用最流行的 Python HTTP 客户端库 Requests 来完成这一操作。
假设你已经有一些使用 Requests 的代码并且它们正在运行。
import requests response = requests.get("https://example.com/") print(response.request.headers)
要更改 Requests 使用的用户代理头部,可以创建一个包含字典的新 headers 变量。这个字典只需要一个条目——用户代理头部。
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'}
现在,你可以将 headers 变量传递给 requests.get() 函数。
import requests headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'} response = requests.get("https://example.com/", headers=headers) print(response.request.headers)
这样请求中就会包含用户代理头部,并覆盖默认的头部。现在,请求将拥有与 Chrome 浏览器匹配的用户代理头部。
{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
哪些用户代理常用于爬取网站?
如果你需要为你的网页爬取脚本选择一个用户代理字符串,最好的方法就是选择最常用的那种。这样可以与发送到网站的其他流量混在一起,不会显得突兀。
目前,最常用的用户代理如下:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36
这是最新版本的 Chrome 浏览器在 Windows 系统上的用户代理头部(从 Windows 11 开始,浏览器不再区分 Windows 版本)。虽然这个用户代理字符串中提到了其他浏览器,但这是有原因的。
以下是按受欢迎程度排序的其他用户代理,你可以使用:
1. macOS 上的 Chrome 115.0
“`
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36
“`
2. Windows 上的 Chrome 114.0
“`
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
“`
3. Windows 上的 Firefox 116.0
“`
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/116.0
“`
4. Windows 上的 Firefox 115.0
“`
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0
“`
5. macOS 上的 Chrome 114.0
“`
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
“`
6. Linux 上的 Chrome 115.0
“`
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36
“`
7. Windows 上的 Chrome 116.0
“`
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36
“`
8. Linux 上的 Firefox 115.0
“`
Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
“`
9. Linux 上的 Firefox 116.0
“`
Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/116.0
“`
10. Windows 上的 Edge 115.0
“`
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188
“`
请记住,浏览器会不断更新,所以最好定期研究常用的用户代理头部,并及时更新你的头部信息。
或者,你也可以通过搜索“What's my user agent?”来获取你浏览器的用户代理字符串。Google 会显示你的用户代理字符串,你可以将其设置为脚本的用户代理。因为它是从真实浏览器中复制的,看起来足够自然,可以绕过大多数爬取限制。
哪里可以找到全面的网页爬取用户代理列表?
如果你需要更详细的网页爬取用户代理列表,可以查看这篇博客文章。它包含一个根据访问博客的数据不断更新的常用桌面用户代理列表。
有没有专门用于移动端爬取的用户代理?
就像桌面浏览器一样,移动浏览器也有特定于浏览器和操作系统的用户代理。以下是一些常用的移动端用户代理:
1. Android 上的 Chrome
“`
Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.92 Mobile Safari/537.36
“`
2. Android 上的 Firefox
“`
Mozilla/5.0 (Android 13; Mobile; rv:68.0) Gecko/68.0 Firefox/116.0
“`
使用不同用户代理如何帮助绕过反爬取措施?
通过使用与浏览器匹配的用户代理头部,你可以避开那些试图阻止简单爬取脚本的防护措施。
例如,Reddit 可以阻止带有默认 HTTP 客户端头部的请求。将用户代理更改为其他任何东西,都可以增加爬取网站的可能性。
当然,仅仅更换用户代理并不是万能的解决方案。否则,使用像 Puppeteer 这样的浏览器自动化库进行网页爬取的人就不会被 IP 封禁了。实际上,网站会监控流量模式、用户行为、IP 地址使用情况等多种因素,以判断你是否在进行网页爬取。因此,始终保持警惕,仅仅改变头部信息是不够的。
支持大规模网页爬取的最佳方法之一是使用轮换代理。代理充当你和服务器之间的中介,隐藏请求的原始 IP 地址。通过在爬取会话中轮换代理,你可以隐藏爬取行为——每个请求都会有不同的 IP 地址,看起来就像是多个用户在访问网站。
常见问题
使用用户代理可以避免爬取时的 IP 封禁吗?
虽然使用用户代理可以帮助你避免被检测和 IP 封禁,但如果你的 IP 已经被标记,用户代理就无济于事了。使用同一个 IP 进行所有请求会形成一个模式,无论是否使用合适的用户代理,都会导致 IP 封禁。因此,在进行大规模网页爬取时,使用轮换代理是必须的。
使用用户代理进行爬取时有任何限制或注意事项吗?
理论上,你可以在用户代理头部放置任何文本字符串,所以没有技术上的限制。但需要注意的是,使用不同应用的用户代理头部可能会违反某些网站的服务条款。因此,试图隐藏你的用户代理可能会导致 IP 封禁或账户暂停。这种情况可以通过使用轮换代理和/或多个账户来解决。
如何在常用的网页爬取框架中更改用户代理?
所有常用的网页爬取框架都有办法操作请求的头部信息。你只需在请求中添加一个自定义的 User-Agent 头部,这样就可以覆盖框架默认使用的头部信息。