无法使用urllib访问网站

时间:2018-04-01 15:00:24

标签: python web-scraping 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

如您所见,我正在使用标题。是否有其他方法可以绕过阻止? 提前谢谢。

2 个答案:

答案 0 :(得分:2)

所以,我尝试过使用Firefox访问该页面,复制curl https://www.whoscored.com/Statistics命令并在每次在终端中运行时删除一个标题,但用户除外剂。当我删除Cookie - 标题时,它停止了工作:

<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()

答案 1 :(得分:2)

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

首先,请注意,如果我在没有网站任何cookie的情况下访问该页面,那么该页面也会对我有所帮助。不是特别好的设计,但也是如此。

现在,让我们假设你真的设法通过普通的浏览器。然后,请注意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,并重新请求同一页面但添加了C​​ookie