使用PHP进行网页爬取

总结

使用php从食品指南网上获取个人信息的方法汇总。
目标:从食品指南网上获取所需的信息(标题,评分,图片路径),并将其整理在csv文件中。

流动

获取h3的信息

<?php
  // phpQueryの読み込み
  require_once("./phpQuery-onefile.php");

  // 取得したいwebサイトを読み込む
  $html = file_get_contents("対象のURL");

  // 見出し要素を取得&表示
  echo phpQuery::newDocument($html)->find("h1")->text();
?>

参考:【PHP】从网站上以三行代码获取所需信息的方法

2. 导出为CSV文件

// ファイルを開く。"a"は書き出し用として開くパラメータ。
$file = fopen("data.csv", "a");

$contents = phpQuery::newDocument($html)->find("h3")->text();

// データを1行書き込む
fputs($file, $contents."\n");

(参考)
– 打开文件
– 向文件中写入一行(输出)[使用fputs函数]

将获取的元素逐个存储到数组中,并逐个写入文件。

// 取得する要素の数を取得
$title_num = count(phpQuery::newDocument($html)->find("h3")->find(".rvw-item__rst-name"));

// 一つづつ配列に格納
for($i=0;$i<$title_num;$i++){
    $title[] = phpQuery::newDocument($html)->find("h3")->find(".rvw-item__rst-name:eq($i)")->text();
}

// 一つづつファイルに書き出す
foreach($title as $title_element){
    fputs($file, $title_element."\n");
}

4. 同时获取价格信息和图像信息,并将foreach改写为for循环以一次性进行信息获取和写入。

for($i=0;$i<$title_num;$i++){
    $title[] = phpQuery::newDocument($html)->find("h3")->find(".rvw-item__rst-name:eq($i)")->text();
    $price[] = phpQuery::newDocument($html)->find(".c-rating__val:eq($i)")->text();
    $image[] = phpQuery::newDocument($html)->find(".rvw-photo__list:eq($i)")->find('img:eq(0)')->attr('src');
    fputs($file, $title[$i].", ".$price[$i].", ".$image[$i]."\n");
}

每个请求之间间隔1至3秒的时间。

sleep(3);

(参考)
・关于网页爬取的注意事项清单
・编写用于获取日本流行网站的脚本

(错误修正)尽管向另一个页面发出请求,但所输出的信息是相同的。

原因:由于$title[]和$image[]中含有相同的信息。
解决方案:将其转换为二维数组,使用$title[$p][$i]的形式。

for($p=1;$p<5;$p++){
      $html = file_get_contents("取得したいURL");
        $title_num = count(phpQuery::newDocument($html)->find("h3")->find(".rvw-item__rst-name"));
        for($i=0;$i<$title_num;$i++){
            $title[$p][$i] = phpQuery::newDocument($html)->find("h3")->find(".rvw-item__rst-name:eq($i)")->text();
            $price[$p][$i] = phpQuery::newDocument($html)->find(".c-rating__val:eq($i)")->text();
            fputs($file, $title[$p][$i].", ".$price[$p][$i]."\n");
        }
        sleep(3);
    }

(参考)PHP数组 关联数组 foreach 二维数组

所有的代码

<?php
  require_once("./phpQuery-onefile.php");
    $file = fopen("data.csv", "w");

    for($p=1;$p<5;$p++){
      $html = file_get_contents("取得したいURL");
        $title_num = count(phpQuery::newDocument($html)->find("h3")->find(".rvw-item__rst-name"));
        for($i=0;$i<$title_num;$i++){
            $title[$p][$i] = phpQuery::newDocument($html)->find("h3")->find(".rvw-item__rst-name:eq($i)")->text();
            $price[$p][$i] = phpQuery::newDocument($html)->find(".c-rating__val:eq($i)")->text();
            fputs($file, $title[$p][$i].", ".$price[$p][$i]."\n");
        }
        sleep(3);
    }

    fclose($file);
?>

bannerAds