happyou.infoのブログ

ニュース収集サイトhappyou.infoのブログです。 国内外のあらゆる企業と組織、団体のウェブサイトの更新を収集します。 岡本将吾が運営しています。twitterは @happyou_info_ja です。

NASDAQ全銘柄のウェブサイトをスクレイピングする計画

 
happyou.infoというサイトを開発している@shogookamotoと申します。
 
現在、NASDAQ市場に上場している全企業の公式サイトの更新情報をスクレイピングすることを計画しています。日本株については完了しています(リンク, リンク)。
 
そのためには、まずどのサイトをスクレイピングすればよいのかを正確に把握しなければなりません。
 
(1)取扱銘柄そのものはすぐに取得できます。
NASDAQは毎日取扱銘柄の一覧を公開のftp.nasdaqtrader.comにアップロードしています。anonnymousでログインして
/SymbolDirectory/nasdaqlisted.txtからファイルをダウンロードしてくるだけです。
詳細は http://www.nasdaqtrader.com/trader.aspx?id=symboldirdefs に書かれています。日本株よりずっと単純でわかりやすい。凄いぞNASDAQ!
 
(2)しかし、ここでわかるのは企業名とticker symbolだけです(例えばApple Incのticker symbolは"AAPL"という具合)
私が知りたいところの公式サイトのURLは記述されていません。調べた結果それは
(その後、個別ではなく、一覧を取得したい場合は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
 
また、例えばBarclays というイギリスの銀行が扱ってるETNという金融商品TAPR, STPP, CAPE、その他)の公式サイトは、私は
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さんが書かれた記事

AWS Lambda+PhantomJS/CasperJSでスクレイピング - プログラマになりたい

を使えばLamdaでPhantomJSまで動くそうじゃないか。
 
しかし、(失敗原因2) は…もし得られたページの内容が目的の言語でなかった時、どうやって探せばいいのか。
 
トップページから目的の言語のページにたどりつくまで、depth=1くらいでクロールすれば良いのか?
しかしそのページは本当に同じ企業の英語版トップページなのか?企業によっては、地域別、言語別に別ドメインになっているサイトもあるよ。
 
とまぁ、現在はこの辺りでジタバタしてます。言語の壁すら超えられないようではマシンリーダブルなんてとても無理。いずれなんとかします。
 
最後に宣伝です。
 
happyou.infoはお客様のご要望に応じた分野のサイトを網羅的にスクレイピングし、サイトの更新情報をお届けできます。個々の更新項目に自動的にタグを付けて分類しています。Web API形式でご利用いただけます。詳しくは

https://happyou.info/ja/top/

をご参照ください。

FinalScraperの現状と今後

FinalScraperを発表してから1ヶ月位たったのでまとめておこうと思う。

  • 動作はかなり安定していると思う。
  • サービスを公開した本来の目的であるところの、「正しく検出できないパターンについてユーザさんにクレームを付けてもらう」が全く達成できていない。皆黙って使うだけ。うまく動かなければ黙って立ち去るだけ。どうにかならないか。
  • 日本語URLがうまく処理できないようだ。直そう。例) http://www.fsight.jp/subcategory/無料 エンコードされていないURLが投げられた場合の処理。%E7%84%A1%E6%96%99
  • そのサイトが元々RSSフィードを出力している場合、「元々そのサイトはこのRSSを出力していますよ」と結果表示に含めるべき。
  • サーバの負荷が増えてきたらログイン必須にして上限を設ければ良い。

9/29日から発生していた障害についてのメモ

9/29日から上場企業と地方自治体のRSSフィードが更新できていませんでした。現在は修復されました。APIやFinalScraperに問題は発生していませんでした。

非公開のWebサーバに大量のリクエストがあり、エラーログによりディスクが100%消費されてしまったことが障害の理由かと思われます。

 

約2日間も落ちたことに気づかなかった点は反省。今後はエラーログを監視するスクリプトを入れることにします。

 

