話題の記事

第2回Webスクレイピング勉強会@東京 に参加してきた #東京スクラッパー

2014.08.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

お仕事の都合上、ビッグデータ周りの『環境』については割と頻繁に作成したり関連する情報を調べたりしているのですが、環境に取り込む『データ』についてはお客様の要件によって様々。お客様個別のデータに絡める場合然り、また業務とは別に、個別に何か独自のネタを使ってビッグデータ的な取り組みを行いたいとなった際には、選択肢のひとつとして『Webからデータを収集して分析に使う』というものも考えられるかと思います。

では、そのデータはどうやって取得してくる?となった時にひとつの案として浮上してくるのが、今回のブログテーマにもなっている『Webスクレイピング』。イベントについては情報を把握していたものの前回は都合により参加出来ず、第2回の参加申し込みには間に合ったので参加して来ました!

開催会場は株式会社ブレインパッド セミナールーム@白金台。都営南北線 白金台の改札を出てすぐの所にある建物です。

brainpad

会場の後ろの方には休憩スペースも。奥の方に本棚も見えますが、この充実っぷりは凄いですね!

brainpad2

目次

前回のおさらい

このイベント、タイトルを冠した内容のものを都合3回行う予定のようです。前回第1回目の内容については、以下イベントページ内にセッション発表資料がまとまっています。

会場に関する説明などの後が成された後、本編スタートです。以下参加メモ。

オープニングセッション

イベント主催者である@nezuqさんからのイベント進行に関する各種ご紹介です。

Rawlerフレームワーク XAMLで自己完結するwebスクレイピングフレームワーク

発表資料:

発表メモ:

  • 『ローラーフレームワーク』と読む。
  • 自己紹介
    • 探索的社会調査ツールの開発と実践に取り組んでいる。
    • 研究分野:社会学、社会調査、人工知能、テキストマイニング、データマイニング
  • Rawlerフレームワーク
    • Webクロールのためのデータ分析ツール。
    • データ分析ツールを作ったのはいいが、データを取得のためにクロールを作らないとダメ/1つのサイトからデータを取得するのは簡単だが『これを5個10個作って』と言われ、効率的に、もっと楽にデータ取得をしたいと思うように。
    • Webスクレイピングとプログラミング技術
      • Webにはテキストマイニングの対象になる大量の情報がある
      • しかし、データ取得にはプログラミングの習得が必要であり、いきなりの素人には敷居は高い。
    • Webスクレイピングのプログラマー側の事情
      • 同じことの繰り返しで、楽しくはない。
      • また、対象のサイトに合わせて作るので、毎回違うものになる。
  • データフロープログラミング
    • データの流れを記述することでプログラミングをする方法、関数型言語の一種。
    • ビジュアルプログラミングとの相性が良い。
    • テキストを中心としたデータフロープログラミング言語を作れば良いのでは。
    • →そこでRawlerフレームワーク!(を作るに至った)
    • XAMLを使用して構築。
  • Rawlerの言語的特徴
    • 変数を排除。
    • 木構造により、同じテキストに対して復数の処理を行う。
    • 繰り返しを排除。
    • 上流問い合わせ(先に宣言したクラスにアクセスするには親を辿って対象を見つける)
    • 良く使うものは上流に設定するのは面倒なのでStatic Classとして実装。
    • 関数言語っぽい作り。
  • 導入方法
    • XAMLコード作成はVisual Studioを使うのが望ましい。無償版アリ。
    • 実行環境はRawlerツールを使う。
    • 実行デモ: はてなブックマークから情報を取得
    • このツールはコマンドライン実行も出来るらしい。
  • 実行例:
    • ブログ記事のコメントを取ってくる例
    • TSVファイルからの読み込みとファイルへの書き込み機能も追加。
    • ログインが必要なPixivにログインして情報を取得(POST処理も出来るので割と何でも出来る。)
  • 基底クラス(RawlerBase)の設計/各種機能紹介
    • API等の機能解説、HTML解析/データ蓄積/テキスト処理/ファイル入出力/画像のダウンロード/各種ユーティリティ/簡易自然言語処理...
    • 各種拡張機能
      • Yahoo APIのキーフレーズ分析を行う
      • メタプログラミング
      • Rawlerの拡張性について

Webスクレイピングで未知語との遭遇

tokyo-scrapper-02

発表資料:

web-scraping-tokyo-02-02

