
前提・実現したいこと
ヘッドレスブラウザ(Chrome)を起動して、PHP(Goutte)で指定URL先のWebサイトから情報をスクレイピングするコードを書いています。管理者権限のあるサーバに、ヘッドレスブラウザやWebsocketやらをインストールの上、ターミナルで「$php ○○○.php」して実行しています。
ページ半ばにある「イベントスケジュール / チケット」の下にある日付(例:06/07(金)など)をクリックすると、cssのclassが動的に変更され、チケット情報が変更されます。ヘッドレスブラウザ+Goutteでクリックして、変更されたチケット情報を取得したいのですが、当方、プログラム初心者のため、どうすれば良いのかわかりません・・・。
該当ページ
https://mysterycircus.jp/events
発生している問題・エラーメッセージ
PHP Fatal error: Uncaught TypeError: Argument 1 passed to Symfony\Component\BrowserKit\Client::click() must be an instance of Symfony\Component\DomCrawler\Link, instance of Symfony\Component\DomCrawler\Crawler given, called in /home/scraping/site/test_f2.php on line 98 and defined in /home/scraping/vendor/symfony/browser-kit/Client.php:286 Stack trace: #0 /home/scraping/site/test.php(98): Symfony\Component\BrowserKit\Client->click(Object(Symfony\Component\DomCrawler\Crawler)) #1 {main} thrown in /home/scraping/vendor/symfony/browser-kit/Client.php on line 286
該当のソースコード
<?php require_once __DIR__ . '/../vendor/autoload.php'; require_once __DIR__ . '/../dao/dao.php'; use WebSocket\Client; use Symfony\Component\DomCrawler\Crawler; /* 初期設定 */ $goutte = new Goutte\Client(); $crawler = new Crawler(null); $domain = "https://mysterycircus.jp"; //URL $pathName = "/events"; //カレンダーURL $parent_calendat_id = 20; //DB calender id $pathContents = '._scheduler_container'; //イベントリストのクラス $pathPagerWrap = '._calendar_daysSet'; $pathPager = '._calendar_days_box_a'; $pathEventWrap = '._scheduler_main'; //イベントの囲み $pathEvent = '._scheduler_event_wrapper'; //イベント $pathTitle = '._scheduler_event_title'; //イベントタイトルまでのパス $pathImg = '._scheduler_event_pic img'; //イベント画像までのパス $pathDetail = '._scheduler_event_pic a'; //詳細ページまでのパス $pathText = ''; //イベント紹介文までのパス $pathDate = '._scheduler_event_description'; //イベント日付までのパス /* URLを作成する */ $urls[] = $domain . $pathName; //Chrome起動 $cmd = 'google-chrome --disable-gpu --headless --remote-debugging-port=9222'; exec($cmd . " > /dev/null &"); //Chromeの接続URLを取得 do { $endpoints = json_decode(`curl -s http://localhost:9222/json`); } while (empty($endpoints)); $endpoint = $endpoints[0]->webSocketDebuggerUrl; //接続クライアント作成 $client = new Client($endpoint); //Pageドメインのイベント受信を有効化 $client->send(json_encode([ 'id' => 1, "method" => 'Page.enable' ])); //ページを開く $client->send(json_encode([ 'id' => 2, "method" => 'Page.navigate', "params" => ['url' => $urls[0]] ])); //フレームIDが取得できるまで待機 while ($data = json_decode($client->receive())) { if($data->id == 2){ $frameId = $data->result->frameId; break; } } //画面の読み込が終わるまで待機 while ($data = json_decode($client->receive())) { if (@$data->method == 'Page.frameStoppedLoading' && @$data->params->frameId == $frameId) { break; } } //HTMLのDocument情報を取得 $client->send(json_encode([ 'id' => 3, 'method' => 'DOM.getDocument', 'params' => [] ])); while ($data = json_decode($client->receive())) { if($data->id == 3){ $nodeId = $data->result->root->nodeId; $backendNodeId = $data->result->root->backendNodeId; break; } } //HTMLソースを取得してスクレイピングする $client->send(json_encode([ 'id' => 4, 'method' => 'DOM.getOuterHTML', 'params' => ['nodeId' => $nodeId] ])); while ($data = json_decode($client->receive())) { if($data->id == 4){ $crawler->addHtmlContent($data->result->outerHTML); /* DOM取得 */ $crawler = $crawler->filter($pathContents); /* DOM修正 */ $num = $crawler->filter($pathEvent)->count(); /*イベント数*/ //■■■■■■■ここに「イベントスケジュール / チケット」の下にある日付をクリックする文を追加■■■■■■■ $next = $crawler->filter($pathPagerWrap)->filter($pathPager)->eq(1); $crawler = $goutte->click($next); //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ break; } } exec('pkill -f "' . $cmd . '"');
試したこと
1)$goutte->click($crawler->selectLink('06/07(金)')->link()); 2)$goutte->click($crawler->selectLink('._calendar_days_box_a')->eq(1)->link()); 3)$link = $crawler->selectLink('06/07(金)')->link(); $crawler = $goutte->click($link); 4)$next = $crawler->filter($pathPagerWrap)->filter($pathPager)->eq(1); $crawler = $goutte->click($next);
などと、検索しては試し、検索しては試しを繰り返してるのですが、
2日経ってもやり方がわかりません・・・。助けて頂けると嬉しいです・・・。



回答2件
あなたの回答
tips
プレビュー