あらゆるウェブページをRSSに変換するサービスを公開しました

 

Final ScraperはRSSを出力しないウェブページをパターン解析し、RSSフィードを出力するサービスです。 ようやく安定して動作するようになりましたのでリリースしました。ご利用は無料です。

Happyou Final Scraper

同様のサービスは他にも存在しますが、Final Scraperは独自のパターン認識プログラムによって、作成されるRSSフィードの品質を飛躍的に高めています。

 

以下の制限事項がございます。

  • 大量のエントリーはブロックさせていただくことがございます。ご希望の場合は別途お問い合わせ下さい。
  • ログインが必要なページはダウンロードすることが出来ません。
  • 通信先のウェブサイトの設定によってはダウンロード出来ない場合がございます。お相手のウェブサイト様が望まないことは出来ません。
  • 現在、4時間に一度のアクセスを行っています。最大4時間の遅れが生じることがあります。
  • 生成されたRSSフィードに長期間アクセスのない場合は削除されます。アクセスできなくなった場合は再びトップページから生成を行って下さい。
  • ウェブページのデザインや構造が変化した場合、RSSフィードが生成できなくなることがございます。RSSフィードの中にそのようなエラーメッセージが表示されている場合には、トップページからもう一度やり直して下さい。

happyou.infoのクローラはこのFinal Scraperを利用して更新情報を収集しています。

 

すべての上場企業のと地方自治体のサイトをスクレイピングして大変だったことを書きます(移転)

 

書いたんですけど、テクニカルな記事だったし、あまり反応もなかったので、Qiitaというサイトに移転しました。

qiita.com

全上場企業と全地方自治体のRSSを出力することに成功しました

happyou.infoは、国内のすべての上場企業3649社とすべての地方自治体1981サイトのウェブサイトからRSSフィードを作成し、happyou.info内にて無料公開します(*1)。

happyou.infoのトップページ

 

Final Scraper

Final Scraper はHTMLページのパターン解析を行い高品質のRSSフィードを作成します。
同様のサービスは他にも存在しますが、Final Scraperは独自のパターン認識プログラムによって、作成されるRSSフィードの品質を飛躍的に高めています。

Happyou Final Scraper


FinalScraperを利用して、上場企業と地方自治体のサイトからフィードを作成して公開しました。

 

すべての上場企業 (2022年現在、公開を止めています)

すべての地方自治体(2022年現在、公開を止めています)

happyou API

FinalScraperは自動で動作し人間による操作が不要であるため、クローラに組み込んで利用することが出来ます。
これにより、大量のウェブサイトから自動的に更新情報を検出することが可能になりました。
しかし機械的に抽出した更新情報は量も多くニュースと呼ぶに値しない情報も多いため(*2)、全ての更新を直接でRSSリーダを使って読むには適しません。

そこで個々の更新情報にタグをつけ、Web API経由の検索を行うことで必要な項目だけを読みだせるようにしました。 happyou APIで検索することも可能ですし、IFTTTやzapierといった外部のサービスを利用することでフィルタリングされた更新情報をモバイル端末にプッシュ通知させることも可能です。

happyou API ver2

 

今後

お客様がご希望されるどのような分野にも対応できます。 医療、介護、公共事業入札、自動車部品業界、建築資材業界、どの業種でも約150万サイトの中から更新情報を分類してお届けすることが出来ます。

お客様のサイト内に表示させることも、モバイルアプリに組み込む形でご利用いただくことも可能です。
クロール対象サイトをお客様の側でご指定いただくことも可能です。
お気軽にご相談ください。

https://happyou.info/ja/top/#customize

 

以上となります。最後までお読みいただきありがとうございました。

(*1)数字は2015/09/14現在

(*2)例えば、上場企業のインベスター・リレーションズが興味の対象の人にとって、B2C企業の「今なら花柄のお皿プレゼント」といった情報はノイズになります。

