python - from - urllib2.HTTPError: HTTP Error 403: prohibido
urllib.urlencode python 3 (3)
Estoy tratando de automatizar la descarga de datos históricos de acciones usando Python. La URL que intento abrir responde con un archivo CSV, pero no puedo abrir con urllib2. He intentado cambiar el agente de usuario como se especifica en algunas preguntas anteriormente, incluso intenté aceptar las cookies de respuesta, sin suerte. ¿Puedes ayudarme?
Nota: El mismo método funciona para Yahoo Finanzas.
Código:
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)
Error
Archivo "C: / Python27 / lib / urllib2.py", línea 527, en http_error_default raise HTTPError (req.get_full_url (), código, msg, hdrs, fp) urllib2.HTTPError: HTTP Error 403: Prohibido
Gracias por tu ayuda
Al agregar algunos encabezados más, pude obtener los datos:
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
En realidad, funciona solo con este encabezado adicional:
''Accept'': ''text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'',
El sitio web de NSE ha cambiado y los scripts anteriores son semi-óptimos para el sitio web actual. Este fragmento puede recopilar detalles diarios de seguridad. Los detalles incluyen símbolo, tipo de seguridad, cierre anterior, precio abierto, precio alto, precio bajo, precio promedio, cantidad negociada, volumen de negocios, cantidad de transacciones, cantidades entregables y proporción entre entregada y negociada en porcentaje. Estos presentados convenientemente como una lista de forma de diccionario.
Versión de Python 3.X con solicitudes y 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)
Además de esto, es un fragmento relativamente modular y listo para usar.
Esto funcionará en 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