努力したWiki

推敲の足りないメモ書き多数

ユーザ用ツール

サイト用ツール


documents:perl:perl-010

Perlで WWW::MechanizeとWeb::Scraper を使いWebページのクロールをやってみる

2012/06/11
PerlでWWW::Mechanize と Web::Scraperを使ったサイトクロールのサンプル。 内容はRSSで取ったほうが早いけど、あくまでサンプルなので。

2013/04/06
こちらのドキュメントは管理都合によりPerl関連ドキュメントのネームスペースへ移動しました。

Yahoo!ニュースのトピック切り出し

とりあえずこんなコードは良く見かけますが例を挙げておきます。yatopic.plとでもしておきましょうか。

yatopic.pl
use Encode;
use WWW::Mechanize;
use Web::Scraper;
 
my $baseUrl  = 'http://dailynews.yahoo.co.jp';
my $yahooUrl = 'http://dailynews.yahoo.co.jp/fc/';
my $encstr   = 'euc-jp';
my $mech     = WWW::Mechanize->new(autocheck=>1);
 
my $topicsMenuParse = scraper {
      process '//div[@id="globalNav"]/ul[@id="gnSec"]//li',  "menulinks[]"=> scraper {
           process "a", href=>'@href';
           process "a", text=>"TEXT";
      }
};
 
my $topicsLinkParse = scraper {
      process '//div[@id="topics"]/div[@class="topicsList"]/ul[@class="clr"]//li', "topiclinks[]"=> scraper {
           process "span", date=>"TEXT";
           process "a",    href=>'@href';
           process "a",    text=>"TEXT";
      }
};
 
my $menuResult;
 
  $mech->agent_alias("Windows Mozilla");
 
  $mech->get( $yahooUrl );
  $menuResult = $topicsMenuParse->scrape( $mech->content );
 
  foreach my $categoryLink ( @{ $menuResult->{menulinks} } )
  {
      my $topicResult;
      my $text = encode($encstr, $categoryLink->{text});
      my $href = encode($encstr, $categoryLink->{href});
 
        printf("*** %s ( %s )\n",  $text, $href);
 
        $mech->get( "".$categoryLink->{href} );
        $topicResult = $topicsLinkParse->scrape( $mech->content );
 
        foreach my $topicLink ( @{ $topicResult->{topiclinks} } )
        {
           my $date = encode($encstr, $topicLink->{date});
           my $text = encode($encstr, $topicLink->{text});
           my $href = encode($encstr, $topicLink->{href});
 
             printf("%s %s ( %s )\n",  $date, $text, $baseUrl.$href);
        }
  }

説明

yatopic.plでは、WWW::MechanizeでYahoo!ニュースのトピックスページを取得、Web::Scraperで利用するHTML要素の切り出しを行っています。

URL http://dailynews.yahoo.co.jp/fc/ がYahoo!ニュースのトピックスページになります。 トピックスは

  • 国内
  • 海外
  • 経済
  • エンターテインメント
  • スポーツ
  • コンピュータ
  • サイエンス
  • 地域
  • バックナンバー
  • 編集センター

に別れている為、各々のトピックスへのリンクを取得する必要があります。 HTML中から該当する箇所を切り出ししますが、そのHTMLの切り出し位置をXPathで指定します。

 //div[@id="globalNav"]/ul[@id="gnSec"]//li

DIVタグのid属性が“globalNav”で、その内包要素のULタグ、id属性“gnSec”のLIタグにそのリンクがありますので、各LIタグ以下のコレクションを作りキーmenulinksで保持します。そのコレクションの内容は、Aタグのhref属性、テキスト、となっています。

次にこのコレクションのリンクで指すページ(HTML)を一つずつ取得し、トピックの情報を切り出し、出力します。

 //div[@id="topics"]/div[@class="topicsList"]/ul[@class="clr"]//li

id属性が“topics”のDIVタグ以下にあるid属性“topicsList”のDIVタグにULタグ、class属性“clr”があります。この配下のLIタグに日時とテキスト、記事へのリンクががありますので、各LIタグ以下のコレクションを作りキーtopiclinksで保持します。そのコレクションの内容は、SPANタグのテキストにある日時、Aタグのhref属性、テキスト、となっています。

documents/perl/perl-010.txt · 最終更新: 2023/04/14 02:32 by 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki