从网页的数字范围中提取链接

从网页的数字范围中提取链接

我想从页面的数字序列中提取链接,如下所示:

http://example.com/page001.html
http://example.com/page002.html
http://example.com/page003.html
...
http://example.com/page329.html

我想要的输出是一个文本文件,其中包含从这些页面的链接收集的 URL:

http://www.test.com/index.html
http://www.google.com
http://www.superuser.com/questions

要明确的是,我不想下载页面,我只想要一个链接列表。

Windows 软件是个不错的选择,但 Linux 也不错。我能想到的办法是用 Xidel 编写一个很长的批处理脚本,但遇到错误时它不太可靠。Curl 可以下载一系列页面,但我需要以某种方式解析它们。


感谢 Enigman 让我走上了正确的道路。我创建了一个 Perl 脚本,它从文件中读取 URL,并输出与 $site 中存储的字符串匹配的链接:

use warnings;
use LWP;
$site = "twitter.com";

my $browser = LWP::UserAgent->new;
my @ns_headers = (
    'User-Agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36',
    'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language' => 'en-GB,en;q=0.8',
);

open (URLLIST, 'urls.txt');
while (<URLLIST>) {
    chomp;
    print "# $_\n";
    my $response = $browser->get($_, @ns_headers);
    die "Can't get $_ -- ", $response->status_line
        unless $response->is_success;

    my @urls = $response->content =~ /\shref="?([^\s>"]+)/gi ;
    foreach $url(@urls) {
        if ($url =~ /$site/) {
            print("$url\n");
        }
    }
}
close(URLLIST);

为了生成 URL 列表,我编写了一个小批处理脚本:

@echo off
for /l %%i in (0, 15, 75) do @echo http://www.example.com/page_%%i.html

Perl 脚本在出现错误时会停止,这是我更喜欢的。修改它以继续运行是微不足道的。用户代理和接受数据是从 Chrome 中提取的,因为有些网站不喜欢任何看起来像机器人的东西。如果您打算扫描不属于您的网站,请尊重 robots.txt 并设置自定义用户代理。

答案1

如果您想使用代码来执行此操作,您可以在 Perl 中使用 LWP::Simple 或 Mechanize 模块来完成。

下面的内容可能符合你的要求使用 LWP::Simple 模块从网页中查找所有链接

假设您习惯使用 Perl 的命令行解决方案。这在 Windows 和 Linux 平台上的工作方式相同。无需进行太多修改即可从命令行获取 URL 作为参数进行解析。

答案2

是的,这是一个好用的 bash 脚本。它使用 lynx 浏览器从页面中提取 URL 并将其转储到文本文件中:

#!/bin/bash
#
# Usage:
#
#   linkextract <start> <end> <pad> <url>
#
#   <start> is the first number in the filename range. Must be an integer
#   <stop> is the last number in the filename range. Must be an integer
#   <pad> is the number of digits the number in the filename is zero-padded to. 
#   <url> is the URL. Insert "<num>" where you want the number to appear. You'll
#         need to enclose the entire argument in quotes

for (( i=${1} ; i<=${2} ; i++ )); do {
    num=$(printf "%04d" ${i})
    url=$(echo ${4} | sed "s/<num>/${num}/")
    lynx -dump -listonly "${url}" | sed -r -n "/^ +[0-9]/s/^ +[0-9]+\. //p"
}; done

您需要安装 lynx 浏览器,它在 Debian 上以“lynx”包的形式提供。该脚本将提取的 URL 打印到 stdout。因此,对于您问题中的示例,您需要执行以下操作(假设您将脚本保存到名为 linkextract 的文件中):

$ linkextract 1 329 3 "http://example.com/page<num>.html"

答案3

您可以使用站点可视化工具爬虫适用于此工作。下载并安装,然后单击新项目,输入您的网站网址,点击确定,然后开始抓取工具按钮。

爬取完成后,双击所有链接报告报告选项卡。您将获得网站上存在的所有链接,以及其他信息:源/目标链接 URL、内容类型(HTML、图像、pdf、css 等)、响应等。选择所有表格(上下文菜单或 Ctrl+A 快捷键),然后单击复制带标题的行上下文菜单项。之后,您可以将数据粘贴到 Excel 工作表或简单的文本文档中:

提取所有网站链接

该程序有 30 天的试用期,但功能齐全,因此您可以免费使用 1 个月。

相关内容