使用PHP进行网络爬虫
背景
在开发某个Web应用程序时,客户要求使用他们自己管理的另一个网站的数据。由于这些数据不是以数据库的形式管理,而是直接写在HTML文件中,所以需要使用PHP进行网页抓取来获取这些数据的内容。
使ったのはGoogleが提供しているphpQuery(※)なるもの。
そやつを使うと想像以上に簡単にスクレイピングができました。
(※)GoogleでなくTobiasz Cudnikという方が作られたもののようです。
假设
今回データを取得したいサイトのHTML構造(一部)は以下の通り。
・・・
<div class="info">
<h3>hoge</h3>
<div class="txt">
<p>hoge_text</p>
</div>
</div>
<div class="info">
<h3>huge</h3>
<div class="txt">
<p>huge_text</p>
</div>
</div>
<div class="info">
<h3>hoga</h3>
<div class="txt">
<p>hoga_text</p>
</div>
</div>
・・・
やった内容
安装和配置phpQuery
从Google Code下载并安装php文件。
(此次使用的是phpQuery-0.9.5.386-onefile.zip)
インストールしたZipファイルを解凍すると以下ファイルが入っているはず。
- phpQuery-onefile.php
创建一个用于运行phpQuery的执行文件
接下来,创建一个用于执行已安装的phpQuery的文件(scraping.php)。
在该文件中,使用require_once语句加载phpQuery-onefile.php。
<?php
require_once("./phpQuery-onefile.php");
$target_site = file_get_contents("データを取得したいサイトURL");
$file = fopen("./result.php", "a"); // 取得したデータを書き込む用ファイル
$html = phpQuery::newDocument($target_site); // $target_siteのDOM取得
$info = $htmlDOM->find("h3")->text(); // 今回h3タグの中身を取得したい
fputs($file, $info); // 取得したデータを$fileに書き込み
fclose($file);
当使用此scraping.php时,应该在result.php中显示以下内容。
hoge
huge
hoga
他要素のデータも併せて取得したい場合
ただ今回はh3タグのデータだけでなく、h3タグの兄弟要素(pタグ)のデータも合わせて取得したいので上記コードに手を加える。
幸いなことに、データを取得したいサイトは前提にあるような構成になっていたのでループ処理にてデータを取得する。
ついでに取得したデータを使いやすいよう配列型になるように変更。
<?php
require_once("./phpQuery-onefile.php");
$target_site = file_get_contents("データを取得したいサイトURL");
$file = fopen("./result.php", "a");
// ↓ここから変更
$info_count = count(phpQuery::newDocument($target_site)->find("div.info > h3"));
for($i = 0; $i < $info_count; $i++) {
$htmlDOM = phpQuery::newDocument($target_site);
$info_title[] = $htmlDOM->find("div.info > h3:eq($i)")->text();
$info_text[] = $htmlDOM->find("div.txt > p:eq($i)")->text();
fputs($file, $i . ' => [' . "\n" . '"title" => "' . $info_title[$i] . '",' . "\n" . '"text" => "' . $info_text[$i] . '",' . "\n" . '],' . "\n");
}
fclose($file);
当您执行scraping.php时,应该会在result.php中记录如下内容。
0 => [
"title" => "hoge",
"text" => "hoge_text",
],
1 => [
"title" => "huge",
"text" => "huge_text",
],
2 => [
"title" => "hoga",
"text" => "hoga_text",
],