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

ste*_*fen 2 python urllib http-status-code-403

我正在尝试使用Python下载一些内容urllib.request.以下命令会产生异常:

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

结果:

...
HTTPError: HTTP Error 403: Forbidden
Run Code Online (Sandbox Code Playgroud)

如果我使用firefox或链接(命令行浏览器)我得到的内容和状态代码为200.如果我使用lynx,很奇怪,我也得到403.

我希望所有方法都有效

  1. 一样的方法
  2. 顺利

为什么不是这样?

Moo*_*awr 5

该网站最有可能阻止人们刮取他们的网站.您可以通过包含标题信息以及其他内容来在基本级别欺骗它们.有关详细信息,请参见此处

引自: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()
Run Code Online (Sandbox Code Playgroud)

人们不希望脚本刮掉他们的网站有很多原因.它需要一个带宽.他们不希望人们通过制作刮刀机器人来获益(金钱方面).也许他们不希望您复制他们的网站信息.你也可以把它想象成一本书.作者希望人们阅读他们的书籍,但也许他们中的一些人不希望机器人扫描他们的书籍,创建副本,或者机器人可能会总结它.

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