Как скачать файл с аутентификацией? - PullRequest
0 голосов
/ 15 января 2019

Я работаю с сайтом musescore.com, на котором есть много файлов в формате .mxl, которые мне нужно автоматически загружать с помощью Python.

Каждый файл на сайте имеет уникальный идентификационный номер. Вот ссылка на файл примера:

https://musescore.com/user/43726/scores/76643

Последнее число в URL-адресе является идентификатором этого файла. Я не знаю, где на веб-сайте находится файл mxl для оценки, но я знаю, что для загрузки файла необходимо посетить этот URL:

https://musescore.com/score/76643/download/mxl

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

Вот мой код:

import requests

url = 'https://musescore.com/score/76643/download/mxl'
user = 'myusername'
password = 'mypassword'

r = requests.get(url, auth=(user, password), stream=True)
with open('file.mxl', 'wb') as f:
  for chunk in r.iter_content(chunk_size=1024):
    f.write(chunk)

Этот код загружает веб-страницу со словами, что мне нужно войти в систему, чтобы загрузить файл. Предполагается скачать файл mxl для этой оценки. Это должно означать, что я неправильно аутентифицирую сайт. Как я могу это исправить?

1 Ответ

0 голосов
/ 15 января 2019

Передав параметр auth в get, вы пытаетесь использовать Базовую аутентификацию HTTP , которая не используется этим конкретным сайтом. Вам нужно будет использовать экземпляр request.Session, чтобы публиковать сообщения в конечной точке входа в систему и поддерживать файлы cookie, полученные в результате этого процесса.

Кроме того, на этом сайте используется токен csrf, который необходимо сначала извлечь со страницы входа в систему, чтобы включить его в свое сообщение для конечной точки входа в систему.

Вот рабочий пример, очевидно, вам нужно изменить имя пользователя и пароль на свой:

import requests
from bs4 import BeautifulSoup

s = requests.Session()
r = s.get('https://musescore.com/user/login')

soup = BeautifulSoup(r.content, 'html.parser')
csrf = soup.find('input', {'name': '_csrf'})['value']

s.post('https://musescore.com/user/auth/login/process', data={
    'username': 'herp@derp.biz',
    'password': 'secret',
    '_csrf': csrf,
    'op': 'Log in'
})

r = s.get('https://musescore.com/score/76643/download/mxl')

print(f"Status: {r.status_code}")
print(f"Content-Type: {r.headers['content-type']}")

Результат с типом содержимого, показывающим, что файл успешно загружается:

Status: 200
Content-Type: application/vnd.recordare.musicxml
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...