有没有一个工具可以提取.zip
网站的所有链接并将它们保存到.txt
文件中。我正在使用 Linux mint。我想要.zip
这个网站的所有链接:
http://all-free-download.com/free-photos/
答案1
我有一个解决方案,虽然它并不完美,并且需要您拥有curl
和perl
安装,但 Linux Mint 应该已经具备这两个功能,尽管我的解决方案确实包含我编写的 Perl 模块,该模块可在 CPAN 上使用。同样,Linux Mintcpan
应该已经具备并安装了它,如果您还没有配置它,您可能只需要配置它。
对于模块应用程序::提取链接,你可以像这样安装:
$ cpan App::ExtractLinks
只要您的 Perl 设置正确并且任何 CPAN 模块在您的路径中可见,您现在就可以extract-links
在终端中运行。如果您在不输入任何内容的情况下执行此操作,您将看不到任何内容,因为它只期望 HTML 流,并且它会将出现在href=""
或src=""
属性中的任何 URL 输出到标准输出(打印到您的终端),所以它真的很简单,但通过将其与终端中的某些内容相结合,我们几乎可以实现您的要求。
如果将以下 bash 脚本保存到文件中,并授予其可执行权限chmod 755
或像这样运行它bash filename
:
#!/usr/bin/env bash
while read url
do
while read id
do
curl -s -I "http://files.all-free-download.com/free_download_graphic_$id.html" | perl -n -e '/^Location: (.*)$/ && print "$1\n"'
done < <(curl -s "$url" | extract-links | grep "_download" | grep -Eo '[0-9]*')
done < <(curl -s http://all-free-download.com/free-photos/ | extract-links | grep "\/download\/")
现在让我尝试逐行解释一下。
首先,我们将以下命令的输出传送到while read
循环。
curl -s http://all-free-download.com/free-photos/ | extract-links | grep "\/download\/")
这将从您提供的 URL 获取 HTML,将输出流传输到extract-links
,(-s
参数为curl
just 表示curl
默默执行此操作),然后显示页面中找到的所有链接。然后我们获取此链接列表并仅查找其中包含的链接/download/
,这就是grep
命令正在执行的操作。当然,这不是一个通用的解决方案,我必须查看您提供的站点的 HTML 源代码并找出它们的 URL 逻辑。
在我们获得其中仅有的链接之后/download/
,我们将它们仅传递给循环while read
,循环一次获取每个链接并将链接分配给变量$url
。接下来我们再次执行类似的操作:
curl -s "$url" | extract-links | grep "_download" | grep -Eo '[0-9]*'
这与我们之前做过的相同,但针对的是这个特定的链接,这次会过滤其中包含的任何链接_download
,然后只从链接中获取数字。这又是我弄清楚他们必须使用什么方案来安排链接和下载。
.zip
现在我只想说,这之所以相当复杂,是因为网站上没有任何文件的直接链接,.zip
当你导航到某些页面时,HTTP 重定向后才会开始下载。这让我想到了最后一部分:
curl -s -I "http://files.all-free-download.com/free_download_graphic_$id.html" | perl -n -e '/^Location: (.*)$/ && print "$1\n"'
这只从我们在上一步中检索到的链接中获取数字,再次将它们导入循环while read
,将每个数字分配为变量$id
,并且我们curl
这次再次使用选项,它只检索标头(而不是下载文件),此时每个页面都会进行重定向,然后指向 zip 文件本身。我们通过内联脚本-I
运行输出,该脚本只是一个正则表达式,用于获取HTTP 标头,该标头指定要重定向到哪个文件。curl
perl
Location
所以最后你要做的就是:
bash my_script.sh > links.txt
编辑
需要注意的是,根据我对您提到的这个网站的测试,可能会出现重复的链接,所以请记住这一点。
显然,这不是一个非常有效的操作,但它是自动化的,如果没有网站管理员权限,就没有其他方法可以获取您想要的数据。