捕获通过页面重定向的下载链接(WGET)

时间:2018-11-07 12:39:12

标签: windows url redirect download wget

这是我的问题。

我目前正在为我编写一个脚本,该脚本可以自动下载一些我用来“清理”计算机的软件。

我已经能够使用这样的下载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”? / p>

如果您有使用Wget或其他工具(例如Curl :)的解决方案,我会很高兴。

谢谢。

2 个答案:

答案 0 :(得分:1)

您不需要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:由于所需的网址在同一页面上,因此我们只想递归深一层
  • --span-hosts:所需文件位于与我们提供的原始URL不同的主机上。因此,我们要求wget在使用递归时遍历主机
  • --accept-regex=...:这指定将通过递归访问的链接的正则表达式。由于我们只需要一个文件并知道模式,因此我们制作了非常具体的正则表达式。
  • -erobots=offdownload.ccleaner.com主机有一个robots.txt,它禁止所有用户代理。但是我们不会抓取域,因此请禁用兑现漫游器文件
  • -nH:不要创建主机特定的目录。这意味着该exe文件将立即直接下载到您当前的文件夹中。

如果您想进一步自动化,还可以在上述命令后附加&& rm -r fr-fr/来删除下载的基本页面,以获取正确的链接。

享受!

编辑:由于OP在Windows上,因此这是专门在Windows上运行的更新命令。它不会对正则表达式字符串进行单引号,因为这会导致Windows Shell将正则表达式作为带有单引号的字符串传递。

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

答案 1 :(得分:0)

wget蜘蛛模式可能能够做到这一点,但这对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);

此脚本获取下载页面,然后提取包含文本<a href="download_url">start the download</a>的{​​{1}}元素的“ href”(URL)属性,然后下载该URL指向的内容。这超出了wget / curl的范围,请使用脚本语言。

enter image description here