- blogs:
- cles::blog
岡崎市立中央図書館事件の当事者のまとめ
scrape
law 岡崎市立中央図書館をアクセスするクローラーを書いて、実行したために偽計業務妨害で逮捕されてしまった本人自らがまとめと見解を発表するサイトを公開していたのでメモ。
僕も被疑者が逮捕されたときからちょっと変だとは思っていました。起訴猶予ですが、結局20日間も拘留されてしまったのですね。
このサイトをご覧の方々へ | Librahack : 岡崎市立中央図書館HP大量アクセス事件まとめ
騒がしくなった原因は、コンピュータやネットを生業とする方々と、新聞記者を含む一般の方々との、知識のギャップにあるのではと予想しています。例えば、リクエスト33,000回という定量的な値ひとつとってみても、正反対の印象を受けたのではないでしょうか。
たしかにこれはあるかもしれません。エンジニアであれば1日が86400秒であることはマジックナンバーとして覚えている人が多いはずです。秒間1件のアクセスをしたとしても大量アクセスをした積算時間は9時間ちょっとに過ぎず、1日あたりのアクセス時間は1時間にも満たないことや、そのようなアクセスで毎日のようにサーバを再起動しないといけない状態にウェブサーバがなっていたという事実は新聞には載っていないですからね。
このあたりなかなか難しいところがありますが、アクセス社団等の措置をとらずにいきなり逮捕されたというのはやっぱり疑問ですね。そういえばウチのサイトでも楽天ファストモバイルサーチが秒間10件アクセスしてくるということをやらかしてくれたという事件があったなぁということを思い出しました。
Anemoneというクローラーフレームワークを使ってみる
ruby
scrape これまでクローラー使い捨てのクローラーは結構力業で作ってきたのですが、さすがにこういうことをやり始めてから1年以上が経ちこのままでは立ちゆかない事がいろいろと顕在化してきたので、クローラーを作るためのフレームワークをいろいろ調べていました。
JavaであればLuceneのサブプロジェクトであるNutchや、Seasarプロジェクトで開発されているS2Robot、PerlであればGunghoあたりに興味があるのですが、後処理の部分はRubyで書いてしまってあるので今回はAnemoneというフレームワークをつかってみることにします。
Anemone - Ruby Web-Spider Framework
Anemone is a Ruby library that makes it quick and painless to write programs that spider a website. It provides a simple DSL for performing actions on every page of a site, skipping certain URLs, and calculating the shortest path to a given page on a site.[Anemoneというクローラーフレームワークを使ってみる の続きを読む]
The multi-threaded design makes Anemone fast. The API makes it simple. And the expressiveness of Ruby makes it powerful.
MechanizeでUTF-8以外のページをスクレイピングするときの文字化け対策
ruby
scrape
charset RubyのMechanizeはスクレイピングをするときにとても便利なライブラリですが、UTF-8以外のページだとどうしてもうまく取得出来ないページがあって困っていたのですが、「Mechanize Nokogiri の非JIS文字対応 - それはそれ。これはこれ。」というエントリを参考にworkaroundを追加してなんとか回避することに成功したのでメモ。
ほとんど参考にしたエントリそのままですが、共通のルーチンでいろんなエンコードに対応させたかったので、NKFの引数から入力エンコーディングの指定を取り去ったり、metaタグ内の"Content-Typeのエンコーディングの書き換えについてはちょっと手を入れています。
フックをつかってパーサーに渡る前の文字列のエンコーディングをあらかじめ変更しておいてあげるというなかなかの力業ですが、Nokogiri内の処理が信頼できない以上、それもいたしかたないですね。
HpricotのXPath実装はちゃんとしてない?
ruby
scrape HpricotのXPathの実装が完全でないことは薄々気づいていたものの、新たなライブラリを探すのも面倒だと思ってそのままにしていたのですが、とうとうちゃんと処理できない事例にあたってしまいました。
今回処理をしようとしたのは下記のコード中のようなHTMLから「<h2>aaa111</h2>の直後の<div class="a">の中身のテキストを取り出す」というもの。取り出したいdivにidなんかがついていればいいのですが、ちゃんと構造化されていないHTMLなのでどうしようもありません。
とりあえずノードを指定するXPathである //h2[text() = 'aaa111']/following-sibling::div[@class='b'][1]/text() はすぐに書けたのですが、Hpricotだと結果がきちんと帰ってきません。どうやらfollowing-siblingが使えないようです。ちなみに同じXPathをNokogiriに食わせるときちんと結果が帰ってくることが確認できたので、これを機にNokogiriに乗り換えてしまうことにしました。
[HpricotのXPath実装はちゃんとしてない? の続きを読む]
Mechanize0.9.0でスクレイピングがうまくいかないときは
ruby
scrape
charset 新サーバに移行をしたらcronに仕込んであるmixi2gmailがうまく動かなくなってしまいました。
同じスクリプトを旧サーバで実行すると正常に動作するので、何か環境に依存した問題なんだろうと思って、詳しく調べてみると
という部分で続きを読むがうまく見つけられていないようだったので、おそらく文字コードの問題だろうということで、文字コードを変えてみたりといろいろ試行錯誤をしていたのですが、ふとエラーを吐いているのがいつものHpricotではなくて、見慣れないNokogiriであることに気づきました。
ということで、ググってみるとMechanizehは0.9.0からHTMLパーサーがHpricotからNokogiriに変更されていて、日本語を検索するようなスクリプトを書いている場合には、この仕様変更による副作用があるというのが結論のようです。
RubyのMechanize0.9.0&Nokogiriは日本語をうまく扱えないことがある - きたももんががきたん。
なお、「NokogiriはHpricotと互換」と謡われていますが、実はこの文字エンコードの扱いの部分が違います。
Hpricot
文字エンコードは不変で出力は素通し
Nokogiri
文字エンコードは入力が UTF-32/16/8 か ASCII を期待、出力は UTF-8 に強制的に変換
これまでNokogiriは使ったことがなかったのでよく知りませんでしたが、このあたりは覚えておいた方が良さそうです。
[Mechanize0.9.0でスクレイピングがうまくいかないときは の続きを読む]
JavaScriptバリバリのページをスクレイピングする
ruby
scrape 普段ウェブのスクレイピングにはWWW::Mechanizeを使っています。WWW::MechanizeはJavaScriptが解釈できないので、これまでは自分でJavaScriptを解釈してプログラミングをしていたのですが、スクレイピングの妨害のためなのか何なのかは良くわかりませんが、尋常じゃない程のJavaScriptを解釈しなければならないページにぶち当たってしまって、この一週間途方に暮れていました。
いろいろ調べた結果、IEやFirefoxを外部から操作する方法が一番早いようなので、Rubyから使えるWatirというライブラリを使ってみることにしました。内部的にはWin32APIを使ってIEをコントロールするようです。後々バッチ化をすることを考えると、あまりWindows依存で起動時に画面が必要になるアプリにはしたくないのですが、この際ですから仕方ありません。
Watir is an open-source library for automating web browsers. It allows you to write tests that are easy to read and maintain. It is simple and flexible.
Watir drives browsers the same way people do. It clicks links, fills in forms, presses buttons. Watir also checks results, such as whether expected text appears on the page.
このWatir、何と読んだらいいから分からなくて困りましたが、Watir pronounceで検索してみたらプロジェクトのトップページに"It is pronounced water."とちゃんと書いてありました。ウォーターと読めばいいようです。
[JavaScriptバリバリのページをスクレイピングする の続きを読む]
WWW::Mechanizeでニコニコ動画からflvをダウンロードする
ruby
scrape
niconico rubyのWWW::Mechanizeを使ってニコニコ動画からflvをダウンロードするスクリプト。
[ruby] ruby with mechanizeでニコニコ動画のダウンローダーを作ってみた - よしだメモ
ちょっとそのままでは動かなかったので、スクリプトを読んでみたらどうもloginを呼んでいないようだったのでget_flvからloginを呼んであげるようにしたら動くようになりました。こういうスクリプトがサクッと作れるWWW::Mechanizeってやっぱり便利だなぁ。phpでもこういうモジュール使えるようにならないかな。。。
[WWW::Mechanizeでニコニコ動画からflvをダウンロードする の続きを読む]
scRUBYt!を使ってmixiの足跡をスクレイピング
ruby
scrape
mixi
xml "ruby スクレイピング"というキーワードでいろいろ検索してまわってみたらWWW::MechanizeよりもscRUBYt!の方が面白そうだったので、これをつかって軽く練習してみることにします。他にもscrAPIというのもあるみたいですが、日ごろからXSLのコーディングをしていたりすることもあってCSSのセレクタ表記よりもXPathに馴染んでいるということでscRUBYt!を選んでみました。
かるく肩慣らしということで、mixiの足跡をスクレイピングしてみました。
なぜ足跡なのかといえば、特に深い意味はないんですけど。。。。。
Web::Scraper超便利
perl
scrape もう3年くらい前になりますが、Template::ExtractでWebのスクレーピングをするのが便利だという話がありました。で、当時作ったスクリプトが実はまだ某所で動いていたりするわけですが、いまやもっと便利なライブラリができてるんですねぇ。
ばっちりですね。シンボルの書き方とかがちょっと違うところ以外は Ruby 版とほぼ等化。DSL 周りのドキュメントはまだないけどとりあえず scrapi のドキュメントを読めば ok! \(^o^)/
時間はただ流れているわけでありませんね。ということでちょっとテストしてみました。perlを書くのは久しぶりです。
[Web::Scraper超便利 の続きを読む]- sadpkv
- CACHEMANAGER.phpというのはどうだろうかと
- pairb1m
- Lightning のToDoリストを複数のPCで共有できるアドオン
- majodca
- 九州旅行から帰ってきました
- majodca
- 九州旅行から帰ってきました
- hot534
- yum を使って OpenVPN をインストールする
- dresssu3
- NP_Trackbackを騙るトラックバックspamについて
- zippern7o
- NP_SpamBayesJP jp1b
- park81o
- Google Docs をメールフォームとして使う
- fogmpl
- なんで官庁の文章はPDFなんだろうか
- cutjw9
- 即席スライドショーを作る
- frightenlho
- 添付ファイルの容量を表示する「Attachment Sizes」
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(5019)
3 . GitHub が全ての公開リポジトリへのシークレットスキャンを有効に(4162)
4 . 年次の人間ドックへ(4089)
5 . 2023 年分の確定申告完了!(1つめ)(3945)
Academic[574]
Book[155]
Diary[522]
Disaster[101]
Foodlogue[1425]
Game[284]
Goods[805]
Healthcare[341]
Hobby[32]
IT[1195]
Military[343]
misc.[1570]
Mobile[510]
Music[38]
Neta[106]
News[95]
Photo[391]
RealEstate[120]
Security[1178]
SEO Contest[36]
Software[634]
Tips[1886]
Travelogue[1238]
Web[675]
Work[193]