NASDAQ全銘柄のウェブサイトをスクレイピングする計画
この記事は クローラー/Webスクレイピング Advent Calendar 2015 の15日目の記事です。 昨日の記事は dimgraycatさんによる とりあえずPHPでWebスクレイピングしてみたい人向けパッケージ - Qiita でした。
happyou.infoというサイトを開発している@shogookamotoと申します。
そのためには、まずどのサイトをスクレイピングすればよいのかを正確に把握しなければなりません。
(1)取扱銘柄そのものはすぐに取得できます。
/SymbolDirectory/nasdaqlisted.txtからファイルをダウンロードしてくるだけです。
(2)しかし、ここでわかるのは企業名とticker symbolだけです(例えばApple Incのticker symbolは"AAPL"という具合)
私が知りたいところの公式サイトのURLは記述されていません。調べた結果それは
http://www.nasdaq.com/aspx/infoquotes.aspx?symbol=AAPLをスクレイピングすると、http://www.apple.com/ を得られることがわかりました。
(その後、個別ではなく、一覧を取得したい場合はhttp://www.nasdaq.com/screening/companies-by-industry.aspx?exchange=NASDAQ をスクレイピングすればよいことがわかりました。このページが一番相手のサーバ様に負荷をかけずによいと思いました。)。
(3)しかし、このNASDAQのページで得られるオフィシャルサイトのURLは既に古くなっている場合があるので注意が必要でした。
例えば、Pacific Biosciences of California, Inc.(PACB) のページ(http://www.nasdaq.com/aspx/infoquotes.aspx?symbol=PACB)によるとオフィシャルサイトは
http://www.pacificbiosciences.com/ です。しかし実際にアクセスしてみるとわかりますが、そのサイトは既に http://www.pacb.com/ へ移転しています。このサイト移転に関しては、結局私のクローラが移転を検出して更新してやる必要がありました。保守運用がんばろうよNASDAQ…
http://etn.barclays.com/US/7/en/home.app が適切だと思うのですけれども、全部
http://www.barclays.com/ に統一してしまっているのもどうかと思いました。リンク切れを避けたいのでしょうし、最終的にTickerSymbolと公式サイトが1:1対応出来ないということも理解しますけれども、ここもっと完成度高めて欲しいですねー。
(4)さて、こうして得られた全銘柄のサイトを FinalScraperにかけてRSSを作ってみました。しかし、残念ながら現時点ではかなりうまくゆかないことがわかりました。
(失敗原因1) IPアドレスを元に表示される言語が決められてしまう。
たとえば、Qiagen N.V. (QGEN)のオフィシャルサイトhttp://www.qiagen.com/ は
日本のIPアドレスからのアクセスと判断すると自動的にhttps://www.qiagen.com/jp/ に
リダイレクトして、日本語のコンテンツが表示してしまいます。日本でクロールしているところの私のサーバは日本語のコンテンツしかダウンロードできません(ブラウザの言語設定をいじっても無理)。大人の事情なのか、特に医薬系の企業に多いようです。
(失敗原因2)
NASDAQってアメリカにあるんだから、オフィシャルサイトは英語だろうというそもそもの見込みが甘かったようです。トップページが中国語だったりヨーロッパ系の言語なサイトが沢山あります。http://www.hogehoge.comが、期待する言語英語でなかったとき、私達人類はサイト中の適当なリンクをクリックしたり検索エンジンで検索し直すなどして、http://www.hogehoge-holdings.com/english/ にたどり着くことが出来るのですが、現状で私のクローラにそんな機能はありません。
URLも標準化されていません。例えば中国のIT企業China Information Technology, Inc. のトップページhttp://www.chinacnit.com/ は中国語です。英語のページは、http://www.enchinait.com/en/でも、http://www.enchinait.com/lang=enでもなく、http://en.chinacnit.com/ です。このURLも人間がウェブブラウザでクリックしてやらないと知ることが出来ません。
特定の企業をやサイトを批判する意図は一切ありません。サイトごとに作りがバラバラで、機械はウェブサイトの目的のページに辿りつけないよねという主張をしています。
まぁ待てと。(失敗原因1)はなんとかなるだろと。例えば北米のVPSなりAWSなり借りれば解決できるはず。 takurosさんが書かれた記事
を使えばLamdaでPhantomJSまで動くそうじゃないか。
しかし、(失敗原因2) は…もし得られたページの内容が目的の言語でなかった時、どうやって探せばいいのか。
トップページから目的の言語のページにたどりつくまで、depth=1くらいでクロールすれば良いのか?
とまぁ、現在はこの辺りでジタバタしてます。言語の壁すら超えられないようではマシンリーダブルなんてとても無理。いずれなんとかします。
最後に宣伝です。