###わからないこと
いつもお世話になっております。
下記のサイトの事業所一覧ページのスクレイピングを行いたくphamtomjsを使用しています。
案件一覧の箇所がiframe内にあり、javascript実行後に表示されています。したがってphamtomjsにてjavascript実行後のhtmlを取得しようとしているのですが、うまくいっておりません。
何が誤っているのでしょうか?
またはほかの手段を考えるべきでしょうか?
####コード
// PhantomJs $client = PClient::getInstance(); $client->getEngine()->setPath('vendor\bin\phantomjs.exe'); $projectListUrl = 'http://www.kaigokensaku.mhlw.go.jp/01/index.php?action_kouhyou_pref_search_list_list=true&PrefCd=01&OriPrefCd=01&method=pager&p_sort_name=47&p_order_name=1&p_count=5&p_offset=0iframe=1'; $client->isLazy(); $request = $client->getMessageFactory()->createRequest(); $request->setTimeout(5000); $request->setMethod('GET'); $request->setUrl($projectListUrl); $response = $client->getMessageFactory()->createResponse(); // Send the request $client->send($request, $response); if($response->getStatus() === 200) { // Dump the requested page content $conte = $response->getContent(); } // xmlへの変換 @$dom->loadHTML($conte); $xml = simplexml_import_dom($dom);
###追記 11/25
下記のようにコードを変更し、phantomjs.exeでcrawler.jsを実行し、実行結果をkaigokensaku.blade.phpに書き込む処理を行い、iframe内も取得しようとしておりますがうまく言っておりません。
原因はどこにあるのでしょうか。
php
1use JonnyW\PhantomJs\Client as PClient; 2 3 4$page = 5; 5// PhantomJs 6$client = PClient::getInstance(); 7 8 9 10for($i = 1; $i <= 47; $i++) { 11 $request = $client->getMessageFactory()->createRequest(); 12 if(strlen($i) === 1){ 13 $prefId = '0'.$i; 14 } else { 15 $prefId = $i; 16 } 17 18 $pNum = $page - 5; 19 $projectListUrl = 'http://www.kaigokensaku.mhlw.go.jp/13/index.php?action_kouhyou_pref_search_list_list=true&PrefCd=13&OriPrefCd=13&method=pager&p_sort_name=47&p_order_name=1&p_count='.$page.'&p_offset='.$pNum; 20 $client->isLazy(); rendering 21 $request = $client->getMessageFactory()->createRequest(); 22 $request->setTimeout(20000); 23 $cli = exec('C:\X_DRIVE\asp\home\laravel\vendor\bin\phantomjs.exe C:\X_DRIVE\asp\home\laravel\public\js\crawler.js '.$projectListUrl); 24 var_dump($cli);dd(); 25}
javascript
1console.log('Hello, world!'); 2var page = require('webpage').create(); 3var fs = require('fs'); 4page.open('http://www.kaigokensaku.mhlw.go.jp/13/index.php?action_kouhyou_pref_search_list_list=true&PrefCd=13', function(status) { 5if (status === 'success') { 6// HTML を書き出し 7var html = page.evaluate(function() { 8return document.getElementsByClassName('main')[0].innerHTML; 9}); 10fs.write('resources\kaigokensaku.blade.php', html, 'w'); 11} 12// exit しないと終了しない 13phantom.exit(); 14}); 15
###追記 11/27①
11/25の追記のコードの原因ですが、setTimeoutができていないことが原因と考えています。
ただ、なぜsetTimeoutできていないのかがわかっておりません。
###追記 11/27②
次のようにjsファイルのコードを変更した結果setTimeoutはじっこうされましたが、iframe内のコードは取得できませんでした。
console.log('Hello, world!'); var page = require('webpage').create(); var fs = require('fs'); page.open('http://www.kaigokensaku.mhlw.go.jp/13/index.php?action_kouhyou_pref_search_list_list=true&PrefCd=13', function(status) { window.setTimeout(function(){ if (status === 'success') { // HTML を書き出し var html = page.evaluate(function() { return document.getElementsByClassName('main')[0].innerHTML; }); fs.write('resources\kaigokensaku.blade.php', html, 'w'); } // exit しないと終了しない phantom.exit(); }, 20000); });
##追記③
jsファイルを下記のように修正することでiframe内のhtmlを取得できるようになりましたので報告いたします。
javascript
1console.log('Hello, world!'); 2var page = require('webpage').create(); 3var fs = require('fs'); 4page.open('http://www.kaigokensaku.mhlw.go.jp/13/index.php?action_kouhyou_pref_search_list_list=true&PrefCd=13', function(status) { 5 if (status === 'success') { 6 page.switchToFrame(0); 7 // HTML を書き出し 8 var html = page.evaluate(function() { 9 return document.getElementsByClassName('contents')[0].innerHTML; 10 }); 11 fs.write('resources\kaigokensaku.blade.php', html, 'w'); 12 } 13 // exit しないと終了しない 14 phantom.exit(); 15}); 16
settimeoutは不必要で「page.switchToFrame(0);」を記載することで出力できました。
ご協力ありがとうございました。
何卒よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/11/23 02:27
退会済みユーザー
2017/11/23 02:27
2017/11/23 09:01
退会済みユーザー
2017/11/23 09:22
2017/11/23 09:32
退会済みユーザー
2017/11/23 09:47
2017/11/23 10:47
退会済みユーザー
2017/11/25 11:35
2017/11/27 07:31
退会済みユーザー
2017/11/27 07:38