2017-01-29 2 views
1

Я пытаюсь, чтобы загрузить CSV-файл с Python 3.x Пути к файлу является: https://www.nseindia.com/content/fo/fo_mktlots.csvPython Скачать файл с пандой/URLLIB

Я нашел три способа сделать это. Из трех работает только один метод. Я хотел знать, почему или что я делаю неправильно.

  1. Метод 1: (Неудачная)

    import pandas as pd 
    
    mytable = pd.read_table("https://www.nseindia.com/content/fo/fo_mktlots.csv",sep=",") 
    print(mytable) 
    

    Но я получаю следующее сообщение об ошибке:

    - HTTPError: HTTP Error 403: Forbidden 
    
  2. Метод 2: (неэффективные)

    from urllib.request import Request, urlopen 
    
    url='https://www.nseindia.com/content/fo/fo_mktlots.csv' 
    
    url_request = Request(url, headers={'User-Agent': 'Mozilla/5.0'}) 
    html = urlopen(url_request).read() 
    

    Got та же ошибка, что и раньше:

    - HTTPError: HTTP Error 403: Forbidden 
    
  3. Метод 3: (успешный)

    import requests 
    import pandas as pd 
    
    url = 'https://www.nseindia.com/content/fo/fo_mktlots.csv' 
    
    r = requests.get(url) 
    df = pd.read_csv(StringIO(r.text)) 
    

Я также смог открыть файл с Excel VBA, как показано ниже:

Workbooks.Open Filename:="https://www.nseindia.com/content/fo/fo_mktlots.csv" 

Кроме того, есть ли другой способ сделать то же самое?

+0

запроса нюхает с точкой Wireshark на «Encrypted оповещение» при использовании второго сценария. Возможно, вам придется глубоко настроить ваш сокет, прежде чем делать запрос. – jlandercy

ответ

2

Веб-сайт пытается предотвратить выскабливание содержимого.

Проблема не в том, что вы делаете неправильно, это больше о том, как настроен веб-сервер и как он ведет себя в различных ситуациях.

Но для преодоления защиты от скремблирования создайте четко определенные заголовки запросов HTTP, лучший способ сделать это - отправить полный набор заголовков http, которые делает настоящий веб-браузер.

Здесь он работает с минимальным набором:

>>> myHeaders = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36', 'Referer': 'https://www.nseindia.com', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'} 
>>> url_request = Request(url, headers=myHeaders) 
>>> html = urlopen(url_request).read() 
>>> len(html) 
42864 
>>> 

Вы можете передать URLLIB для панд:

>>> import pandas as pd 
... 
>>> url_request = Request(url, headers=myHeaders) 
>>> data = urlopen(url_request) 
>>> my_table = pd.read_table(data) 
>>> len(my_table) 
187 
+0

Спасибо! Это сработало. Нужно ли обновлять «myHeaders» через несколько месяцев или около того, когда версия браузера изменится? Или это также зависит от того, как настроен веб-сервер? Любая идея, как это было бы сделано с «Методом 1» –

+0

Отредактировано: Pass urllib to pandas –

+0

Не могли бы вы рассказать подробнее. Я googled много не мог найти ничего о том, как передать urllib в панды. Не удалось найти какой-либо параметр в pd.read_csv. Извините за мое незнание :( –