発表内容メモ:

  • 『未知語』とは何ぞや
    • out of vocabulary / 自然言語処理から見た未知語。Webスクレイピングから見た未知語=「あなたの知らない単語」の事。
    • 辞書に存在しないから未知語→わかる
    • 自分が知らないという事を把握している自分の知らない単語?→お前は何を言ってるんだ
  • 未知語を探す方法
    • そもそも「知らない単語の存在を知らない」のにどう探す?
    • 流行語、新たに爆誕した単語から未知語を探せるかも。でもそんなに都合の良い話はあるだろうか?
      • →ある:Googleサジェスト。これを未知語発見用データソースに用いる。
      • 他の人が入力した単語。サジェスト内容が頻繁に変わる。これは未知語を探すのにピッタリ!...な気がする。これを辞書登録出来れば...
      • 形態素解析ツール『Chaasen』:辞書にない単語は未知語と判定してくれる。
    • Googleサジェスト結果を(テキストで)取得
    • 妄想を実装してみる:Google サジェスト結果をChasenの辞書に登録してみる..
    • 実装内容の簡単な解説(シェルスクリプト)
    • 未知語と言われている内容があるかどうか、完全一致させる形で処理。
  • スクリプトの活用
    • 定期的に「あ」「い」「う」等でスクリプトを実行、引っ掛かった単語を更に回す?
    • 半年くらいスクリプトを定期実行して「ここ半年の未知語」を集めてみるのも面白いかも
    • 発見した未知語をIMEの辞書データに追加
    • 未知語リストin俺(複数人で判定し、円グラフにすると面白いかも)
  • 今後の課題
    • chasenの単語分割は最短マッチ的な動作になっている(「ごちうさ」で試すと「ご」がイチ単語として判定されてしまう等)
    • googleトレンドとかを使えばいいのでは?(参加者からの提案)
    • 応用的にはどのような使い方を?→蓄積したデータを用いて何をするかはこれからの課題。

サイト・ブログから本文抽出する手法

本日のテーマ:サイト/ブログから本文を抽出する方法:なぜ必要なのか?

  • 一般的なブログの構造:
    • タイトルがあり、サイドメニューがある。本文、記事タイトルがある。
    • データとして活用する場合は欲しいのは、本文。それ以外はデータとしてノイズとなる。
  • 抽出の目的:
    • 書かれている記事を読みたい。
    • コーパス/解析の元データとして利用したい。
    • コーパスとは?:コーパス - Wikipedia
  • 自然言語としてのブログの特徴
    • 新聞に比べて口語に近い単語・フレーズが出現。
    • タグやカテゴリ等のメタデータがあり、分類し易い。
    • 投稿者の属性をある程度推定出来る。
  • 本文抽出の方法
    • パーサーを利用してHTML構造を分析し、抽出する方法
      • 取得対象のHTML構文を分析し、本文を抽出。所謂『ルールベース』。
      • [メリット] 正確に本文を抽出出来る。比較的負荷が低い。
      • [デメリット] ブログの種別毎に開発が必要。取得元HTMLの構造変更に弱い。
  • 自然言語処理を利用して本文らしさを分析し、抽出する方法
    • 文章内から本文らしい部分を抜き出す。所謂『ヒューリスティック(経験則)』。
    • 自分で一から実装するのは割と大変。
    • 本文抽出モジュール
      • ExtractContent(ruby)
      • HTML::Extract(perl)
      • HTML-Feature(perl)
      • ExtractContent/webextract.py(python)
        • HTMLをブロックに分離、スコアの低いブロックを除外。
        • 評価の低い連続ブロックをクラスタ化し、クラスタ間で更に比較を行う
        • スコアは配置、テキスト長、アフィリエイトリンク、フッタ等に特有のキーワードが含まれているかを判定
        • google adsense section target ブロックには本文が記述されているとし、特に抽出。
        • [メリット] ブログ種別に依存しない、取得元のHTML変更に強い。
        • [デメリット] 構文解析に比べると精度は落ちる。比較的コンピュータリソースの負荷が高い

(WebサイトスクレイピングAPI化サービス「kimono」の中の人に色々と発表して頂きました)

(※特にタイトルが定められていなかったのでこちらで適当な名前を割り当てました。)

tokyo-scrapper-04

今回、登壇・発表してくださった方はPratap Ranad氏。以下エントリの写真右側の人です。詳しいプロフィール等はエントリを御参照ください。

対象となっているサービスはこちら。

kimonolabs-01

  • 色々な経緯があり、サービス開発をされた「中の人」が話してくれる事になりました。
  • 現在、利用ユーザー数が米国:フランス:日本らしい。この発表でフランスを抜いてくれる事を期待しているそうです。
  • あるサービスを作り、航空会社毎にWebスクレイピングする必要があったのだが、仕様がそれぞれ異なってるので大変だった。
  • データがどこにあるかはわかってるのだが、どうやって取れば良いかが分からず困っていた。
  • そこでこのkiminolabsを作るに思い至り、開発を始めた。
  • Web上でApiを持っているのは僅か0.0005%しかない。むちゃくちゃ少ない。kimonolabが挑むのはこの領域。
  • web scrapingを個別にカスタムで行うのは大変。しかもこれに対応するようなソフトは無かった。
  • Kimono replaces web scraping:きものはここの部分を置き換えてる為に作った。
  • デモ実演)ブルームバーグのデータを取得するAPIを作成:
    • tokyo-scrapper-04-02
  • builtwithkimonoというブログを作って、各種データを紹介している。
  • 他の人がつくったAPIを探すことも出来る。(今週ローンチされたばかりの機能)
  • 20000devs:1月以降、10週間で20000人の開発者に利用されるように。今はその倍。
  • 3x:APIの数はkimonolabが出てから3倍に増えた。APIコールの数(呼び出し頻度)も急激に増えている。

