質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Symfony2

Symphony2は、簡単で速く堅牢なプログラムの開発サイクルに焦点を当てた、オープンソースのPHPウェブアプリケーション開発フレームワークです。PHP version 5.3.3以上を対象としています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

3回答

2673閲覧

htmlファイルのパスをURLにしてGoutteでクローリングすると値が取れない

Pccla

総合スコア35

Symfony2

Symphony2は、簡単で速く堅牢なプログラムの開発サイクルに焦点を当てた、オープンソースのPHPウェブアプリケーション開発フレームワークです。PHP version 5.3.3以上を対象としています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2016/06/19 06:53

編集2016/06/19 08:58

(追記:仮想環境)
CentOS7
Vagrant 1.8.1

使っている環境
php 5.6
symfony 2.2
goutte 3.1

上記環境でクローラーを作っています。
最初は何度も実行をするから、クローリングするサイトへ負荷がかかるだろうと思い、
サイトトップページのhtmlを丸々コピーして仮想環境で作業しています。

ところが、そのhtmlファイルのパスをURLとして、
トップページの情報をvar_dumpしてみたところテキストなどの値が何も取れておりませんでした。

試しにファイルのパスではなく、実際にクローリングしたいサイトのURLで実行してみると
テキストなどの値が取れました。

php

1require_once "/var/www/html/crawler/vendor/autoload.php"; 2 3use Symfony\Component\DomCrawler\Crawler; 4use Goutte\Client; 5 6 7$cli = new Client(); 8// 仮想環境に設置したhtmlファイルのパスををurlにしてクローリングすると $crawler に値が入ってこない。 9$url = "http://user.com/crawler/top.html"; 10 11 // 実際に値を取得したいサイトのURLをurlにすると $crawler に値が入ってきた。 12 // $url = "http://www.××××××.co.jp"; 13 14// ここでvar_dumpすると上記の違いが出てくる。 15$crawler = new Crawler($url); 16 17// サイトトップページの情報をリクエスト 18$crawler = $cli->request("GET", $url); 19var_dump($crawler);

なぜhtmlファイルのパスだと値が取れないのかお分かりになる方がいらっしゃいましたら
教えていただけますと幸いです。goutteを使っての解決方法でお願いします。
どうぞよろしくお願いします。

確認したこと
・ファイルのパスは間違っていないか。
・htmlファイルの中身がちゃんと入っているか。
・var_dumpした時に下記を見て値が取れていないと判断しました。

html

1["textContent"]=> 2 string(1221) " 3function getCookie(c_name) { // Local function for getting a cookie value 4 if (document.cookie.length > 0) { 5 c_start = document.cookie.indexOf(c_name + "="); 6 if (c_start!=-1) { 7 c_start=c_start + c_name.length + 1; 8 c_end=document.cookie.indexOf(";", c_start); 9 10 if (c_end==-1) 11 c_end = document.cookie.length; 12 13 return unescape(document.cookie.substring(c_start,c_end)); 14 } 15 } 16 return ""; 17} 18function setCookie(c_name, value, expiredays) { // Local function for setting a value of a cookie 19 var exdate = new Date(); 20 exdate.setDate(exdate.getDate()+expiredays); 21 document.cookie = c_name + "=" + escape(value) + ((expiredays==null) ? "" : ";expires=" + exdate.toGMTString()) + ";path=/"; 22} 23function getHostUri() { 24 var loc = document.location; 25 return loc.toString(); 26} 27setCookie('××××××××××', '×××.×××.×××.×××', ××); 28try { 29 location.reload(true); 30} catch (err1) { 31 try { 32 location.reload(); 33 } catch (err2) { 34 location.href = getHostUri(); 35 } 36} 37This site requires JavaScript and Cookies to be enabled. Please change your browser settings or upgrade your browser." 38 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

ありそうなのは仮想環境のhostsにuser.com 127.0.0.1が設定されてないのかなーと思いますが、情報が少ないのでひとまず

php

1$cli->getInternalResponse()->getStatus();

で返ってくるHTTPステータスコードを確認してみはどうでしょうか。

投稿2016/06/19 07:41

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Pccla

2016/06/19 08:55

回答ありがとうございます。 HTTPアクセスコードを確認したところ「int(200)」が帰ってきました。 が、そこからどうしたらいいのかわからずまた悩んでおります、、 > 仮想環境のhostsにuser.com 127.0.0.1が設定されてない こちらは /etc/httpd/conf/httpd.conf に書き込む情報か何かでしょうか?? 初歩的なところで詰まってしまい申し訳ないのですがご教示いただけますと幸いです!
Pccla

2016/06/19 10:02

おっしゃった通り、hostの設定がされていなかったことが原因で 仮想環境に設置したhtmlファイルを読み込めていませんでした。 ありがとうございました!!
guest

0

hide2e3rさんのおっしゃった通り、hostsに user.com 127.0.0.1 と設定したら解決しました。
(192.168.××~としても問題なく表示されるんですね〜、、ここらへんはまだまだ勉強が必要なようです。)

仮想環境のhostsにuser.com 127.0.0.1が設定されてない

お手数をおかけいたしました。お二人とも貴重なお時間ありがとうござました!

投稿2016/06/19 10:01

編集2016/06/19 10:09
Pccla

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

URLしか違いがなく、情報が取れないのなら、URLが間違っているのだと思います。
cURL等でちゃんと情報が入手できるか確認されては?

ファイルのパスって書き方が、そのままの意味なのであれば、それが間違いです。

投稿2016/06/19 07:35

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Pccla

2016/06/19 08:49

回答ありがとうございます。また、書き方が悪く申し訳ありません。 ファイルパスそのままを記述しているわけではなく、 開発環境でアクセスできるURLを記述しております。 HTTPステータスコードを確認したところ「int(200)」が帰ってきてまして、そこからまた悩んでおります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問