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

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

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

1 Ответ

0 голосов
/ 08 мая 2019

Глядя на вашу страницу примера, она имеет 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, это может привести к превышению времени ожидания.

...