AKB428は荒野を目指す

秋葉原で働くエンジニアなブログ

世界最強のエロゲサイト、Getchu.comをNokogiriでスクレイピングする方法

f:id:rakuda00:20150306002305p:plain

 

 

私が、最も利用し世界で一番優れていると思うサイトはもちろん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スクレイピングスクリプトを書くときは以下のようなアプローチととります。

  1. ブラウザのデベロッパーコンソールでHTML構造の解析。
  2. 解析したHTMLに対してCSSセレクタ正規表現で取得したいデータ部分だけ抜き出し
  3. 抜き出したデータをファイルに出力したり、JSON化したり、DB化する

 

f:id:rakuda00:20150306001636p:plain

上記は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の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

 

 

 

 

 


 

MySQLのダンプをOpenStackオブジェクトストレージに転送するスクリプト書きました


AKB428/chino_util_mysqlbackup · GitHub

 

半年ぐらいためてたMySQLがクラッシュしてデータが消えて泣いたので

泣きながらスクリプト作った。

 

ツイッターのボットが電話認証でつくれなくなりました

テスト導入という名目ではじまったツイッターの電話認証ですが

普通にアカウントをつくるまでは電話認証なしでもいけます(運がわるくなければ

 

ただし開発者アカウントを取得しようとすると電話認証を求められるようになりました

\(^o^)/オワタ

コミックマーケット87カタログ・・サークルデータベースは暗号化されました

f:id:rakuda00:20141213231244j:plain

 

(゚Д゚)ハァ? はぁあああああああああああああああ

 

C86まではccatalog86.dbはSQLiteで読み込めたのだが、C87からは読み込めなくなっている。

どうもcircle.msで銭を稼ぎたいからいろいろ規制し始めてるっぽい。

マジで糞だな・・・。

API公開はしてるけどクローズドなのでいまいちだしせめてTwitterみたいに認証付きのAPI公開しろよ・・・

DNT(Do Not Track)についての詳細なサイト


Do Not Track Test Page

 

Web Tracking Protection

 

 

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などのメジャーなAPIも対応必要な気がして悪寒が止まらない

まさか、TwitterのHadoop解析をファイヤーホース無しで? (3)

makiちゃんを使って実際にTwitter Streaming APIを利用してデータを取得してみる。


AKB428/maki · GitHub

 

 

 

とりあえずCSVにデータを保存するだけなので、sakuraサーバーのメモリ2GのVPSで動作させる。

 

  •  フィルタへのキーワードは240程度(MAX400)
  • JavaのバッファリングでCSVに順次書き出し
  • CSV書き出し以外の処理はしない(ツイッターストリームの取りこぼしをふせぐため)

 

結果、1日で約150MバイトのCSV

CSVMySQLに読み込ませた結果 49万レコード

のデータが取得できた。

 

ファイルは以下にサンプルとして配置

https://objectstore-r1nd1001.cnode.jp/v1/93a6500c0a1e4c68b976e5e46527145c/data/twitter_2014-10-16.sql.gz

https://objectstore-r1nd1001.cnode.jp/v1/93a6500c0a1e4c68b976e5e46527145c/data/20141015_030537.csv

 

ファイルサイズ的にはまだまだ少ないのでStreamから流れてきたデータをプログラムで取りこぼししてる感じではないので、キーワードをMAX指定すれば80万ツイートぐらいは簡単にデイリーで取得できるだろう。

一つのIPで2ツイッターアカウントぐらいのバッチは動かせるので単純に考えて1台のマシンで200万ツイートの収集は可能だと思われる。

後は、プログラムのチューニングを行い極力twitterストリームからデータを保存するまでの流れをミリ秒単位で完結させる必要があるので、メモリ型DBに一時的に保存するなりの工夫がいるだろう。

 

twitter.csvmySQLに読み込ませた結果

f:id:rakuda00:20141016024436p:plain

 

 

 

フィルターへのキーワードは以下

nico 2014年アニメ春夏秋冬すべてのキーワード指定版