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

Windows 捕获页面重定向的下载链接(WGET),windows,url,redirect,download,wget,Windows,Url,Redirect,Download,Wget,这是我的问题 我目前正在为自己编写一个脚本,它可以自动下载我用来“清理”电脑的一些软件 我已经能够使用像这样的下载URL进行下载,但不能使用像这样等待很短时间后重定向到下载URL的URL: 我可以看出问题在于我没有给Wget一个直接的下载地址,但我希望能够用地址“”来完成,因为Piriform(Ccleaner的开发人员)非常定期地更新软件,下载地址会根据版本号变化(例如:->) 那么,我如何让Wget获取页面中包含的下载链接而不下载页面本身(因为我在URL“”的末尾得到了一个名为“standa

这是我的问题

我目前正在为自己编写一个脚本,它可以自动下载我用来“清理”电脑的一些软件

我已经能够使用像这样的下载URL进行下载,但不能使用像这样等待很短时间后重定向到下载URL的URL:

我可以看出问题在于我没有给Wget一个直接的下载地址,但我希望能够用地址“”来完成,因为Piriform(Ccleaner的开发人员)非常定期地更新软件,下载地址会根据版本号变化(例如:->)

那么,我如何让Wget获取页面中包含的下载链接而不下载页面本身(因为我在URL“”的末尾得到了一个名为“standard”的文件)

如果您能使用Wget或其他工具(如Curl:)为我提供解决方案,我将非常高兴

提前谢谢。

wget spider mode可能可以做到这一点,但这不是curl或wget的工作,您需要获取下载页面,然后从该html中将下载url提取到最新版本,有些页面在下载页面中还提供cookie,并要求您提交此cookie以下载实际文件,这是一种理解HTTP和HTML的语言的工作。就是这样一种语言,以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);
#/usr/bin/env-php

你不需要PHP
wget
本身就足以完成这项简单的工作:)

这是您需要的命令(我将在下面给出详细信息):

现在,要详细了解它的作用:

  • -r
    :启用递归,因为我们希望跟踪所提供页面上的链接
  • -l 1
    :由于所需的URL位于同一页面上,因此我们只希望递归一级深度
  • --span hosts
    :所需文件位于与我们提供的原始URL不同的主机上。因此,当使用递归时,我们要求wget跨越主机
  • --accept regex=…
    :指定通过递归访问的链接的正则表达式。因为我们只需要一个文件并且知道模式,所以我们制作了非常具体的正则表达式
  • -erobots=off
    :下载.ccleaner.com
主机有一个禁止所有用户代理的
robots.txt
。但我们不是在抓取域,所以禁用尊重robots文件
  • -nH
    :不要创建特定于主机的目录。这意味着exe将直接下载到您当前的文件夹中
  • 如果您想要更自动化一点,您还可以在上述命令中附加一个
    &&rm-r 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
    

    感谢您的出色工作,我还没有想到PHP解决方案。我的新问题是:我可以从批处理脚本启动PHP脚本吗?(因为我忘了说我在Windows上)。@Spekuloos当然,如果电脑上有php。windows PHP buils在这里可用-您可以从批处理脚本调用,如
    C:\PHP\PHP.exe script.PHP
    ,或者如果PHP.exe的文件夹添加到windows的%path%变量中,您可以像
    PHP script.PHP
    一样运行它(我通常在自己的系统中将PHP添加到path变量中)Ok,在我的例子中,我只是将php文件夹放在我的项目文件夹中,并在批处理脚本中使用相对路径。还有一个问题。当我启动脚本时,它说curl_init不是一个已定义的函数。我需要下载图书馆或其他什么吗?编辑:我的php文件夹中没有任何php.ini,这正常吗?@Spekuloos no.php.exe旁边是一个名为
    php.ini development
    ,将其重命名为
    php.ini
    ,然后在记事本中打开
    php.ini
    ,你会发现一行写着
    ;extension=curl
    ,从该行中删除分号(使其成为
    extension=curl
    ),然后保存它。那么curl_init应该work@Spekuloos我突然想到:因为您要使用httpS SSL/TLS保护的网站,所以您可能还需要对写有
    的行执行相同的操作;extension=openssl
    (libcurl可能使用openssl来解密httpS)Thx作为您的答案,但我尝试了,它仍然下载了一个名为“标准”没有扩展。看起来我无法跟踪此站点上的重定向。这不应该发生。您能否向该命令添加
    -d
    ,然后共享整个输出?把它放在垃圾桶里?从我的角度来看,我可以很好地运行这个命令,所以我想调查一下为什么它最近不能在你的教学中使用,这是添加了-d的命令的粘贴库。似乎您的regex后端就是问题所在。出于好奇,请您也发布一下
    wget--version
    的结果好吗?解决问题的一个方法是使用
    '.*download.ccleaner.com\/.*.exe'
    作为正则表达式字符串。(注意斜杠已经转义)我尝试了斜杠转义的解决方案,同样的问题。我在其中有一个文件夹和子文件夹->fr fr/ccleaner/download,其中有一个名为standard的文件。
    $ wget -r -l 1 --span-hosts --accept-regex=.*download.ccleaner.com/.*.exe -erobots=off -nH https://www.ccleaner.com/fr-fr/ccleaner/download/standard