LoginSignup
10
7

More than 5 years have passed since last update.

Goutteが怖い・・・・

Last updated at Posted at 2014-10-27

こんにちは、なめこです。
Goutteで怖い目にあいました(といってもGoutteが原因かは不明)
Goutte
https://github.com/fabpot/goutte

レンタルサーバ(エックスサーバ)でスクレイピングツールを作ってます。

test.php
$pram = POST値
$url = 対象URL
// ユーザーエージェントの取得
$useragent = HttpHeaderUtil::getUserAgent();
$client = new Client(['HTTP_USER_AGENT'=>$useragent, 'HTTP_ACCEPT-LANGUAGE'=>'ja,en']);
$options = JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT | JSON_PRETTY_PRINT;
echo $datetime . '開始だよ!';
$client->request('POST', $url, array(), array(), array('HTTP_CONTENT_TYPE' => 'application/json'), json_encode($param, $options));
echo $datetime . '終了だよ!';
$response = $client->getResponse();
$c = $response->getContent();
$c->seek(0);
$c = $c->getContents();

上記はJSONをPOSTして、JSONを返却してくるAPIをスクレイピングしたときの例です。
(WebAPIなのでGoutteでやる意味あんのか!?)
たくさんアクセスするので、上記のようなコードをぐるぐる回す感じです。
さてさて、プログラムを動作させて5時間後?ぐらいでしょうか
ふとログを見ると


~~~省略~~~
10/27 20:00 開始だよ!
10/27 20:03 終了だよ!
10/27 20:03 開始だよ!
10/27 20:04 終了だよ!
10/27 20:05 開始だよ!

あれ・・・途中でとまってる。
現在の時刻は・・・10/27 23:00
え!?3時間も止まってるの!?

もちろん、エラー出力もありませんし、プロセスはちゃんと生きてます。(ただしプロセスのメモリの変動は止まったまま)
$client->requestの部分は
Symfony\Component\BrowserKit\Clientにあるメソッドです
Goutte自体はうまい感じにライブラリをラップしてるだけなので、Goutteが悪いわけではないと思います。

妄想ですが、
どっかで無限ループに陥るのかもしれません
外部ライブラリにデバッグ文埋め込むまではしていないので、確実な理由はわかりませんが、
requestメソッドの前後にログを入れたので、たしかにそこで応答が返ってこない現象が起きています。

長時間スクレイピングでこの事象に何回か遭遇し、Goutteが怖くなりました(Goutteのせいじゃない)

なのでcurlでスクレイピング処理を書き直したところ、問題は解決しました。(Goutteを使わない)

誰かこの現象になった人いないかな?

10
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7