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


2

我想从这样的数字序列中提取链接:

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并设置自定义用户代理。


我不明白你的意思。你能更详细地解释一下吗?你要解析哪些网址?你想简单地提取元素的href属性<a>吗?你在哪里得到数字序列?
Birei 2014年

假设页面包含指向randomfilehost.com上存储的文件的链接。我想解析页面范围并提取所有这些链接。只是URL,不需要任何HTML。谢谢。

所以你的意思是你神奇地知道围绕一个单一数字建立的URL列表,你确实想要下载这些页面,但是你想要解析它们,提取元素的href属性<a>,保存它们,并丢弃其余的HTML。对?
G-Man

我只想要链接,这涉及下载页面,但如果这就是你的意思我不需要存储它们。

你需要走多远?只是主页上的内容是什么?
Journeyman Geek

Answers:


3

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

以下可能具有使用LWP :: Simple模块从网页查找所有链接之后的内容

这是假设您熟悉使用Perl的命令行解决方案。这在Windows和Linux平台上都是一样的。修改将URL作为参数从命令行进行解析并不需要太多时间。


谢谢,这看起来像我可以提出一个可行的解决方案。

3

是的,这是一个很棒的'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"

1

您可以使用Site Visualizer搜寻器进行此项工作。下载并安装它,然后单击New Project,键入您网站的URL,单击OK,然后单击Start Crawl工具按钮。

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

提取所有网站链接

该计划有30天的试用期,但它功能齐全,所以你可以免费使用1个月。


谢谢。我看到的唯一问题是它似乎不支持我需要的页面范围。有很多爬行应用程序可用,但它们只覆盖整个站点,其中有数万页。我只想做几百的范围而不是别的。

您可以使用“ 包含网址抓取”选项设置此类网址范围。
Oleg 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.