Сканер Python не работает должным образом
Я только что написал сканер Python для загрузки миди-файлов с freemidi.org. Просматривая заголовки запросов в Chrome, я обнаружил, что атрибут "Referer" должен был быть https://freemidi.org/download-20225 (позже упоминается как "download-20225"), если страница загрузки была https://freemidi.org/getter-20225 ( позже упоминается как "getter-20225") для правильной загрузки файла midi. Я сделал это в Python, установив заголовок так:
headers = {
'Referer': 'https://freemidi.org/download-20225',
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}
который был точно таким же, как заголовок запроса, который я просматривал в Chrome, и я попытался загрузить файл, используя эту строку кода.
midi = requests.get(url, headers=headers).content
Однако это не сработало должным образом. Вместо загрузки миди-файла он загрузил html-файл сайта "download-20225". Позже я обнаружил, что если я пытаюсь получить доступ к сайту "getter-20225" напрямую, он также приводит к "download-20225". Я думаю, что это, вероятно, указывает на то, что заголовок был неправильным, поэтому он перенес меня на другой сайт вместо того, чтобы начать загрузку.
Я совершенно новичок в написании сканеров Python, так что может кто-нибудь помочь мне найти, что пошло не так с программой?
1 ответ
Похоже, проблема в том, что страница с файлом midi (например, "getter-20225") хочет перенаправить вас обратно на страницу песни (например, "download-20225") после загрузки песни. Однако запросы только возвращают контент с последней страницы в перенаправлении.
Вы можете установить для параметра allow_redirects значение False, чтобы запросы возвращали содержимое со страницы "getter" (т. Е. Midi-файл):
midi = requests.get(url, headers=headers, allow_redirects=False)
Обратите внимание, что если вы хотите записать MIDI-файл на диск, вам нужно открыть целевой файл в двоичном режиме (так как MIDI-файл записывается в байтах).
with open('example.mid', 'wb') as ex:
ex.write(midi.content)