ウェブページの数値範囲からリンクを抽出する

ウェブページの数値範囲からリンクを抽出する

次のようなページの番号シーケンスからリンクを抽出したいと思います。

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 に感謝します。ファイルから URL を読み取り、$site に保存されている文字列に一致するリンクを出力する Perl スクリプトを作成しました。

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 モジュールを使用して Web ページからすべてのリンクを検索する

これは、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を入力し、「OK」をクリックして、クロールを開始ツールボタン。

クロールが完了したら、ダブルクリックしますすべてのリンクの報告レポートタブをクリックします。ウェブサイトにあるすべてのリンクと、ソース/ターゲットリンクのURL、コンテンツタイプ(HTML、画像、PDF、CSSなど)、レスポンスなどのその他の情報が表示されます。テーブル全体を選択し(コンテキストメニューまたはCtrl+Aショートカット)、ヘッダー付きの行をコピーコンテキスト メニュー項目。その後、データを Excel シートまたは単純なテキスト ドキュメントに貼り付けることができます。

すべてのウェブサイトリンクを抽出する

このプログラムには 30 日間の試用期間がありますが、フル機能を備えているため、1 か月間無料で使用できます。

関連情報