0

イントラネット上にあるページのすべてのリンクをプルする必要がありますが、それを行うための最善の方法がわかりません。サイトの構成は以下のとおりです。

トピックのリスト

  1. トピック1

  2. トピック2

  3. トピック3

これで、リンクは各トピックページにあります。URIを抽出するために手動で500を超えるトピックページを通過することは避けたいです。

各トピックページの構造は次のとおりです。

http://alias/filename.php?cat=6&number=1

catパラメータはカテゴリを参照し、パラメータnumberはトピックを参照します。

トピックページに入ると、抽出する必要のあるURIが特定の形式で再び存在します

http://alias/value?id=somevalue

警告

  1. 私はデータベースにアクセスできないので、データベースをトロールするオプションはオプションではありません
  2. 各トピックページにはURIが1つしかありません
  3. 新しい行に各URIをリストするだけのファイルにリストを抽出する必要があります

ターミナルからBASHを介して実行できるある種のスクリプトを実行したいと思います。このスクリプトは、トピックURIをトロールし、次に各トピックのURIをトロールします。

一言で言えば

BASHを使用して実行できるスクリプトを使用してリストを抽出するには、トピックのすべてのリストを再帰的に調べてから、各トピックページのURIを抽出し、抽出された各URIを含むテキストファイルを新しいものに吐き出すにはどうすればよいですか。ライン。

4

1 に答える 1

1

HTML::TokeParserおよびWWW::Mechanizeモジュールを使用して、Perlでこれを実装します。

use HTML::TokeParser;
use WWW::Mechanize;

my $site = WWW::Mechanize->new(autocheck =>1);
my $topicmax = 500;  #Note:  adjust this to the number of topic pages you have

# loop through each topic page
foreach(1..$topicmax) {
    my $topicurl = "http://alias/filename.php?cat=6&number=$_";

    # get the page
    $site->get($topicurl);
    $p = HTML::TokeParser->new(\$site->{content});

    # parse the page and extract the links
    while (my $token = $p->get_tag("a")) {
        my $url = $token->[1]{href};
        # use a regex to test for the link format we want
        if($url =~ /^http:\/\/alias\/value\?id=/) {
            print "$url\n";
        }
    }
}

スクリプトはstdoutに出力されるため、ファイルにリダイレクトする必要があります。

于 2012-06-13T23:32:22.470 に答える