无法使用 urllib 访问网站

Cannot access website with urllib

我想访问一个特定的网站,但它以某种方式被阻止,因为它在其他网站上工作得很好。 这是我当前的代码:

from urllib.request import Request, urlopen

my_url = "https://www.whoscored.com/Statistics"
req = Request(my_url, headers={'User-Agent': 'Mozilla/5.0'})
page = urlopen(req).read()

这是我得到的错误:

File "C:\Program Files\Python36\lib\urllib\request.py", line 650, in 
http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden

如您所见,我使用的是 header。我可以使用其他方法来绕过阻塞吗? 提前致谢。

因此,我尝试使用 Firefox 访问该页面,为 https://www.whoscored.com/Statistics 复制 curl 命令,并在每次 运行 时删除一个 header在终端中,用户代理除外。当我删除 Cookie-header:

时它停止工作
<html style="height:100%">
   <head>
      <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
      <meta name="format-detection" content="telephone=no">
      <meta name="viewport" content="initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
   </head>
   <body style="margin:0px;height:100%"><iframe src="/_Incapsula_Resource?CWUDNSAI=18&xinfo=9-102892494-0%200NNN%20RT%281522595804827%20135%29%20q%280%20-1%20-1%20-1%29%20r%280%20-1%29%20B15%284%2c200%2c0%29%20U2&incident_id=534000500096779297-388792508527018793&edet=15&cinfo=04000000" frameborder=0 width="100%" height="100%" marginheight="0px" marginwidth="0px">Request unsuccessful. Incapsula incident ID: 534000500096779297-388792508527018793</iframe></body>
</html>

出于某种奇怪的原因,当您删除他们给您的 cookie 时,浏览器中也会发生同样的情况。它给出了 403.

无论如何,您可以使用我的或您的 cookie 并且它有效:

from urllib.request import Request, urlopen

my_url = "https://www.whoscored.com/Statistics"
req = Request(my_url, headers={
    'User-Agent': 'Mozilla/5.0',
    'Cookie': 'visid_incap_774904=W2dv4v7LQ9O+mAgXMTXNEkf0wFoAAAAAQUIPAAAAAAAa0bYG0xZT8EYzEjek6QAz; incap_ses_534_774904=hy1MMZjKpnSDJyYmoCZpB0f0wFoAAAAAZA+Th6cYjAoseY9Kq7vrFA=='
})
page = urlopen(req).read()

正如您已经意识到的那样,您需要添加足够的 headers 才能让它看起来像一个普通的浏览器。

首先,请允许我指出,如果我在没有任何来自该站点的 cookie 的情况下访问它,该页面也会对我产生 403s。不是特别好的设计,但就这样吧。

现在,让我们假设您确实设法在普通浏览器中通过了。然后,请注意 Firefox 和 Chrome 等浏览器允许您将它们的请求转换为 curl 等效项,这样您就可以轻松地进行实验:

$ curl -I "https://www.whoscored.com/Statistics" -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" --compressed -H "Accept-Language: en-US,en;q=0.5" -H "Cache-Control: max-age=0" -H "Connection: keep-alive" -H "Cookie: visid_incap_...; incap_ses_453_..." -H "DNT: 1" -H "Host: www.whoscored.com" -H "Upgrade-Insecure-Requests: 1" -H "User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0"
HTTP/1.1 200 OK

有了这个,问题变成了删除 headers 直到服务器不再接受请求。

确实,在您的特定情况下,您会发现您可以删除任何内容,但

-H "Cookie: visid_incap_...; incap_ses_..."

因此您需要至少设置一个事先请求才能获取这些 cookie。现在,相关的 cookie 实际上是在 403ing 响应中设置的,因此您可以简单地从那里获取它们:

$ curl -I "https://www.whoscored.com/Statistics"
HTTP/1.1 403 Forbidden
....
Set-Cookie: visid_incap_...; expires=Mon, 01 Apr 2019 09:22:14 GMT; path=/; Domain=.whoscored.com
Set-Cookie: incap_ses_...; path=/; Domain=.whoscored.com

也就是说,您会想要首先访问该页面,知道您会收到 403,记下提供给您的 cookie,然后 re-request 同一页面但添加了 cookie .