浏览器工作时,Python urllib被拒绝访问

我正在尝试从此站点下载CSV文件:

http://www.nasdaq.com/screening/companies-by-name.aspx

如果我在Chrome浏览器中输入此网址,则会立即开始下载csv文件,然后我会获得一个包含数千家公司数据的文件.但是,如果我使用下面的代码,我会收到拒绝访问错误.这个页面上没有登录,那么Python代码的不同之处是什么?

from urllib import urlopen

response = urlopen('http://www.nasdaq.com/screening/companies-by-name.aspx?&render=download')
csv = response.read()

# Save the string to a file
csvstr = str(csv).strip("b'")

lines = csvstr.split("\\n")
f = open("C:\Users\Ankit\historical.csv", "w")
for line in lines:
   f.write(line + "\n")
f.close()

最佳答案 urllib2(和类似的urllib)的用户代理头是“Python-urllib / 2.7”(由你的Python版本替换2.7).

您收到403错误,因为NASDAQ服务器似乎不想向此用户代理发送内容.您可以“欺骗”用户代理标头,然后成功下载.这是一个最小的例子:

import urllib2

DOWNLOAD_URL = 'http://www.nasdaq.com/screening/companies-by-name.aspx?&render=download'

hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11'}
req = urllib2.Request(DOWNLOAD_URL, headers=hdr)

try:
    page = urllib2.urlopen(req)
except urllib2.HTTPError, e:
    print e.fp.read()

content = page.read()
print content
点赞