普及して欲しくないアンチスクレイピングサービス

スクレイピングとは、ウェブページから情報を取り出す処理を指します。そのためのプログラムやツールが存在します。

 

さて、ここで立場を変えて、情報を取り出されてしまうウェブサイト側の立場になって考えてみますと、スクレイピングはあまりうれしくない存在であることがわかります。

  • ニュースサイトは、コストと時間をかけて書いた記事をコピーされ転載されてしまう。
  • オンラインショップは、ライバルの他社に商品リスト、価格、在庫の変化、顧客の評価等を把握されてしまう。
  • インターネット広告は、自社が出している/仲介している広告の種類と量をライバルに把握されてしまう。

他社の情報は把握したいが、自社の情報は把握されたくないと考えるのは自然なことのようです。その証拠として、スクレイピングの普及に合わせて、自分のサイトがスクレイピングされることを防ぐための「アンチスクレイピングサービス」なるものが世に広まりつつある点を挙げることが出来ます。


https://www.cloudflare.com/apps/scrapeshield


http://www.distilnetworks.com (はてなの埋め込みリンクが働かない)


http://www.scrapesentry.com

http://www.fireblade.com (はてなの埋め込みリンクが働かない)

 

以上のサイトを見つけています。 実際にこれらのサービスを利用したわけではないので正確なことはわからないのですが、サイトを読む限り、主にアクセス履歴を分析してクローラbotを検出して排除しているようです。

 

以上が私が認識しているところのアンチスクレイピングの現状です。以下に私の考えを書きます。

 

でも思うんですよ。アクセスパターンでbotを排除なんて、どうにでも突破できますよ。いくらでも人間のフリはできます。

最近見つけました。ご参考までに。

 

そんなことより、頻繁にサイトの構造やページのデザインを変更するほうが、効果的にスクレイピングをブロックできるのではないかと思います。

 世のスクレイピングツールやコードは、XPathかそれに類する形でデータの抽出方法を定義しているものがほとんどかと思われます。この場合、ページの構造やデザインが少し変更されるだけで正しくデータを抽出できなくなり、その都度コードやツールの設定を変更する必要が生まれます。

私は今happyou.infoというサイトを作っており、多くのサイトをクロールし自動スクレイピングを行っています。もっとも煩雑で微妙な処理は、サイトの構造やページのデザインが変更されたことを認識してスクレイピングをやり直す箇所です。

たとえばウェブサーバがページを表示する際に、予めテンプレートを数種類用意しておき、それを交互に出力するだけでも既存のスクレイピングツールのほとんどは対応できないように思います。普段は<DIV>なのに時々<TABLE>に変わっていたり、5分後にアクセスしたら<IFRAME>の中に価格データが埋め込まれてるだけで我々は簡単に死んでしまうはずです。スクレイピングする側はまた別の対応策を考えねばならず、それは頭の体操にはなるかもしれませんが、あまり生産的ではないように思います。

もし作るならば、アクセスパターンからbotを排除するよりも、ページのデザインが頻繁に変更されるタイプのアンチスクレイピングサービスのほうが効果的のように思いました。そして、できればそのようなサービスは普及しないで欲しいです。

 

「私のスクレイピングはページデザインの変更に対応できる」という方がいらっしゃるかもしれませんが、そこで抽出できるデータって相当荒いデータだと思うんですよ。 もしデザインの変更に対応できるスクレイピングの方法をご存じの方がいたら是非ご教示ください。

 

最後に、やはりデータを囲い込む方向の技術は発展して欲しくないなと思いました(私はスクレイピングする側なのでそう考えてしまうのかもしれませんが)。 結局あまりうまくいかないだろうことは音楽や動画のコピープロテクトをみればわかりますよね。

 

この記事は、クローラー/スクレイピング Advent Calendar 2014  に登録させていただきました。 参加させていただきありがとうございました。