Python urllib 访问被拒绝,浏览器正常

5 投票
2 回答
5455 浏览
提问于 2025-04-18 14:47

我想从这个网站下载一个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()

2 个回答

1

或者你可以使用 python-requests 这个库。

import requests

url = 'http://www.nasdaq.com/screening/companies-by-name.aspx'
params = {'':'', 'render':'download'}
resp = requests.get(url, params=params)
print resp.text
9

对于 urllib2(还有类似的 urllib),用户代理头部是 "Python-urllib/2.7"(把 2.7 替换成你自己的 Python 版本)。

你遇到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

撰写回答