为什么我不能通过urllib访问Digikey的网站?

Why can't I access Digikey's website through urllib?

我正在按照此处的指南进行操作:

Python3 Urllib Tutorial

前几个例子一切正常:

import urllib.request

html = urllib.request.urlopen('https://arstechnica.com').read()
print(html)

import urllib.request

headers = {}
headers['User-Agent'] = "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:48.0) Gecko/20100101 Firefox/48.0"

req = urllib.request.Request('https://arstechnica.com', headers = headers)
html = urllib.request.urlopen(req).read()
print(html)

但是如果我将“arstechnica”替换为“digikey”,则该 urllib 请求总是会超时。但是可以通过浏览器轻松访问该网站。怎么回事?

大多数网站都会尝试保护自己免受不需要的机器人的攻击。如果他们检测到可疑流量,他们可能会决定在不正确关闭连接的情况下停止响应(让您悬而未决)。有些网站比其他网站更擅长检测机器人程序。

Firefox 48.0 于 2016 年发布,因此对于 Digikey 来说很明显您可能在欺骗 header 信息。还有其他 header 浏览器通常会发送,而您的脚本不会。

在 Firefox 中,如果您打开开发人员工具并转到网络监视器选项卡,您可以检查请求以查看它发送的 headers,然后复制这些以更好地模仿典型的行为浏览器。

import urllib.request

headers = {
    "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.5",
    "Upgrade-Insecure-Requests": "1"
}

req = urllib.request.Request('https://www.digikey.com', headers = headers)
html = urllib.request.urlopen(req).read()
print(html)