2017-11-04 2 views
0

Ich versuche, die Daten von NSE India Website herunterladen. Zu downloadende Daten sind die Zip-Dateien, die ich nach dem Download verarbeite. I Beispielcode, der die Dateien für Termine für Jahr 2016.Forbidden Zugriff 403 für einige URL mit Urllib2 Python

def start_download(): 

    directory = 'data' 
    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'} 
    try: 
     #req = urllib2.Request("https://www.nseindia.com/content/historical/EQUITIES//2000/JAN/cm01JAN2000bhav.csv.zip", headers=hdr) 
     import ipdb;ipdb.set_trace() 
     req = urllib2.Request("https://www.nseindia.com/content/historical/EQUITIES//2017/NOV/cm03NOV2017bhav.csv.zip", headers=hdr) 
     file_url = urllib2.urlopen(req) 
     try: 
      if not os.path.exists(directory): 
       os.makedirs(directory) 
      file_name_obj = open(os.path.join(directory, "hello.zip"), 'wb') 
      file_name_obj.write(file_url.read()) 
      file_name_obj.close() 
     except IOError, e: 
      print e 
    except Exception, e: 
     print e 

In dem obigen Code herunterlädt, wenn ich die URL „https://www.nseindia.com/content/historical/EQUITIES//2017/NOV/cm03NOV2017bhav.csv.zip“ verwenden, lädt er die Daten. Ich habe auch versucht, Postman-Client zu verwenden, es lädt auch herunter.

Wenn ich folgende URL verwende: https://www.nseindia.com/content/historical/EQUITIES//2000/JAN/cm01JAN2000bhav.csv.zip, bekomme ich Zugriff 403 Fehler im Code sowie in Postman verboten. Wenn ich diesen Link in den Chrome-Browser einfüge, existiert auch ein Problem.

Aber wenn man durch Links von dieser Seite „https://www.nseindia.com/products/content/equities/equities/archieve_eq.htm“ und setzen Report als Bhavcopy und date als 1. Januar 2000, lädt es die Datei erfolgreich * .csv.zip.

Wie behebe ich diesen 403 verbotenen Fehler für kommentierte URL im Beispielcode?

Antwort

0

Sie müssen Ihre Header anpassen. Hier ist ein Beispiel dafür, wie es zu tun ist und wie die heruntergeladene Datei schreiben Python:

from urllib.request import Request, urlopen 
import shutil 

link = 'https://www.nseindia.com/content/historical/EQUITIES//2017/NOV/cm03NOV2017bhav.csv.zip' 
header = { 
    'Accept-Encoding': 'gzip, deflate, sdch, br', 
    'Accept-Language': 'fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4', 
    'Host': 'www.nseindia.com', 
    'Referer': 'https://www.nseindia.com/', 
    'User-Agent': 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/53.0.2785.143 Chrome/53.0.2785.143 Safari/537.36', 
    'X-Requested-With': 'XMLHttpRequest' 
} 

def download_file(link, file_name, length): 
    try: 
     req = Request(link, headers=header) 
     with open(file_name, 'wb') as writer: 
      request = urlopen(req, timeout=3) 
      shutil.copyfileobj(request, writer, length) 
    except Exception as e: 
     print('File cannot be downloaded:', e) 
    finally: 
     print('File downloaded with success!') 

file_name = 'new_file.zip' 
length = 1024 
download_file(link, file_name, length) 

Schließlich können Sie überprüfen, ob die heruntergeladene Datei mit dieser Methode hat die gleiche SHA1 Summe der Datei heruntergeladen mit Ihrem Browser:

Datei heruntergeladen mit Python:

> sha1sum new_file.zip 
daff49646d183636f590db6cbf32c93896179cb2 new_file.zip 

Datei heruntergeladen Chromium mit:

> sha1sum cm03NOV2017bhav.csv.zip 
daff49646d183636f590db6cbf32c93896179cb2 cm03NOV2017bhav.csv.zip