Задать вопрос
@js_akula

Ошибка при скачивании pdf-файлов, как исправить?

Стараюсь спарсить сайт с учебниками(https://file.11klasov.net/20425-russkij-jazyk-6-kl...), pdf-файл надо скачать.

Файл то скачивается, но не открывается. Причем если его скачать не через код, то все работает.
Вот код:

import requests

url = "https://file.11klasov.net/index.php?do=download&id..." # замените на URL файла, который вы хотите скачать
filename = "file.pdf" # замените на имя, под которым вы хотите сохранить файл

response = requests.get(url)
response.raise_for_status() # проверка на ошибки при скачивании

with open(filename, "wb") as file:
file.write(response.content)

print("Файл успешно скачан.")
  • Вопрос задан
  • 543 просмотра
Подписаться 1 Простой 2 комментария
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Легко проверить. Ты делаешь:
url = "https://file.11klasov.net/index.php?do=download&id=16985" # замените на URL файла, который вы хотите скачать
response = requests.get(url)

Затем посмотри атрибут response.history, и ты увидишь там два ответа: [<Response [302]>, <Response [301]>]. Все коды 3XX - это перенаправления, т.е. сайт тебя перенаправляет на другую страницу, вместо того, чтобы отдать контент.
Итог этих перенаправлений можно узнать из response.url, который будет равен
'https://file.11klasov.net/13938-russkij-jazyk-7-klass-razumovskaja-mm-lvova-si-kapinos-vi-i-dr.html'

Т.е. сайт задетектил бота, и отправил тебя на страницу учебника. Так обычно борятся с хотлинкингом, когда кто-то ставит прямую ссылку на файл на твоём сайте.
Также можно проверить response.headers['content-type']. Он будет 'text/html; charset=utf-8', т.е. это HTML страница а не PDF файл. Разумеется, если ты HTML страницу запишешь в файл с расширением .pdf, она от этого не станет валидным PDF.

Обычно проверяются две вещи: User-Agent и Referer. Первый описывает браузер пользователя, второй - с какой страницы был переход по этой ссылке. Но для данного сайта, похоже, достаточно добавить только Referer вот так:
response2 = requests.get(url, headers={
    'referer': response.url,  # ну или 'https://file.11klasov.net/13938-russkij-jazyk-7-klass-razumovskaja-mm-lvova-si-kapinos-vi-i-dr.html'
})

То получишь желаемое - response2.history будет пустой, а response2.headers['content-type'] будет равен 'application/pdf'.

С учётом этого можешь поправить свой код, чтобы он детектил редирект и делал второй запрос с заголовком Referer.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы