Windows 捕获页面重定向的下载链接(WGET)
这是我的问题 我目前正在为自己编写一个脚本,它可以自动下载我用来“清理”电脑的一些软件 我已经能够使用像这样的下载URL进行下载,但不能使用像这样等待很短时间后重定向到下载URL的URL: 我可以看出问题在于我没有给Wget一个直接的下载地址,但我希望能够用地址“”来完成,因为Piriform(Ccleaner的开发人员)非常定期地更新软件,下载地址会根据版本号变化(例如:->) 那么,我如何让Wget获取页面中包含的下载链接而不下载页面本身(因为我在URL“”的末尾得到了一个名为“standard”的文件) 如果您能使用Wget或其他工具(如Curl:)为我提供解决方案,我将非常高兴 提前谢谢。wget spider mode可能可以做到这一点,但这不是curl或wget的工作,您需要获取下载页面,然后从该html中将下载url提取到最新版本,有些页面在下载页面中还提供cookie,并要求您提交此cookie以下载实际文件,这是一种理解HTTP和HTML的语言的工作。就是这样一种语言,以ccleaner的下载页面为例:Windows 捕获页面重定向的下载链接(WGET),windows,url,redirect,download,wget,Windows,Url,Redirect,Download,Wget,这是我的问题 我目前正在为自己编写一个脚本,它可以自动下载我用来“清理”电脑的一些软件 我已经能够使用像这样的下载URL进行下载,但不能使用像这样等待很短时间后重定向到下载URL的URL: 我可以看出问题在于我没有给Wget一个直接的下载地址,但我希望能够用地址“”来完成,因为Piriform(Ccleaner的开发人员)非常定期地更新软件,下载地址会根据版本号变化(例如:->) 那么,我如何让Wget获取页面中包含的下载链接而不下载页面本身(因为我在URL“”的末尾得到了一个名为“standa
#!/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
你不需要PHPwget
本身就足以完成这项简单的工作:)
这是您需要的命令(我将在下面给出详细信息):
现在,要详细了解它的作用:
-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