一部のWebサイトをスクレイピングできない

はじめに

前回の記事にも書いたとおり、PHPtwitter botを作ったのですが、アプリ登録後、今度は一部のサイトから情報を取れないという事態が発生!

わかってしまえば簡単な事ですが、意外と気付かずにハマることがあるよというのが今回のお話。

 

結論

スクレイピングするときは、UserAgentの指定を忘れずに!

 

経緯

「花粉速報bot」だけでは飽き足らず、「日経平均株価予報Bot」を作ってみた!

 

今度は単に掻き集めたデータを配信するだけでなく、蓄積して予測するようにしています。

と言っても、そんなに難しい仕組みは作れないので、以下の記事を参考にしたごく単純な予測システムです。

PHPでベイジアンフィルタを書いてみた - Qiita

 

ちなみにベイジアンフィルタとは、スパムメール判定にも使われているデータ分析手法です。

ベイジアンフィルタ - Wikipedia

 

この「日経平均株価予報Bot」、前日の日経平均株価とダウ平均株価から、翌日の日経平均株価を予想するんですが、その際にSimple HTML DOM Parserを使って外部サイトから情報を取得しています。

PHP Simple HTML DOM Parserの使用方法 - Webスクレイピング ライブラリ

 

ですが、作成したPHPコードをcronで実行すると、何故か一部のサイトの情報が取れない!

もちろんシェルで実行してもダメ!

試しに、作成したPHPコードをブラウザから直接呼び出すと、今度は正常に情報を取得できた。

どうやらphp.iniのUserAgentに適当なブラウザを指定して、ブラウザからのアクセスに見せかければ解決しそうな予感。

userAgent一覧/ユーザーエージェント一覧

 

ですが、php.iniにUserAgentを設定後も依然として情報が取れない!

仕方が無いので、PHPコード内でini_setするように変更すると何故か解決。

何だか良くわかりませんが、とにかく無事ツイートできるようになりました!

 

まとめ

どうやらスクレイピングでデータを取らせないように、ブラウザ以外からアクセスをブロックしているサイトがあるようです。

Yahoo!などの大手サイトは問題なく取れることが多いですが、念のため常にUserAgentは指定しておいた方が良さそうです。