为什么urllib.request.urlopen有时不工作,但浏览器工作?

2024-10-01 09:33:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用Python的urllib.request下载一些内容。以下命令产生异常:

import urllib.request
print(urllib.request.urlopen("https://fpgroup.foreignpolicy.com/foreign-policy-releases-mayjune-spy-issue/").code)

结果:

^{pr2}$

如果使用firefox的一个链接和一个浏览器的代码,我可以使用200。如果我用山猫,奇怪的是,我也能得到403。在

我希望所有的方法都能奏效

  1. 同样的方法
  2. 成功

为什么不是这样?在


Tags: 方法httpsimport命令com内容requestpolicy
2条回答

我试着用这个代码,一切都没问题。在

我刚刚在请求中添加了headers。参见以下示例:

from urllib.request import Request, urlopen, HTTPError
from time import sleep

def get_url_data(url = ""):
    try:
        request = Request(url, headers = {'User-Agent' :\
            "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36"})

        response = urlopen(request)
        data = response.read().decode("utf8")
        return data
    except HTTPError:
        return None

url = "https://fpgroup.foreignpolicy.com/foreign-policy-releases-mayjune-spy-issue/"

for i in range(50):
    d = get_url_data(url)
    if d != None:
        print("Attempt %d was a Success" % i)
    else:
        print("Attempt %d was a Failure" % i)
    sleep(1)

输出:

^{pr2}$

很有可能是这个网站在阻止人们浏览他们的网站。你可以在一个基本的层面上欺骗他们,包括头信息和其他东西。更多信息请参阅此处。在

引自:https://docs.python.org/3/howto/urllib2.html#headers

import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
values = {'name' : 'Michael Foord',
          'location' : 'Northampton',
          'language' : 'Python' }
headers = { 'User-Agent' : user_agent }

data = urllib.parse.urlencode(values)
data = data.encode('ascii')
req = urllib.request.Request(url, data, headers)
with urllib.request.urlopen(req) as response:
   the_page = response.read()

有很多原因可以解释为什么人们不想让脚本破坏他们的网站。它需要他们的带宽。他们不想让人们通过制造一个“刮宝机器人”(scrapbot)从中获益(金钱方面)。也许他们不想让你复制他们的网站信息。你也可以把它当作一本书。作者希望人们阅读他们的书,但也许他们中的一些人不希望机器人扫描他们的书,创建一个非拷贝,或者也许机器人可能会总结它。在

你在评论中的问题的第二部分是含糊和宽泛的回答,因为这里有太多自以为是的答案。在

相关问题 更多 >