十五夜のブロマガ

データ解析できるかな(1):プログラムを読んで動かしてみる

2013/08/12 03:00 投稿

  • タグ:
  • プログラミング
  • データマイニング
  • 腐女子
  • pixiv

はじめに

進撃の巨人を読んだことない人がデータだけでキャラを推測してみる」でやってたデータ解析が面白かったので、色々勉強を兼ねて自分のメインクラスタであるTIGER & BUNNYでやってみようかな、と思ってみたんですが、統計手法に詳しくないのでできるかどうかわかりません。あと、腐界は分析されるのを好まない傾向があるので、結果があまりに不評なようならさくっと消すかも知れません。まあ、そんな感じでぬるぬるやっていこうかな、と。

ということで、作業の前提条件としては以下のような感じ。

  1. プログラミングはそこそこできる。ただし、関数型言語やPythonはそれほど詳しくない。
  2. サーバ管理はぼちぼち。パケット解析も軽くはできるが専門ではない。
  3. 統計手法というかデータマイニング手法についてはよく知らない。共起とか階層化クラスタリングとかどうやって作るの?レベル。
  4. 腐女子暦は長い&pixiv暦はそこそこ(ただし字書きがメイン)。なので、ドメイン知識はぼちぼちある。

作業メモみたいな感じになりそうなので、はてなの方で書こうかなとも思ったんですが、あちらはtwitterログ倉庫として放置されて久しいのと、そもそも腐要素はないアカウントだったので、ブロマガ使用テストを兼ねてこちらでやってみます。

はじめの一歩

pixivからタグ情報を取り寄せるのが最初の一歩のようなので、上述のあんちべさんの記事に書かれているPythonのプログラムをざっくり読んでみます。プログラマならわかると思いますが、そこそこの知識があれば、あまり使ってない言語でも読むこと自体は難しくないです。よく知らないライブラリとかフレームワークとかが使われているとつらいですが、ここに書かれているコードはWebページアクセス用にurllib、引数アクセス用にsys、およびウェイト用にtimeというライブラリを呼んでいるくらいなので、それほど難しくはなさげ。

メイン関数も特に複雑なことはしていなくて、引数4つ――検索キーワード、データ保存先ファイル名、最大処理ページ数、セッションID(オプション)を取得したあと、保存先ファイルをオープンした状態で、iPhone用のAPIを呼び、1Pづつ取ってきて(取得後スリープが入る)、返ってきたデータをちょこちょこっと変換してファイルに書き出しているだけですね。

難しいのはpixivのiPhone用APIの仕様の理解ですが、ざっくり調べてみると「そもそも公開されてない」という情報が(苦笑)。ごにょごにょして調べたようですね^^;

……まあ、色々あるようですが、今回はあんちべさん同様タグでの検索をするので、APIもここで使用されているもの( /iphone/search.php?s_mode=s_tag&word=キーワード&PHPSESSID=セッションID&p=対象ページ )をそのまま使います。ただし、これはイラスト対象のAPIなので、本来字書きとしては小説の方を調べたいところです。しかし、ひとまずそれは将来の課題としておきましょう。

なお、オプションであるセッションIDを渡さなければ検索数に150程度の制限がかかるということで、ちょこちょこ調べてみたところ200(ページ数にして4)が限界のようです。そちらは別途取得方法を考慮しておく必要があります。まあ、その程度のコードが書けないようならやるなっていう感じでしょうね。私もここには書きませんので、各自努力してください、はい。

ちなみに2013/08/11早朝時点で、「TIGER&BUNNY」の検索結果は132680件、腐向けタグである「T&B女性向け」だと11997件あります。この量を一気に何度も問い合わせるとサーバに負荷がかかるので、迷惑をかけないように慎重にやる必要があります。ちなみに迷惑をかけるとマジで警察に捕まって訴えられることもある(実例:「岡崎市立中央図書館事件」など)ので注意してください。

このコードで、アクセスの頻度をコントロールしている、つまりウェイトをかけてるのは、time.sleep(1) という関数でしょう。類似の関数は他の言語にもあります。ただ、どのくらいの時間停止するかの指定の仕方にはゆらぎがあるので確認しておく必要があります。Pythonには詳しくないので、ぐぐってAPIを確認しておきます。本家のドキュメントによると、sleepの引数は秒数のようです。つまり、現在はページをアクセスしては1秒止まるようになっています。一応、1秒に1アクセス程度はクローラーの動作としては「常識的」「礼儀正しい」とされているそうなので妥当だと思います。しかし、pixivの場合たまに重くなることもあるので、ここは状況を見ながらこの数値を調整したり、空いている時間を狙うのがいいでしょう。

