Получение HTTP Ошибка 403: Запрещена загрузка CSV - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь получить доступ к CSV программно по следующему адресу: http://www.cmegroup.com/CmeWS/exp/voiProductDetailsViewExport.ctl?media=xls&tradeDate=20180627&reportType=F&productId=425

Я пробовал это двумя способами, один из них - просто передать URL-адрес data_sheet = pd.read_csv(sheet_url). Я получаю исключение HTTP Error 403: Forbidden при попытке использовать этот метод.

def get_sheet(self):
        # Accesses CME direct URL (at the moment...will add functionality for ICE later)
        # Gets sheet and puts it in dataframe
        #Returns dataframe sheet

        sheet_url = "http://www.cmegroup.com/CmeWS/exp/voiProductDetailsViewExport.ctl?media=xls&tradeDate="+str(self.date_of_report)+"&reportType="\
        + str(self.report_type)+"&productId=" + str(self.product)

        header = {
            "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36",
            "X-Requested-With": "XMLHttpRequest"
        }

        data_sheet = pd.read_csv(sheet_url)

        return data_sheet

Я также пытался притвориться браузером, думая, что, возможно, сайт не разрешает прямой вызов CSV, но затем я получаю Invalid file path or buffer object type: <class 'requests.models.Response'> исключение

def get_sheet(self):
        # Accesses CME direct URL (at the moment...will add functionality for ICE later)
        # Gets sheet and puts it in dataframe
        #Returns dataframe sheet

        sheet_url = "http://www.cmegroup.com/CmeWS/exp/voiProductDetailsViewExport.ctl?media=xls&tradeDate="+str(self.date_of_report)+"&reportType="\
        + str(self.report_type)+"&productId=" + str(self.product)

        header = {
            "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36",
            "X-Requested-With": "XMLHttpRequest"
        }

        req = requests.get(url = sheet_url, headers = header)

        data_sheet = pd.read_csv(req)

        return data_sheet

Моя конечная цель - просто извлечь CSV по этому URL и вернуть фрейм данных. Чего мне не хватает?

ОБНОВЛЕНИЕ: Я сделал еще кое-что и напечатал req, и я получил вывод Response [200], что, как я вижу в документах HTTP, означает, что сервер получает мою информацию. Кто-нибудь знает, если проблема в том, что у меня есть прямой доступ к URL-адресу, где хранится CSV-файл, который обычно, если вы нажимаете кнопку, с которой связан URL-адрес, автоматически загружает файл. При проверке моей папки загрузок я не вижу никаких загрузок для файла. Таким образом, в то время как сервер может получать действительный запрос, я, возможно, неправильно обрабатываю поведение URL. Есть идеи?

1 Ответ

0 голосов
/ 29 июня 2018

В вашем коде две ошибки:

  1. Вы передаете объект ответа пандам,

    data_sheet = pd.read_csv(sheet_url) когда ваши фактические данные CSV находятся в sheet_url.content

  2. Панды не могут читать csv из string, pd.read_csv работает только с файловыми объектами. Таким образом, чтобы прочитать загруженный контент, вам нужно создать файл либо с помощью средства записи строк, чтобы создать физический файл, либо использовать io.StringIO(response.content.decode('utf-8'))

Пример использования модуля io:

import requests
import io
import pandas as pd

response = requests.get('http://samplecsvs.s3.amazonaws.com/SalesJan2009.csv')

file_object = io.StringIO(response.content.decode('utf-8'))
pd.read_csv(file_object)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...