世界最強のエロゲサイト、Getchu.comをNokogiriでスクレイピングする方法
私が、最も利用し世界で一番優れていると思うサイトはもちろんAmazon様なのですが、では「二番目に尊敬するサイトは?」と言われると間違いなく「getchu.com」を上げると思います。http://www.getchu.com/top.html
エロゲを全く知らない人にわかりやすく説明すると「エロゲ界のアマゾン」がgetchu.comになります。
エロゲ以外も取り扱ってはいますが、基本的にはエロゲ、エロアニメメイン。
クールジャパンの誇るHENTAI文化の一旦を担っており、海外のオタク関連のサイトは頻繁にgetchu.comのリンクを多用しているため、日本より海外のアクセスが多いのでは?と心配してしまうぐらいの大人気サイトです。
つまり、エロゲDBとしては日本、いや世界最強のサイトであり、ここのデータを使えばマイ、エロゲDBシステムの構築も不可能ではありません。
本当はgetchu.comがREST APIでも提供してくれればいいんですが、中世ジャップランドのサイトにそこまで求めるのは横暴でしょう。
そこで、REST APIでの取得を諦めた場合の選択肢としてHTMLスクレイピングという古風な手法を取らざるをえません。
そこで今回はRuby HTMLスクレイピングツールとして有名なNokogiriモジュールさんの力を借りて、getchu.comの月別販売ページから指定した月の発売エロゲタイトル一覧を取得するスクリプトを書いてみました。
HTMLスクレイピングのスクリプトを書くときは以下のようなアプローチととります。
- ブラウザのデベロッパーコンソールでHTML構造の解析。
- 解析したHTMLに対してCSSセレクタや正規表現で取得したいデータ部分だけ抜き出し
- 抜き出したデータをファイルに出力したり、JSON化したり、DB化する
上記はFirefoxのFirebugsでHTML構造を表示してるところ。
class="category_pc_b" に 作品のタイトルが埋まっていそうなのがなんとなくわかる。
実際のコードは以下のようになる。
get_monthly_title_list.rb v1.0
若干endの嵐なのがきもいが気にしない(´・ω・`)
シェルでこんな感じで実行できます。
(master)$ bundle exec ruby get_monthly_title_list.rb 'http://www.getchu.com/all/month_title.html?genre=pc_soft&gage=all&year=2015&month=5'
http://www.getchu.com/all/month_title.html?genre=pc_soft&gage=all&year=2015&month=5
絶対階級学園 〜Eden with roses and phantasm〜
ALIA’s CARNIVAL! Flowering Sky 初回限定版
Angel Beats! -1st beat-
Re;Lord 〜ヘルフォルトの魔女とぬいぐるみ〜 シリーズ導入価格版
Re;Lord 第二章 〜ケルンの魔女と黒猫〜
love,VAMPIRE FLOWERS 初回限定版
あやかしコントラクト
すみれ
な妹き!
ピュア×コネクト 初回限定版
プレイ!プレイ!プレイ!屍 通常版
プレイ!プレイ!プレイ!屍 限定版
メイプルカラーズHHH クラス全員俺の嫁! 通常版
メイプルカラーズHHH クラス全員俺の嫁! 豪華限定版
・・・・・
私は、抜き出した作品リストをTwitterのStreamingAPIの検索キーとして使いたいのでカンマで連結したものも表示してます。
今回、ハマったポイントは以下
◯その1
Nokogiriでぐぐると大抵Nokogiri::XMLのほうが出てくるのでコピペしてHTMLを解析しようとしてもエラーにはらず中途半端に解析が行われるので原因がわからず涙目。
◯その2
NokogiriのサンプルでのHTTP処理につかわれる open-uriは引数のURLにHTMLパラメーターがついていると無視するみたいなので涙目。httpclientモジュールはクエリーを別引数にハッシュで渡さないといけないので涙目。今回のように引数にhttpパラメーターつきでURLを渡したい場合はNet::HTTPは便利
◯その3
getchu.comはおそらく昔からのしがらみでこの21世紀にもなってeuc-jpを使ってるので、エンコードには注意しないとスクレイピングは大変そう。
スクレイピングする際は、サイトに迷惑がかからないように開発中はHTMLを保存しておいてそれを読み込みつつテストするなどTPOをわきまえた行動が求められます。
マナーを守って正しくスクレイピングしましょう!
今回のスクリプトは以下に配置しています
https://github.com/project-orgel/getchu_com_scraping_tools
Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例
- 作者: るびきち,佐々木拓郎
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2014/08/25
- メディア: 大型本
- この商品を含むブログ (7件) を見る
ツイッターのボットが電話認証でつくれなくなりました
テスト導入という名目ではじまったツイッターの電話認証ですが
普通にアカウントをつくるまでは電話認証なしでもいけます(運がわるくなければ
ただし開発者アカウントを取得しようとすると電話認証を求められるようになりました
\(^o^)/オワタ
DNT(Do Not Track)についての詳細なサイト
draft-mayer-do-not-track-00 - Do Not Track: A Universal Third-Party Web Tracking Opt Out
IEだけ頑張って拡張してる様子。。。
これ強制力ないとDNT対応してるサイトが損するだけだからなぁ・・・・。
SSL 3.0 問題に関連してか imgur APIでエラーが出まくって涙目
rubyでimgurに定期的に画像をアップロードするボットを作っていたが
SSL3 うんたらかんたらと英語でエラーが表示されて投稿できなくなった。
ワケガワカラナイヨ状態だったが 「とりあえず bundle updateしときゃいいだろ」
とbundle updateしてhttpclientモジュールをアップデートしたら動くようになった。
どうやら以下の問題の関連っぽい。
SSL 3.0に深刻な脆弱性「POODLE」見つかる Googleが対策を説明 - ITmedia エンタープライズ
まさか、TwitterのHadoop解析をファイヤーホース無しで? (3)
makiちゃんを使って実際にTwitter Streaming APIを利用してデータを取得してみる。
とりあえずCSVにデータを保存するだけなので、sakuraサーバーのメモリ2GのVPSで動作させる。
結果、1日で約150MバイトのCSV
のデータが取得できた。
ファイルは以下にサンプルとして配置
https://objectstore-r1nd1001.cnode.jp/v1/93a6500c0a1e4c68b976e5e46527145c/data/20141015_030537.csv
ファイルサイズ的にはまだまだ少ないのでStreamから流れてきたデータをプログラムで取りこぼししてる感じではないので、キーワードをMAX指定すれば80万ツイートぐらいは簡単にデイリーで取得できるだろう。
一つのIPで2ツイッターアカウントぐらいのバッチは動かせるので単純に考えて1台のマシンで200万ツイートの収集は可能だと思われる。
後は、プログラムのチューニングを行い極力twitterストリームからデータを保存するまでの流れをミリ秒単位で完結させる必要があるので、メモリ型DBに一時的に保存するなりの工夫がいるだろう。
フィルターへのキーワードは以下