• 締切済み

goutteを使った複数ページのスクレイピング

goutteを使って2箇所スクレイピングをして、1ページに表示したいです。 1カ所目(http://www.example1.html)はうまく表示出来たのですが、2カ所目http://www.example2.htmlが出来ません。 <?php require __DIR__.'/goutte.phar'; use Goutte\Client; $client = new Client(); $crawler = $client->request('GET', 'http://www.example1.html'); ?> <div> <?php $crawler->filter('table')->eq(0)->each(function($today) { echo $today->html(); }); ?> </div> <?php require __DIR__.'/goutte.phar'; use Goutte\Client; $client = new Client(); $crawler = $client->request('GET', 'http://www.esample2.html'); ?> <div> <?php $crawler->filter('table')->eq(0)->each(function($tomorrow) { echo $tomorrow->html(); }); ?> </div> 変数名を変えて見ましたがうまく行きませんでした。どうすれば表示されるのでしょうか。

  • PHP
  • 回答数1
  • ありがとう数0

みんなの回答

  • chirakuma
  • ベストアンサー率58% (253/430)
回答No.1

サイトの情報を取ってくるところまでは$crawlerにデータが入っているかで確認が出ます。 ちゃんととれているかは、 var_dump($crawler); とかで確認してください。 その後にfilter()やeq()で条件を絞り込んでいるかと思いますが、クロールしてきたページにその条件が無いためにecho()に引っかかってこないだけでは無いでしょうか。ページ毎に条件は設定を調整する必要があるので、該当のタグやセレクタがページ内にあるかを再度確認してみてください。

関連するQ&A

  • スクレイピングの仕方

    phpのgoutteを使用して、 下記htmlのスクレイピング結果をDBに格納したいと考えています。 li部分が繰り返し部分後なっております。 ■htmlのスクレイピング部分 <ul id="test">  <li class="clearfix">   <div class="thumbox">    <a href="http://xxxx.co.jp" target="_blank"">     <img src="http://xxx.co.jp/01.jpg" alt="01" class="thumb">    </a>   </div>   <h4>    みだし   </h4>   <p>    文章   </p>  </li>  <li>   上記liと同じで、繰り返し。(画像ファイル、文章等は異なります。)  </li> </ul> phpソースは、下記部分になります。 ■スクレイピングphpソース $crawler->filter('ul#test a')->each(function($element) { var_dump($element->attr('href')); }); 現状のphpソースでは、filter('ul#test a')のため、 aタグのhrefの内容しか抜き取れていません。 やりたいこととしては、  1.aタグのhref値  2.imgのsrc値  3.aタグの後のhタグの見出し  4.pタグの文章を抜く 上記4つを一回で抜き出し、後はli部分をぐるぐる回して、1~4の値を抜きたいのです。 最終的には、  ・抜いた4つの値をDBに1行のレコードとして格納。  ・残りのli部分も同じように繰り返す。 といったことをやりたいので、 $crawler->filter('タグ書き方)->each(function($element) { 変数1 = 1.aタグのhref値    変数2 = 2.imgのsrc値    変数3 = 3.aタグの後のhタグの見出し    変数4 = 4.pタグの文章を抜く    DBにIns(変数1,変数2,変数3,変数4) }); と一回の関数の中で、4つの値を取り出し、DBに放り込みたいのです。 現状、私が記述しているfilter条件では、aタグしか取り出せないのです。 どのようにソースを修正すれば、対応できるのかわかりません。 良い知恵をお持ちの方がいらっしゃいまいたら、 ご教授お願いいたします。

    • ベストアンサー
    • PHP
  • メソッドから値を引っ張ってこれない。

    phpのgoutteを使用して、下記ソースを記述しました。 スクレイピング対象のHTTPアドレスの記述に間違いはありません。 ※アドレスはダミーです。 ただ、elementオブジェクトから、 nodeValueの値を引っ張れないのです。 ■phpソース <?php require_once 'goutte.phar'; use Goutte\Client; $crawler = $client->request('GET', 'http://www.test.xml'); $crawler->filter('item')->each(function($element) { echo $element->nodeValue; }); ?> ■スクレイピング先ソース <rss version="2.0"> <channel> <item> <title>タイトル1</title> <category>本1</category> <link>http://www.test.co.jp/book/book1/</link> <description>本1について詳細を説明します。</description> <pubDate>2015-01-09</pubDate> </item> <item> :以降繰り返し : </iem> </channel> </rss> ■エラー内容 PHP Notice: Undefined property: Symfony\\Component\\DomCrawler\\Crawler::$nodeValue in /php配置ディレクトリ/Test.php ■$erementのvar_dump出力結果 object(Symfony\Component\DomCrawler\Crawler)#908 (4) { ["storage":"SplObjectStorage":private]=> array(1) { ["000000005a6bd4e800000000d42c592e"]=> array(2) { ["obj"]=> object(DOMElement)#19 (18) { ["tagName"]=> string(4) "item" ["schemaTypeInfo"]=> NULL ["nodeName"]=> string(4) "item" ["nodeValue"]=> string(286) " タイトル1 本1 http://www.test.co.jp/book/book1/ 本1について詳細を説明します。 2015-01-09 " } ["inf"]=> NULL } } nodeValueで値を拾えない原因がわからないのです。 var_dumpで確認したところ、nodeValueに値が存在しているように見えていることは確認できています。(Stringの数値286はダミーです) requireが足りないのでしょうか。 それともアクセスの方法が間違っているのでしょうか。 ご教示よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 動的ページを作る時のディレクトとリファイル構成

    動的ページを作るとき、レイアウトを変更するときに一括でできるように contents.phpをrequire_onceで各ファイルを読み込んで組み立てています。 このような感じで構成するのは正しいでしょうか。 ■/(ルートディレクトリ) ├─□index.php ├─■actionディレクトリ(各ページ共通に使用するファイルを格納) │  ├─□header.php(各ページのheader部) │  ├─□left.php(各ページのleft部) │  ├─□right.php(各ページのright部) │  ├─□footer.php(各ページのfooter部) │  ├─□class-teisuu.php(定数を格納) │  ├─□class-kannsuu.php(関数を格納) │  └─□class-mysql.php(mysqlの接続とクエリ) ├─■contentsディレクトリ(各ページの情報を格納) │  ├─■0001 │  │  ├─□contents.php($pegenumber='001'を格納) │  │  └─■imageディレクトリ(そのページの写真を格納) │  │     └─□001~n.jpg   ----------------   1266まで繰り返し   ---------------- └─-└─■1266       ├─□contents.php($pegenumber='1266'を格納)       └─■imageディレクトリ(そのページの写真を格納)          └─□001~n.jpg 0777ディレクトリのcontents.php ------------------------------ <?php $pegenumber='0777' require_once("../../action/header.php"); require_once("../../action/right.php"); require_once("../../action/left.php"); require_once("../../action/footer.php"); require_once("../../action/class-teisuu.php"); require_once("../../action/class-kannsuu.php"); require_once("../../action/class-mysql.php"); ?> header.php ------------------------------ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <meta name="keywords" content="<?php echo $a1.','~.$a10; ?>" /> <meta name="description" content="<?php echo $b1.$b2.$b3.'のサンプルです。'; ?>" /> <link href="~~~" rel="stylesheet" type="text/css" /> <script type="text/javascript" src="~~~"></script> <title><?php echo $title; ?></title> </head> <body> <div class="owner"> <!-- ヘッダー部分 --> <div> </div>//ヘッダー終わり right.php ------------------------------ 「</div>//ヘッダー終わり」からの続き <!-- メインコンテンツ --> <div> </div>//メインコンテンツ終わり left.php ------------------------------ 「</div>//メインコンテンツ終わり」からの続き <!-- レフトカラム部分 --> <div> </div>//レフトカラム終わり footer.php ------------------------------ 「</div>//フッター部分終わり」からの続き <!-- フッター部分 --> <div> </div>//フッター終わり </div>//owner終わり </body> </html>

    • ベストアンサー
    • PHP
  • TwistOAuth ホストが解決できない

    Twistoauthを使って見たのですが、テストツイートがうまく行きません Error! Couldn't resolve host 'api.twitter.com' コード ↓ <?php //import require_once "TwistOAuth.phar"; //OAuth TwistOAuth //boot tweet try{ $tweet=$tfa->post("statuses/update",array("status"=>filter_input(INPUT_POST,"test"))); }catch(TwistException $te){ echo "Error! ".$te->getMessage(); } ?> なにが原因なのでしょうか

    • ベストアンサー
    • PHP
  • Cakephp2.0で、PhantomJs

    Cakephp 2.0のConsole/Commandで、スクレイピングを行う処理を実装しようとしています。 PhantomJsを使おうとしていますがどうもうまくいきません。 composerを利用してPhantomJsを、 /XAMPP/xamppfiles/htdocs/cakephp/app/Vendor にインストールしました。 ”/XAMPP/xamppfiles/htdocs/cakephp/app/” に test.phpとして、 <?PHP require_once('vendor/autoload.php' ); use JonnyW\PhantomJs\Client; $client = Client::getInstance(); $client->getEngine()->setPath('vendor/bin/phantomjs'); $request = $client->getMessageFactory()->createRequest(); $response = $client->getMessageFactory()->createResponse(); $request->setMethod('GET'); $request->setUrl('https://pg.kdtk.net/sample/phamtomjs_test.html'); $client->send($request, $response); echo "request url: " . $request->getUrl() . "\n"; echo "response: " . $response->getStatus() . "\n"; if($response->getStatus() === 200) { echo "content: \n"; echo $response->getContent(); } ?> というサンプルプログラムを実行するとうまくいきました。 これを、Console/Commandで実装したいのですが、どのように実装したら良いかわかりません。 例えば /XAMPP/xamppfiles/htdocs/cakephp/app/Console/Command に、 SampleShell.php として保存し、 <?php class SampleShell extends AppShell { public function startup() { parent::startup(); App::import('Vendor', 'Client', array('file' => 'JonnyW/PhantomJs/Client.php')); } // メイン実行関数 public function main() { $client = Client::getInstance(); } } ?> php cake.php Sample を実装すると、 PHP Fatal error: Class 'Client' not found ・・・ とエラーとなります。 インスタンスを生成できるようにするにはどのようにすれば良いのでしょうか? ご教示いただきますよう、何卒宜しくお願い申し上げます。

    • 締切済み
    • PHP
  • PEARの参照先

    PHP5環境下でPEARモジュールをインストールしましたが、実行時にモジュールがないというエラーメッセージが表示され、対応をしています。 お助けください。 1.現象  PHP5のプログラム実行時にエラーとなってしまい、下記のメッセージが表示されました。 Warning: require_once(Cache/Lite.php) [function.require-once]: failed to open stream: No such file or directory in ・・・ Fatal error: require_once() [function.require]: Failed opening required 'Cache/Lite.php' (include_path='.:/home/example/share/pear5') in ・・・ 2.環境  ・さくらインターネット(FreeBSD)でPHP5を独自にインストールしPEARライブラリも導入済です。    PHP5実行ファイルのインストール先 /home/example/www/cgi-bin  ・phpinfo()で確認した、include_pathは下記の通りです。    .:/home/example/share/pear5  ・pear config-show で確認した結果は、下記の通りです。    pear config-set bin_dir /home/example/share/pear5/bin    pear config-set doc_dir /home/example/share/pear5/PEAR/docs    pear config-set ext_dir /home/example/share/pear5/PEAR/extensions    pear config-set php_dir /home/example/share/pear5/PEAR    pear config-set cache_dir /home/example/share/pear5/PEAR/cache    pear config-set data_dir /home/example/share/pear5/PEAR/data    pear config-set php_bin /home/example/www/cgi-bin    pear config-set test_dir /home/example/share/pear5/PEAR/tests    pear config-set download_dir /home/example/share/pear5/temp/download    pear config-set temp_dir /home/example/share/pear5/temp  ・pear list で確認した結果は、下記の通りです。    Archive_Tar 1.3.2 stable    Cache_Lite 1.7.2 stable    Console_Getopt 1.2.2 stable    HTML_Templete_IT 1.2.1 stable    Net_UserAgent_Detect 2.2.0 stable    PEAR 1.5.1 stable    PEAR_Frontend_Web 0.5.1 alpha    Structures_Graph 1.0.2 stable ・Cache_Liteの所在     /home/example/share/pear5 の中で、Cache_Lite らしきモジュールを     探してみたところ、下記のディレクトリにありました。          /home/example/share/pear5/PEAR/Cache        Lite.php      /home/example/share/pear5/PEAR/Cache/Lite        File.php        Function.php        Output.php      /home/example/share/pear5/PEAR/tests/Cache_Lite/tests        拡張子.phptのファイルが多数   ・PEARおよび、モジュールのインストールは下記のサイトを参照して実行しています。    http://zenryokuhp.com/server/sakura_pear.htm 3.疑問点   ・モジュールは、include_pathで指定されている、      /home/example/share/pear5    の直下に置かなければならないのでしょうか。   ・現在、モジュールは /home/example/share/pear5/PEAR に存在しているのですが、    include_pathで指定した位置よりも、1階層下に置いてはいけないのでしょうか。   ・再度、PHP5とPEARのインストールをやり直し、pear config-set コマンドにて、      pear config-set php_dir /home/example/share/pear5/    と設定し、モジュール"Cache_Lite"をインストールしようとしましたが、      "Cannot install, php_dir for channel "pear.php.net" is not writeable the current user"    と表示されて、インストールが出来ませんでした。    /home/example/share/pear5/ ではインストール出来ず、    /home/example/share/pear5/PEAR ではインストール出来るというのは、    PHP5をインストールしたときに同時に登録されるPEARのディレクトリには    インストール出来ないということなのでしょうか。 以上、ご教授をお願いいたします。

    • 締切済み
    • PHP
  • TwistOAuthが読み込めないエラー

    「TwistOAuth」でツイート語句検索ファイルを作っているのですが、初心者ゆえ、 エラーが出て上手くゆきません。”TwistOAuth.phar”はPHPファイルの同階層にそのまま置いています。 requireに失敗しているのでしょうか?以下のエラーが出ます。 ????nn? Fatal error: Class 'TwistOAuth' not found in /home/users/1/.../***.php on line 8 基本的な事がたぶん分かっていないのでご指摘お願いします。(????nn?の意味も分かりません。。) ~~~ソース~~~ <?php require ( dirname ( __FILE__ ) . '/TwistOAuth.phar'); $ck = '***'; $cs = '***'; $at = '***'; $as = '***'; try { $to = new TwistOAuth($ck, $cs, $at, $as); $q = '検索文字'; $count = 10; $lang = 'ja'; $result = $to->get('search/tweets', compact('q', 'count', 'lang')); } catch (TwistException $e) { $error = $e->getMessage(); exit( $error ); } ob_start(function($buf){ return mb_convert_encoding($buf, 'SJIS', 'UTF-8'); }); foreach($result->statuses as $status): echo $status->text; echo "\n"; endforeach; echo "end"; ?>

    • 締切済み
    • PHP
  • Smartyでテンプレートの場所を指定する方法

    Smartyでテンプレートファイルの場所を指定するいい方法を教えてください。 公式マニュアルには基本的には(1)のようにやるのだと書いてあります。そして拡張セットアップとして(2)の方法が紹介されています。これなら「ディレクトリパスの設定を同じ変数に何度も割り当てる代わりに、一箇所でそれらを行う事が出来ます」とのことですが…。 しかし拡張セットアップの方法でも、プログラムファイル(.php)の中に環境依存の値を記述しています。私はJava開発の経験はあり、PHP開発の経験は無く、現在は趣味の範囲でPHPをやっています。 で、Javaの経験からすると、環境依存の値も設定ファイルのパスもプログラムファイルに書くことはまず無いので、(2)の方法でも気持ち悪く感じます…。また「ページを呼び出すたびに毎回setup.phpを呼ぶの?サーバー起動時に読み込むべき値・ファイルだろうが…」とも思ってしまいます。 …しかし私がどう感じるかは別として、実際の開発の現場ではどうすることが多いのか知りたくて質問をする事にしました。 質問は以下です。 [a]Smartyのテンプレートファイルのパスなどは、どこにどう書くことが多いのか? [b]Smartyに限らず、PHPという言語では、環境設定の値や設定ファイルのファイル名やパスを、プログラムファイル(.php)に書くのがあたりまえなのか?どうすることが多いのか。 [c]PHPではプログラムで使う値として、サーバー起動時に設定値・設定ファイルを読み込む一般的な仕組みがあるか?(サーバー設定値でもないのにphp.iniに書いてini_getで取得するなんてことが許される?他にもっとスマートな方法がある?) ※具体的な例を挙げて教えていただけると助かります。また、「あまりやらないけど、こうやったこともあるよ」などというイレギュラーなケースも教えていただけるとうれしいです。 よろしくお願いします。 --(1)index.php--------------------------------------------- <?php require_once(SMARTY_DIR . 'Smarty.class.php'); $smarty = new Smarty(); $smarty->template_dir = '/web/www.example.com/guestbook/templates/'; $smarty->compile_dir = '/web/www.example.com/guestbook/templates_c/'; $smarty->config_dir = '/web/www.example.com/guestbook/configs/'; $smarty->cache_dir = '/web/www.example.com/guestbook/cache/'; $smarty->assign('name','Ned'); $smarty->display('index.tpl'); ?> ----------------------------------------------------------- 基本的なインストール | Smarty http://www.smarty.net/docs/ja/installing.smarty.basic.tpl --(2)setup.php--------------------------------------------- <?php require('Smarty.class.php'); class Smarty_GuestBook extends Smarty { function __construct() { parent::__construct(); $this->template_dir = '/web/www.example.com/guestbook/templates/'; $this->compile_dir = '/web/www.example.com/guestbook/templates_c/'; $this->config_dir = '/web/www.example.com/guestbook/configs/'; $this->cache_dir = '/web/www.example.com/guestbook/cache/'; $this->caching = Smarty::CACHING_LIFETIME_CURRENT; $this->assign('app_name', 'Guest Book'); } } ?> --(2)index.php--------------------------------------------- <?php require('guestbook/setup.php'); $smarty = new Smarty_GuestBook(); $smarty->assign('name','Ned'); $smarty->display('index.tpl'); ?> ----------------------------------------------------------- 拡張セットアップ | Smarty http://www.smarty.net/docs/ja/installing.smarty.extended.tpl

    • ベストアンサー
    • PHP
  • インクルードファイル内にPHPコードを挿入してecho表示

    処理が異なる2つのPHPファイルを一つのテンプレートファイルから index.phpファイルへ表示させたいのですが、テンプレートファイル内に css_echo.phpをインクルードさせたコードを書くとそのままソース上に表示されてしまいます。 どのような方法をとればいいかアドバイス下さい。 ■条件としては、 ・css.php/css_echo.phpの処理ファイルはそれぞれ別ファイルとしたい ・index.phpファイルは <html> <head> <?php require_once('./css_echo.php');//ブラウザを判別してCSSファイルを出力 ?> </head> <body> <?php $temp = "./temp.html"; //このページのテンプレートファイル名パス require_once('./echo.php'); ?> </body> </html> には書かない方法で対応したいです。 ファイルは以下です。 ---------------------------------------------------------------------- テンプレートファイル(temp.html) <html> <head> <!--問題はここです。 --> <?php require_once('./css_echo.php');//ブラウザを判別してCSSファイルを出力 ?> </head> <body> サンプル表示{この中はブラウザ判別して表示・非表示にする} </body> </html> 処理PHPファイル(echo.php) <?php $htm = file_get_contents($temp); echo preg_replace('/[{}]/', '', $htm);// {}内を削除して表示 ?> ブラウザ判別用ファイル(css_echo.php) <?php //実際にはこの前にブラウザ判別し処理コード(省略) echo "<link rel=\"stylesheet\" href=\"$dir$pc\" type=\"text/css\">\n"; ?> メイン表示用PHPファイル(index.php) <?php $temp = "./temp.html"; //このページのテンプレートファイル名パス require_once('./echo.php'); ?> ------------------------------------------------------------------------

    • 締切済み
    • PHP
  • phpのrequirについてe

    php初心者です。 同じような処理をまとめて、関数にしました。 debug中なので、function()ひとつに ひとつのphpファイル名をつけています。 あとで合体するつもりで。 当然、requireの数が複数になっていますが、requireの行(冒頭)でエラーになってしまいました。 echoで1行ずつ表示して確認しました。原因がわからず順番を変えたりpath指定を変更したりしたのですが、読み込んでくれません。 なので、処理直前で必要な関数を読み込むようにしたりもしたのですが 冒頭で require (dirname(__FILE__)."/include/******.inc"); require (dirname(__FILE__)."/include/******chk.php"); require (dirname(__FILE__)."/../include/******m.inc"); require (dirname(__FILE__)."/m******.php"); require (dirname(__FILE__)."/m******andom.php"); require (dirname(__FILE__)."/m******time_client.php"); require (dirname(__FILE__)."/error_******.php"); require (dirname(__FILE__)."/log******.php"); まではクリアできました。 (path指定が混ざってますがいろいろ試したので。。。) で、ある関数を呼ぶ直前に require (dirname(__FILE__)."/lfunc*****.php"); としたのですが /lfunc*****.php に飛ばないんです。 (echoが出ない) こういうのはどのような原因があるのでしょうか? ちょっと思ったのですが、何か重複してるのでしょうか? 似たような変数名が多くなってますが、requireした中のfunctionの中なら 別の変数として扱われますよね? 一応構文チェックなどはちゃんと no シンタックスエラーを確認しています。 ログにもかかれないし。 すみません、php初心者にアドバイスお願いします。

    • ベストアンサー
    • PHP