Захватить ссылку для скачивания, перенаправленную на страницу (WGET) - PullRequest
0 голосов
/ 07 ноября 2018

Вот моя проблема.

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

Мне удалось сделать загрузки с URL-адресами для загрузки, подобными этому: "https://www.driverscloud.com/plugins/DriversCloud_Win.exe", но не с URL-адресами, которые перенаправляют на URL-адрес загрузки после короткого времени ожидания, как этот:" https://www.ccleaner.com/fr-fr/ccleaner/download/standard".

Я вижу, что проблема в том, что я не даю адрес прямой загрузки для Wget, но я хотел бы иметь возможность делать это с адресом "https://www.ccleaner.com/fr-fr/ccleaner/download/standard", потому что Piriform (разработчик Ccleaner) обновляет программное обеспечение довольно регулярно, и адрес загрузки изменяется в соответствии с номером версии (пример: https://download.ccleaner.com/ccsetup547.exe -> https://download.ccleaner.com/ccsetup548.exe).

Так как я могу попросить Wget взять ссылку на скачивание, содержащуюся на странице, а не загружать саму страницу (потому что я получаю файл с именем "standard", как в конце URL-адреса "https://www.ccleaner.com/fr-fr/ccleaner/download/standard"?

Я был бы рад, если у вас есть решение для меня с помощью Wget или других инструментов, таких как Curl :).

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Вам не нужен PHP для этого. wget достаточно мощный, чтобы выполнить эту простую работу:)

Вот команда, которая вам нужна (ниже я приведу разбивку):

$ wget -r -l 1 --span-hosts --accept-regex='.*download.ccleaner.com/.*.exe' -erobots=off -nH https://www.ccleaner.com/fr-fr/ccleaner/download/standard

Теперь рассмотрим, что это делает:

  • -r: включает рекурсию, поскольку мы хотим перейти по ссылке на предоставленной странице
  • -l 1: мы хотим использовать только один уровень, так как требуемый URL находится на той же странице
  • --span-hosts: требуемый файл находится на другом хосте, чем исходный URL, который мы предоставляем. Поэтому мы просим wget переходить через хосты при использовании рекурсии
  • --accept-regex=...: Это указывает на регулярное выражение ссылок, которые будут доступны через рекурсию. Поскольку нам нужен только один файл и мы знаем шаблон, мы делаем довольно специфическое регулярное выражение.
  • -erobots=off: На хосте download.ccleaner.com есть robots.txt, запрещающий все пользовательские агенты. Но мы не сканируем домен, поэтому отключите почитание файла роботов
  • -nH: Не создавать каталоги, специфичные для хоста. Это означает, что exe будет загружен прямо в вашу текущую папку.

Если вы хотите немного больше автоматизации, вы также можете добавить && rm -r fr-fr/ к вышеуказанной команде, чтобы удалить загруженную вами базовую страницу, чтобы получить правильную ссылку.

Наслаждайтесь!

РЕДАКТИРОВАТЬ: так как OP находится в Windows, вот обновленная команда специально для запуска в Windows. Он не заключает в кавычки строку регулярных выражений, поскольку это заставляет оболочку Windows передавать регулярное выражение в виде строки с одинарными кавычками.

$ wget -r -l 1 --span-hosts --accept-regex=.*download.ccleaner.com/.*.exe -erobots=off -nH https://www.ccleaner.com/fr-fr/ccleaner/download/standard
0 голосов
/ 07 ноября 2018

режим wget spider может быть в состоянии это сделать, но это не работа ни для curl, ни для wget, вам нужно получить страницу загрузки, а затем извлечь URL загрузки в самую последнюю версию Исходя из этого HTML, некоторые страницы также предоставляют файл cookie на странице загрузки и требуют, чтобы вы отправили этот файл cookie для загрузки фактического файла, это работа для языка, который понимает HTTP и HTML. PHP - один из таких языков, на примере страницы загрузки ccleaner:

#!/usr/bin/env php
<?php
$ch = curl_init("https://www.ccleaner.com/fr-fr/ccleaner/download/standard");
curl_setopt_array($ch, array(
    CURLOPT_COOKIEFILE => '',
    CURLOPT_ENCODING => '',
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_SSL_VERIFYPEER => 0
));
$html = curl_exec($ch);
$domd = @DOMDocument::loadHTML($html);
$xp = new DOMXPath($domd);
$download_element = $xp->query('//a[contains(text(),"start the download")]')->item(0);
$download_url = $download_element->getAttribute("href");
$download_name = basename($download_url); // fetching it from the headers of the download would be more reliable but cba
echo "download name: \"{$download_name}\" - url: {$download_url}\n";
curl_setopt($ch, CURLOPT_URL, $download_url);
$installer_binary = curl_exec($ch);
file_put_contents($download_name, $installer_binary);

этот скрипт извлекает страницу загрузки, затем извлекает атрибут "href" (url) элемента <a href="download_url">start the download</a>, содержащего текст start the download, а затем загружает все, на что указывает этот URL. это выходит за рамки wget / curl, используйте язык сценариев.

enter image description here

...