アドベントカレンダーの最後を糞な記事で締めくくりたい!
この記事はWebスクレイピング Advent Calendar 12/25 の記事です。
初めに
大体タイトルの通りなので割と読むだけ時間の無駄です。
書くのも時間を無駄にした感が半端ないです。
私とクローリング
私がWebページをクローリングしようとした最初のきっかけは、とあるテキスト系サイトのテキストを読み逃しなく読みたいという欲求からでした。
当時、個人でWebサイトを持つのが普通になって、みんなhtmlタグをポチポチ自分で打ってた頃、過去ログなんて存在しない!みたいなテキストを不定期に更新するだけのページが存在しました。
RSSとかそんな良いものもなく、とりあえず毎日見てれば逃すことはないだろうという雰囲気があったころ。
ただ、毎日巡回するってまぁ大変で忘れますよねって、そこで毎日クローリングして変化があれば保存するというそれだけのスクリプトを書きました、perlで。
何のひねりもなく、常時起動してるWindowsマシンのタスクスケジューラに登録して毎日巡回させてました。
以来、RSSが登場してもRSSなんか見ないので、結局そのテのものはデイリーくらいで巡回させて拾うようにする癖がつきました。
私とスクレイピング
私がWebページのスクレイピングをしようとしたきっかけは、画像掲示板でした。
また当時、画像掲示板なるものが流行り、いわゆる二次加工な二次元壁紙をひたすらいろんな人が貼るだけの掲示板というのが大量にできました。
双葉とかしおからとかsweetnoteとかいちごとかいろいろ。
そういう画像を見るわけでもなく、ひたすらHDDの肥やしにするということに無駄に熱を注いでいる時期がありました。
当然ながら、効率よくデータを集めたくなるのが心情というものです。
で、巡回ツールが出回ったりするわけですが、当時はまだWebサイト側の回線も貧弱だったり、ホスティングサービスの無料プランでは大量にダウンロードされたりするとすぐ従量限界に達して503しか返さなくなるみたいなこともあり、メジャーどころの巡回ツールはだんだん対策されるわけです。
一例として、refererを見たりUser-Agentを見たりするようになりました。 cookieを使い始めるものもありました。
頑張ってるところでは、メインページにサムネイルと個別ページへのリンク、個別ページでimgタグを利用して画像を張り付けているもの(サムネイル、個別ページ、画像本体のアドレスが結構バラバラでちゃんと追わないと拾えない)や、通常の画像と同じようにhtml上では記載されているけれど、Webブラウザで見ると見えないようになっており、そこにアクセスすると一定時間IPAddressによる制限が入って閲覧できるなるもの、等、だんだん趣向を凝らしたものになっていったりしていました。
そこで、ツールに頼っていると対応待ちが発生するなど、不便極まりないため、やっぱり自分で作ることになります。
そんなに頑張って探したりもしてないので、クローリングに適したフレームワークが当時存在したのかどうかは定かではないのですが、そういうのは利用していませんでした。
htmlを適当に解析して、画像のURLをひろいだして、ファイル名一致でダウンロード済でないか確認して、持ってなければダウンロードみたいな単純なところから始まり、可能な限り人間がたどるのと同じようにたどって画像をダウンロードする、そんなところにばかり力を入れていました。 やっぱりperlで、perlにはLWPという素晴らしいモジュールが存在しまして、refererやcookieも当然のように扱え、この手の巡回にはとても便利だったのを覚えています。
画像掲示板自体は、いくつかの種類の掲示板スクリプトがとてもよくつかわれていたので、やっぱりそういうのに対応できるように作っていくわけです。
掲示板が数種類の累計に分類されるので、スクリプトのつくりも、クローリングする部分、htmlを解析して画像URLを回収する部分、次のページを指定する部分、画像をダウンロードする部分など、適度に交換可能な形で作るようになりました。今だといろんなフレームワークが便利にやってくれる部分ですね。
どうでもいいですが今でも当時の画像ファイル群がHDDに埋まっていたりします。1024x768とかでもまともなサイズだったんですよ。
ちなみに、このころもrobots.txtなどはありましたが、そんなのは見もしていませんでした。でも特にそれが原因で揉めたような話も聞きませんので、牧歌的な時代ですね。 いくつか試した巡回ツールにもそんな機能はなかったんじゃないかと思います。
私と現在のクローリング
現在は、もうそんなにクローリングしてなくて、 某漫画家さんのサイトがちょうど過去ログ残さず、テキストと画像が不定期に差し変わるというサイトと、時間や数量制限のある、メディアプレイヤー向けskinをアップロードする掲示板の2か所くらいしか巡回していません。
今はperlではなくpythonを使っていて、普通にhttp.clientとかurllibで書いています。巡回してデータを拾ったらtwitterにDM送るようにして、貯めるだけ貯めて見ないという状況をなくす工夫もしています。
進化しました。
そうは言っても、言語が変わってもやっぱりやりたいこと、その方法はそう大きく変わらず、今でもフレームワークを利用して……みたいなことはやっていません。
たとえばこんな(随分前に書いたやつなので今見るとアレな感じですが)
from http.client import HTTPConnection, HTTPSConnection import re import os.path from localtwitter.twitter import * img = re.compile(r'src="([^\s/]+\.[\w]{1,3})"') SAVE_DIR = "/path/to/save/dir/" def get_image_list(c): c.request('GET', '/') r = c.getresponse() if r.status == 200: return img.findall(str(r.read())) return [] if __name__ == '__main__': c = HTTPConnection('<URL>') images = get_image_list(c) print(images) save_list = list() for img in images: if os.path.isfile(SAVE_DIR + img): print(SAVE_DIR + img, "is exist") continue c.request('GET', "/" + img) r = c.getresponse() print(img) print(r.status) if r.status == 200: with open(SAVE_DIR + img, "xb") as file: file.write(r.read()) save_list.append(img) if len(save_list) > 0: token,secret = get_cred() send_message(user = "<twitter_user_name>", message = ",".join(save_list) ,oauth_token = token, oauth_secret = secret)
このあたり、もうちょっと進歩すべきなんだろうなぁと思っています。
来年は、クローリングのためのフレームワークをちゃんと使えるようになりたいですね。
終わりに
そんなわけで、ほんとに糞みたいなというかまさに糞そのものな記事を書きました。
ここまで読んだ暇人さん、きょうは12/25ですよ、ほかにやることないんですか!
ということで、Advent Calendar お疲れさまでした。