Subscribed unsubscribe Subscribe Subscribe

SE Can't Code

A Tokyo based Software Engineer. Not System Engineer :(

Webクローラー

Python

検索エンジンは面白い。 ここ最近、Webクローラーのハンズオンに参加したり、web上のスクレイピング記事を漁ってみたり、PythonのScrapyを使ってみたり、UdacityでWebクローラーの講義を受けたりしている。この世界で偉大なプロダクトの一つであり、有名なGoogle先生検索エンジンの一端に触れているようで(とても入口だけれど)、とてもワクワクする。検索っ子になれるように以下の基本的なコードを読み解くとする。

get_page

テスト用のページであり、ここ記載しているURL上から各リンクを自動でクロールすることになる。

get_next_target

指定したページ内にあるLinkを返す。 HTMLのリンク指定である「<a href」がpage内にあることをfind関数で確認する。確認出来たら、Link開始のダブルクォートを探してリンクをクロールするスタート地点とする。その後、Linkの終わりを示すダブルクォートを探し終了地点とし、スタート地点から終了地点までの文字列をurl変数に格納する。また、終了地点を返すことにより、get_all_linksに呼び出された際のループ処理で、終了地点以降のリンクを探すことを可能とする。

get_all_links

get_next_targetを呼び出し、宣言したlinksリストにurlを追加していく。また、page内の終了地点以降の文字列をpageに格納することで、クロールが完了したurl以降の次のurlの検索に移ることが出来る。ループ分ではget_next_linkでNone, 0が返ってきた場合、ループを抜け、page内にある全てのリンクを返す。

crawl_web

tocrawlリストはクロール対象のlinkの格納先であり、crawledリストはクロールが完了したlinkの格納先である。tocrawlリストにクロール対象のLinkがある限り、クロールを続けることになり、pop関数を使ってtocrawlリストからLinkを出してpage変数へ格納している。クロールの際、過去に同じLinkをクロールしないようにチェックする必要があるため、crawledリストでのpageの有無を確認する。if分以下で行っていることは二つで、tocrawlにクロール対象のpage内にあるlink全てを追加していることと、クロール対象となったpageをcrawledリストに追加している。このcrawledリストが最終的にクロールを行ったすべてのLinkが入ったリストとなる。

以下出力

['http://xkcd.com/353', '/license.html', 'http://www.buttercupfestival.com/buttercupfestival.htm', 'http://thisisindexed.com/', 'http://wondermark.com/', 'http://achewood.com/', 'http://questionablecontent.net/', 'http://www.boltcity.com/copper/', 'http://pbfcomics.com/', 'http://www.asofterworld.com', 'http://www.qwantz.com', '/atom.xml', '/rss.xml', '/354/', 'http://dynamic.xkcd.com/random/comic/', '/352/', '/1/', '/', 'http://forums.xkcd.com/', '/about/', 'http://store.xkcd.com/', 'http://blag.xkcd.com/', 'http://xkcd.com/554', 'http://buttersafe.com/', 'http://www.smbc-comics.com/', 'http://oglaf.com/', 'http://threewordphrase.com/', '/555/', '/553/', 'http://blog.xkcd.com/2012/02/27/geohashing-2/', '/archive/']

基本的なクローラーは以上で実装出来る。
次は検索の質のどうするかという問題になる。

Remove all ads