webentwicklung-frage-antwort-db.com.de

urllib2.HTTPError: HTTP-Fehler 403: Verboten

Ich versuche, den Download von historischen Bestandsdaten mit Python zu automatisieren. Die URL, die ich öffnen möchte, antwortet mit einer CSV-Datei, kann jedoch nicht mit urllib2 geöffnet werden. Ich habe versucht, den Benutzeragenten wie in einigen Fragen angegeben zu ändern. Ich habe sogar versucht, Antwort-Cookies zu akzeptieren, ohne Erfolg. Können Sie bitte helfen.

Hinweis: Die gleiche Methode funktioniert für Yahoo Finance.

Code:

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)

Fehler

Datei "C:\Python27\lib\urllib2.py", Zeile 527, in http_error_default HTTPError auslösen (req.get_full_url (), Code, msg, hdrs, fp) urllib2.HTTPError: HTTP-Fehler 403: Verboten

Danke für deine Hilfe

85
kumar

Durch Hinzufügen einiger weiterer Header konnte ich die Daten abrufen:

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

Eigentlich funktioniert es mit nur diesem einen zusätzlichen Header:

'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
151
andrean

Dies funktioniert in 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
42
Eish

Die NSE-Website hat sich geändert und die älteren Skripte sind halboptimal für die aktuelle Website. Dieses Snippet kann tägliche Details zur Sicherheit erfassen. Zu den Details gehören Symbol, Wertpapierart, früherer Schlusskurs, offener Preis, hoher Preis, niedriger Preis, Durchschnittspreis, gehandelte Menge, Umsatz, Anzahl der Trades, lieferbare Mengen und Verhältnis von geliefert zu gehandelt in Prozent. Diese bequem als Liste der Wörterbuchform dargestellt.

Python 3.X-Version mit Anfragen und 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 __== '__main__':
     getquote(SECURITY_NAME, START_DATE, END_DATE)

Außerdem ist dies relativ modular und einsatzbereit.

6
djinn