Скачивание файла excel с url-адреса в pandas (пост-аутентификация) - PullRequest
0 голосов
/ 30 мая 2020

Я столкнулся со странной проблемой, о которой я мало что знаю из-за моего незнания html.

Я хочу загрузить логин для отправки файла Excel с веб-сайта. File_url:

file_url="https://xyz.xyz.com/portal/workspace/IN AWP ABRL/Reports & Analysis Library/CDI Reports/CDI_SM_Mar'20.xlsx"


Для файла есть кнопка общего доступа, которая дает ссылку2 (для того же файла):

file_url2='http://xyz.xyz.com/portal/traffic/4a8367bfd0fae3046d45cd83085072a0'

Когда я использую requests.get для чтения ссылки 2 (отправка входа в сеанс) Я могу прочитать Excel в pandas. Однако ссылка 2 не служит моей цели, так как я не могу запланировать свой отчет по этому поводу на период c (путем изменения мар'20 на апр'20 и c). Link1 подходит для моей цели, но дает следующее при передаче r = requests.get в методе r.content:

b'\n\n\n\n\n\n\n\n\n\n<html>\n\t<head>\n\t\t<title></title>\n\t</head>\n\t\n\t<body bgcolor="#FFFFFF">\n\t\n\n\t<script language="javascript">\n\t\t<!-- \n\t\t\ttop.location.href="https://xyz.xyz.com/portal/workspace/IN%20AWP%20ABRL/Reports%20&%20Analysis%20Library/CDI%20Reports/CDI_SM_Mar\'20.xlsx";\t\n\t\t-->\n\t</script>\n\t</body>\n</html>'

Я пробовал все кодирование декодирования URL-адреса, но не могу понять этот буквенно-цифровой c url (link2 ).

Мой python код (рабочий):

import requests
url = 'http://xyz.xyz.com/portal/site'
username=''
password=''
s = requests.Session()
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'}
r = s.get(url,auth=(username, password),verify=False,headers=headers)
r2 = s.get(file_url,verify=False,allow_redirects=True)
r2.content
# df=pd.read_excel(BytesIO(r2.content))

1 Ответ

1 голос
/ 30 мая 2020

Вы получаете HTML с JavaScript, который перенаправляет браузер на новый URL-адрес. Но requests не может запустить JavaScript. это простые методы для блокировки некоторых простых скриптов / ботов.

Но HTML - это всего лишь строка, поэтому вы можете использовать строковые функции для получения URL-адреса из строки и использовать этот URL-адрес с requests для получения файла.

content = b'\n\n\n\n\n\n\n\n\n\n<html>\n\t<head>\n\t\t<title></title>\n\t</head>\n\t\n\t<body bgcolor="#FFFFFF">\n\t\n\n\t<script language="javascript">\n\t\t<!-- \n\t\t\ttop.location.href="https://xyz.xyz.com/portal/workspace/IN%20AWP%20ABRL/Reports%20&%20Analysis%20Library/CDI%20Reports/CDI_SM_Mar\'20.xlsx";\t\n\t\t-->\n\t</script>\n\t</body>\n</html>'

text = content.decode()
print(text)
print('\n---\n')

start = text.find('href="') + len('href="')
end   = text.find('";', start)

url = text[start:end]
print('url:', url)

response = s.get(url)

Результаты:

<html>
    <head>
        <title></title>
    </head>

    <body bgcolor="#FFFFFF">


    <script language="javascript">
        <!-- 
            top.location.href="https://xyz.xyz.com/portal/workspace/IN%20AWP%20ABRL/Reports%20&%20Analysis%20Library/CDI%20Reports/CDI_SM_Mar'20.xlsx"; 
        -->
    </script>
    </body>
</html>

---

url: https://xyz.xyz.com/portal/workspace/IN%20AWP%20ABRL/Reports%20&%20Analysis%20Library/CDI%20Reports/CDI_SM_Mar'20.xlsx
...