Как я могу получить ссылки на скачивание файлов с веб-страницы, не удаляя сам документ?

Я хочу написать менеджер загрузок в Python, например JDownloader, который загружает простые файлы для вас. Но не у каждого файла есть ссылка для скачивания в документе. Как я могу получить URL для загрузки, если файлы похожи на "невидимые" в документе? Я обнаружил в интернете, что сетевой анализ может работать, но это не то, что мне нужно. JDownloader просто проверяет секунду и напрямую находит то, что вам нужно. Как это работает? Например: https://speed.hetzner.de/

Кстати, я новичок.

1 ответ

Глядя на ваш пример страницы, он имеет 3 hrefs, которые указывают на файл. Когда вы смотрите на href, иногда вы можете сказать, что это файл, основанный на расширении. Но в обычном сценарии веб-сайты могут выполнять некоторую обработку на стороне сервера и затем возвращать файл. Иногда URL не являются даже файлами, они указывают на какую-то другую страницу.

Итак, вам нужно сделать две вещи.

  1. Получить все якорные теги и ссылки на веб-странице. (Вы можете использовать BeautifulSoup для этого шага)
  2. Отфильтровать URL-адреса файлов из URL-адресов HTML. (Это сложная часть. Вы можете встретить статические ресурсы, такие как.js или.css или файлы изображений и т. Д.)

Для выполнения второй части вы можете использовать библиотеку запросов Python для получения типа контента. Вот небольшой пример:

In [3]: import requests                                                                                                                       

In [4]: response = requests.head('https://speed.hetzner.de/100MB.bin', allow_redirects=True)                                                  

In [5]: response                                                                                                                              
Out[5]: <Response [200]>

In [6]: response.content                                                                                                                      
Out[6]: b''

In [7]: response.headers                                                                                                                      
Out[7]: {'Server': 'nginx', 'Date': 'Tue, 07 May 2019 21:21:28 GMT', 'Content-Type': 'application/octet-stream', 'Content-Length': '104857600'
, 'Last-Modified': 'Tue, 08 Oct 2013 11:48:13 GMT', 'Connection': 'keep-alive', 'ETag': '"5253f0fd-6400000"', 'Strict-Transport-Security': 'ma
x-age=15768000; includeSubDomains', 'Accept-Ranges': 'bytes'}

Если вы посмотрите на response.headers здесь вы можете увидеть "Content-type", который установлен в 'application/octet-stream', Это поле должно использоваться для фильтрации файлов. Существуют и другие типы контента, которые вы должны искать, чтобы решить, является ли он загружаемым или нет. Если у вас есть этот отфильтрованный список, это список загружаемых файлов на этой веб-странице.

Обратите внимание, что я использую requests.head чтобы получить тип контента. Используйте запрос HEAD, чтобы получить мета-информацию об URL. Если вы делаете GET/POST, это может привести к превышению времени ожидания.

Другие вопросы по тегам