为什么我不能通过urllib访问Digikey的网站?
Why can't I access Digikey's website through urllib?
我正在按照此处的指南进行操作:
前几个例子一切正常:
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)
我正在按照此处的指南进行操作:
前几个例子一切正常:
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)