urllib2.HTTPError:HTTP错误403:禁止
我正在尝试使用python自动下载历史股票数据。 我试图打开的URL用CSV文件回应,但我无法使用urllib2打开。 我曾尝试更改用户代理,如前几个问题中指出的,我甚至试图接受响应cookie,没有运气。 你能帮忙吗?
注意:同样的方法适用于雅虎财务。
码:
import urllib2,cookielib site= "http://www.nseindia.com/live_market/dynaContent/live_watch/get_quote/getHistoricalData.jsp?symbol=JPASSOCIAT&fromDate=1-JAN-2012&toDate=1-AUG-2012&datePeriod=unselected&hiddDwnld=true" hdr = {'User-Agent':'Mozilla/5.0'} req = urllib2.Request(site,headers=hdr) page = urllib2.urlopen(req)
错误
文件“C:\ Python27 \ lib \ urllib2.py”,第527行,在http_error_default中引发HTTPError(req.get_full_url(),code,msg,hdrs,fp)urllib2.HTTPError:HTTP Error 403:Forbidden
感谢你的协助
通过添加更多的标题,我可以获得数据:
import urllib2,cookielib site= "http://www.nseindia.com/live_market/dynaContent/live_watch/get_quote/getHistoricalData.jsp?symbol=JPASSOCIAT&fromDate=1-JAN-2012&toDate=1-AUG-2012&datePeriod=unselected&hiddDwnld=true" hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'Accept-Encoding': 'none', 'Accept-Language': 'en-US,en;q=0.8', 'Connection': 'keep-alive'} req = urllib2.Request(site, headers=hdr) try: page = urllib2.urlopen(req) except urllib2.HTTPError, e: print e.fp.read() content = page.read() print content
实际上,它只与这一个额外的标题一起工作:
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
这将在Python 3中工作
import urllib.request user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7' url = "http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers" headers={'User-Agent':user_agent,} request=urllib.request.Request(url,None,headers) #The assembled request response = urllib.request.urlopen(request) data = response.read() # The data u need
NSE的网站已经改变,旧的脚本是目前的网站半最佳。 这个片段可以收集日常的安全细节。 详细信息包括符号,证券types,前收盘价格,开盘价格,高价格,低价格,平均价格,交易数量,成交量,交易数量,交割数量以及交易与交易的比例等。 这些方便地呈现为字典forms的列表。
Python 3.X版本与请求和BeautifulSoup
from requests import get from csv import DictReader from bs4 import BeautifulSoup as Soup from datetime import date from io import StringIO SECURITY_NAME="3MINDIA" # Change this to get quote for another stock START_DATE= date(2017, 1, 1) # Start date of stock quote data DD-MM-YYYY END_DATE= date(2017, 9, 14) # End date of stock quote data DD-MM-YYYY BASE_URL = "https://www.nseindia.com/products/dynaContent/common/productsSymbolMapping.jsp?symbol={security}&segmentLink=3&symbolCount=1&series=ALL&dateRange=+&fromDate={start_date}&toDate={end_date}&dataType=PRICEVOLUMEDELIVERABLE" def getquote(symbol, start, end): start = start.strftime("%-d-%-m-%Y") end = end.strftime("%-d-%-m-%Y") hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Referer': 'https://cssspritegenerator.com', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'Accept-Encoding': 'none', 'Accept-Language': 'en-US,en;q=0.8', 'Connection': 'keep-alive'} url = BASE_URL.format(security=symbol, start_date=start, end_date=end) d = get(url, headers=hdr) soup = Soup(d.content, 'html.parser') payload = soup.find('div', {'id': 'csvContentDiv'}).text.replace(':', '\n') csv = DictReader(StringIO(payload)) for row in csv: print({k:v.strip() for k, v in row.items()}) if __name__ == '__main__': getquote(SECURITY_NAME, START_DATE, END_DATE)
此外,这是相对模块化,并准备使用片段。