tokyo-scrapper-04-03

  • strusturing the web
    • スクレイピング自体楽しいのだが、それよりもスゴイのは人々の力によってデータが構造化されていく事だ。
    • データが溜まっていく事に価値を感じている。
    • セマンティックWebは失敗した。今回のような取り組みを、「Webを作る人達」にさせようとしていた。
    • 今回はデータを利用する側の取り組みとしてチャレンジしている。kimonoによってこれを実現したい。
  • 質疑応答:
    • Q.ログインしてデータを取ることは出来るか?:A.可能。(※実際にデモで実演してくださいました)
    • Q.ページ構成のような内容は対応している?:A.pagenation機能で対応しています。
    • Q.「kimono」の名前の由来は?:A.解決する時にぐちゃぐちゃしてるものを整理しよう、みたいなもの(が英語のフレーズがあるようです。ちょっと正確なフレーズは聞きそびれました)があるので、そこから名づけた。
    • Q.動画や画像は扱える?:A.画像なら可能です。
    • Q.日本では例の図書館サイトのような件(※詳細)があるが、この辺りは大丈夫か?:A.kimonolabsが集約して、人がアクセスする頻度でアクセスするのでアクセス頻度は少なくなるはず。アクセス情報を提供する事もできるし、仮に『読んでくれるな』というサイトからの依頼があれば止める対応も行っている。
    • Q.サイトの構造が変わった場合の対応は?:アラートを挙げるようにしているし、修正も簡単に出来ると思っている。コミュニティの力でその辺りスムーズに改善される事を祈っている。

LT:発表! WebスクレイピングのセーフorNOT。

こちらの内容は、基本的には以下エントリの内容に沿ったものとなります。色々とグレーな部分もあるこの領域について、@nezuqさんが個人の見解も交えつつ非常に分かり易くまとめてくださっています。ライセンスは「CC BY」となっていますので、是非ご活用ください、との事でした。

tokyo-scrapper-lt-01

お悩み会議室

空き時間に参加者に書いてもらった質問を元に、発表者・参加者全員でそれらの質問に応えていくというコーナー。抜粋して幾つかご紹介したいと思います。

  • Q.1秒1アクセスのルールについて:これを解決するための方策等あれば。:A.オニオンルーターを経由させれば良いのではないか。匿名proxy。ただ機能上、遅くなってしまうとは思うが.../vpsを使う事が出来れば、ansible等を経由して異なるipでアクセス出来るのでは...?
  • Q.そもそも、この『1秒1アクセス』っての由来は?:A.元引用は国立国会図書館からか。(※これかな?)/高木浩光先生がブログで言及していたりもするが、公での基準と言ったものは特に無い。/アクセス過多を検知してBANしてくるサーバもあるので注意。静的なページはある程度アクセスしても問題無いとは思うけど、動的なページについてはある程度間を空けた方が良いのでは。/ robot.txtに関連する記載がある。この辺りを守っていくのが良いのでは。(Crawl-Delayでクローラーの巡回頻度を調整する|CyberAgent SEO Information (サイバーエージェントSEO情報ブログ))
  • Q.kimonolabsの使い方を日本語解説しているサイトがあれば。kimonolabsの方で数週間後、出す予定だそうです!
  • Q.PDFやexcel、画像でデータを提供しているサイトの場合、スクレイピングはどうしているか?:A.1回ダウンロード:拡張子を見る:拡張子に応じたファイル処理を行う、しかないか?画像ならopencv。オライリーでpdfの構造に言及しているものもあるので参考に。また、kimonolabではpdfの解析もやろうとしているらしい(!)

まとめ

以上、Webスクレイピングに関する勉強会のレポートでした。『Webスクレイピング』自体、私はそこまで詳しくは無いし実践してみた事もそんなに無いですが、今回参加してみて色々と手段があり、また取組み方も様々ある事が分かりました。

そんな中でkimonolabs社『kimono』については、こんなに便利なサービスがあるのか!と新鮮な驚きでした。サービスとしての細やかな対応具合であったり、API・サービスとしての使い易さはとても良いものになるのでは!と思います。これは是非使ってみたいですね!今後の展開・発展にも注視して行きたいと思います。

また、主催者の@nezuqさんによるイベント進行が終始行われていましたが、イベント進行にあたっての各種対応・ルール等はとても共感出来る部分が多かったような気がします。参加者の皆さんに何かを持ち帰ってもらおう、という思いがこちらにも伝わってきましたし、私自身もとても学ぶべき点が多かったイベントでした。、主催者の@nezuqさん、及びイベントスタッフの皆様、会場ご提供頂いた株式会社ブレインパッド様、発表者及び参加者の皆様、有意義なイベントをありがとうございました!

こちらからは以上です。