【问题标题】:Cannot access website with urllib无法使用 urllib 访问网站
【发布时间】:2023-03-09 02:34:01
【问题描述】:

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

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

如您所见,我正在使用标题。还有其他方法可以用来绕过阻塞吗? 提前致谢。

【问题讨论】:

  • 尝试伪造user-agent
  • 我得到了解决方案,它包括 cookie。我会写一个答案:)

标签: python web-scraping urllib


【解决方案1】:

所以,我尝试使用 Firefox 访问该页面,复制 https://www.whoscored.com/Statisticscurl 命令并在每次在终端中运行它时删除一个标头,用户代理除外。当我删除 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()

【讨论】:

    【解决方案2】:

    正如您已经意识到的那样,您需要添加足够多的标头以使其看起来像一个普通的浏览器。

    首先,让我指出,如果我在没有来自网站的任何 cookie 的情况下访问该页面,该页面也会在我身上出现 403。不是特别好的设计,但就这样吧。

    现在,让我们假设您实际上设法在普通浏览器中通过。然后,请注意 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
    

    这样,问题就变成了删除标头之一,直到服务器不再接受请求。

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

    -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,然后重新请求同一页面,但添加了 cookie。

    【讨论】:

    • 13 秒后 ;)
    • @linusg:下次我将不得不跳过校对......至少我们非常一致。
    猜你喜欢
    • 2011-06-27
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多