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

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

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

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

Q&A

解決済

2回答

8976閲覧

画像をスクレイピングしてfile_put_contensでフォルダに入れようとするエラーになります。

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2017/05/30 07:44

とあるサイトの画像を取得しようとするとfile_put_contents() expects parameter 1 to be a valid path, string given inと表示されてしまいます。

色んな方法試してみたのですが上手くいきませんでした。
出来た事は画像のURLを取得、ファイル名を変更して、画像カラムにtextデータに格納です。※画像をimageフォルダにはできませんでした。var_dumpするとバイナリデータは出てくるので取得はできていると思われます。

やりたい事は同じクラス名の画像が2つあり、後者を取得。

頭についているhttpsを削除(これはできます。)→ファイル名をつけてtextカラムに格納(これも出来ます)、画像本体はimage/フォルダに格納です。(これが出来ないです。)

PHP

1 $html = file_get_contents('https://sample.com'); 2 3....4 5//画像URLを読み込んでいます。 6$HTMLData = file_get_contents($url); 7 $phpQueryObj = phpQuery::newDocument($HTMLData); 8 9.... 10 11foreach ($phpQueryObj->find('img.sample') as $img) { 12 $src = $img->getAttribute('src'); 13 $file = file_get_contents($src); 14 file_put_contents('image/'.$file, +1); 15 $src2 = str_replace('https://', '', $src); 16 17} 18.... 19 20 $query = "INSERT INTO sample (img)"; 21$query .= " VALUES "; 22 $query .= "("; 23 $query .= "'".$sampleimg."'"; 24 $query .= ")"; 25 $pdo->query($query); 26...

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

file_put_contents() expects parameter 1 to be a valid path, string given in を和訳すると、「file_put_contents()の1つ目の引数には正しいパスを指定するはずだけど、そうでない文字列が来ている」となります。

ということで、1つ目に指定すべきはファイルの内容ではなくファイル名です。ファイルの内容は第2引数です。

PHPマニュアル

投稿2017/05/30 08:00

maisumakun

総合スコア145123

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

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

退会済みユーザー

退会済みユーザー

2017/05/30 09:45

コメントありがとうございます。 勘違いしていました。1つ目にファイル名、2つ目が本体なのですね。ご指摘ありがとうございます。 以下に修正してみたのですがやはり上記のエラーが出てしまいます。 foreach ($phpQueryObj->find('img.sample') as $img) { $src = $img->getAttribute('src'); $file = file_get_contents($src); file_put_contents('image/'.$src, $file); }
退会済みユーザー

退会済みユーザー

2017/05/30 09:48

今取得しているサイトの画像が....jpgのような形ではなく、....abc.comみたいなURL上?に画像があります。そのため取得すると必ずhttps://.....abc.comのような文字列しか取れないためファイルパスもimage/https://.....abc.comのようになってしまいます。これが原因でしょうか。
退会済みユーザー

退会済みユーザー

2017/05/30 09:55

ちなみにグーグルクロームの検証機能使ってedit as HTMLでimage/抜くと画像は表示されます。やりたかったのはimage/フォルダに画像を格納して出力になります。※imageフォルダにhttpsやhttp含む文字列はやはりダメなのでしょうか。そこでhttps削って入れてみようと試みました。
退会済みユーザー

退会済みユーザー

2017/06/01 16:55

解決しました。ありがとうございます。
guest

0

ベストアンサー

今回取得したかった画像が.jpgではなく、.comだったのとURLがhttps://だったので最初うまく行きませんでした。

基本は以下で解決します。
正しい書き方かどうかは保証できません。

foreach ($phpQueryObj->find('img.sample') as $img) {
$src = $img->getAttribute('src');
$file = file_get_contents($src);
file_put_contents('image/'.$src, $file);
}

今回はhttps://..../0101.comだったのでsubstrとstr_replace使ってhttps://と/を削除して語尾に.jpg追加で0101.jpにしてfile_put_contensで解決しました。

投稿2017/06/01 16:55

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問