テスト実行してみる

ということで、タグでの検索プログラムについては大体内容がわかりました。Python特有のコードがあるわけでもないので、別の言語に移植するのも難しくないとは思いましたが、せっかくなのでお勉強を兼ねて、手元のWinマシンにPythonの言語環境を入れて動かしてみることにします。この辺は、Pythonの日本語サイトから、Windows用のインストーラを拾ってきて適当に入れればいいでしょう。ということで、現在の安定リリースの最新らしい3.3.1を拾ってきて入れてみました。

でまあ、引数もあるんで、どうやって実行するのが楽だろうか、とチュートリアルをざっくり眺めたところ「PATH通してコマンドラインで実行するのが一番素直」という結論になったので、もそもそ環境変数を確認。インストールだけでは設定されないぽいので、適当に設定してもそもそ実行。

……と、何か文法エラーくらいました。ごふ。

C:\prog>python prog1.txt "T&B女性向け" test.txt 2
File "prog1.txt", line 25
print "error occurred. please, 3 or more arguments. arguments is 1.tag-keywo
rd 2.output-file-name 3. get-page-max 4.phpsessid"

^
SyntaxError: invalid syntax

こういうのを食らう原因はいくつか考えられますが、とりあえず3.3系列じゃなくて2.7系列で試してみます。よいしょっと。今度は文法エラーは出ませんでした。ええ、文法エラーは。メジャーバージョン上がると文法変わりますからこの辺はしょうがないですね。ということで、実行環境は特定できましたが、さらにまた違うエラーが出ました。

C:\prog>python prog1.txt "T&B女性向け" test.txt 2
Traceback (most recent call last):
File "prog1.txt", line 27, in <module>
main()
File "prog1.txt", line 20, in main
if keyword in line[13]:
IndexError: list index out of range

サーバーから取ってきたデータを分割した後の配列lineのout of rangeが出てるので、どうも分割に失敗しているようです。そもそも返ってきているデータが想定と違う、とかそのあたりな気がするので、おもむろにデバッグ開始。ってPythonでデバッグってどうやるねんw

ということでざくっとぐぐると、pdbというデバッガがあるようなのでそれを使うことにしました。contでざらっとエラー発生まですっ飛ばしてから、デバッガで変数lineの中身を見たところ、なんかこんなん入ってるー!

(Pdb) p line
['<?xml version="1.0" encoding="UTF-8"?>\n']

これはあれですね。エラーか何か返ってきてますね。でその原因は、多分キーワードに「&」が入ってるとか、そもそもコマンドラインでSHIFT_JIS渡してるとか、その辺が絡んでる可能性が高いですね。ということで、以下の処置をしました。

  1. コマンドラインからSHIFT-JISで渡されてくるキーワードをUTF-8へ変換する
  2. APIに渡す前にurlのエンコーディングをかける
  3. range(page_max)だと0開始でエラーになってしまうので、range(1,page_max)と1開始に修正(なお、この指定だと実際の上限は page_max -1 までになることに注意。参考:[Python][お勉強] Python入門(21) - range関数。引数の指定ミスをしそうなので、引数の数値変換時に+1した方がよい気がします)

これでようやく動いて、1ページ分50個分のデータが取れました。つまり、1ページあたり50個のデータが入っているということですね。とすると、1万個のデータを取るには200ページ回さないといけないわけですね…。10万個だと2000ページになります。

ああうん、ちょっと腰を据えてやらないと時間かかりそうですね。ということで、大体何やってるかはわかったので、データは様子を見つつ取ることにして、今日はここまで。

どうでもいい話

プログラム名がprog1とか適当な名前になってるのは、考えるのがめんどくさかったからです。すいません。あと、Pythonスクリプトのサフィックスが.pyなのも知ってはいますが、エディタ起こすのが楽なので.txtにしてあります。はい。

コメント

コメントはまだありません
コメントを書き込むにはログインしてください。

いまブロマガで人気の記事