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