スクレイピングツールの開発方法XPATHやpreg_replaceを用いて情報を思うままに整形する。

スクレイピングするページを決めたならば、そこから必要な情報だけ取り込まなければいけません。スクレイピングするページを決めたならば、そこから必要な情報だけ取り込まなければいけません。
その際、HTMLをそのまま取得しても、必要な部分を取れなくはありませんが、やや大変です。
例えば画像一覧を取得したいだけならば、

preg_match_all("\<img [^>]*src=[\"\'](.*)[\"\'][^>]*\>",$html,$matches);

の要領で取れるでしょう。
しかし、いちいちpreg_match文を書くのもなかなか厄介です。
そこで、スクレイピングの強い味方である、XPATHを使用します。
XPATHは、XML形式の文章から特定の場所の中身を取得する事が出来る物です。
XMLとは、feedのような形式で、<○○>
で囲まれた部分をRSSリーダーなどに読み込ませるように出来る形式です。
一つ前の記事では、feedから記事を取得する際に、
foreach($xml->item as $item)
のような形で回しました。
これは、

<pre> <item> <title>F5ツールの開発方法 jsshellでの自動化ツール例</title>
 <link>http://xn--z8j2b8ne2c4a7ad6c3146j.jp.net/2017/09/17/f5%e3%83%84%e3%83%bc%e3%83%ab%e3%81%ae%e9%96%8b%e7%99%ba%e6%96%b9%e6%b3%95-jsshell%e3%81%a7%e3%81%ae%e8%87%aa%e5%8b%95%e5%8c%96%e3%83%84%e3%83%bc%e3%83%ab%e4%be%8b/</link>
 <comments>http://xn--z8j2b8ne2c4a7ad6c3146j.jp.net/2017/09/17/f5%e3%83%84%e3%83%bc%e3%83%ab%e3%81%ae%e9%96%8b%e7%99%ba%e6%96%b9%e6%b3%95-jsshell%e3%81%a7%e3%81%ae%e8%87%aa%e5%8b%95%e5%8c%96%e3%83%84%e3%83%bc%e3%83%ab%e4%be%8b/#respond</comments>
 <pubDate>Sun, 17 Sep 2017 09:09:37 +0000</pubDate>
 <dc:creator><![CDATA[netbusinessfree]]></dc:creator>
 <category><![CDATA[初心者向け]]></category>
 <category><![CDATA[google chrome]]></category>
 <category><![CDATA[jsshell]]></category>
 <category><![CDATA[ランキング操作]]></category>
 <category><![CDATA[自動クリックツール]]></category>
 <category><![CDATA[逆アクセスランキング]]></category>

 <guid isPermaLink="false">http://xn--z8j2b8ne2c4a7ad6c3146j.jp.net/wordpress/?p=12</guid>
&nbsp;
 &nbsp;
 &nbsp;
 &nbsp;
 &nbsp;
 &nbsp;
 &nbsp;
 &nbsp;
 </item>
</pre>

のようになっている部分の
で囲まれた部分を取得しています。
HTML文章も、XML化してしまえば同じように取得が可能です。

 private function html_to_xml($url_html, $charset = null, $replacearray = array()) {
 $html = @file_get_contents($url_html, false, $context);

 if ($html === false) {
 // create curl resource 
 $ch = curl_init();

// set url 
curl_setopt($ch, CURLOPT_URL, $url_html);

//return the transfer as a string 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows;
 U;
 Windows NT 5.1;
 en-US;
 rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');

// $output contains the output string 
$html = curl_exec($ch);

// close curl resource to free up system resources 
curl_close($ch);

 }
//空要素をエスケープ 
$html = str_replace(array("<br />", "<br>", "<br/>", "<br >", "<BR>", "<BR />", "<BR/>", "<BR >"), "\n", $html);

if (count($replacearray) > 0) { foreach ($replacearray as $replace) { $html = preg_replace($replace["from"], $replace["to"], $html);
 } } $html = str_replace("&nbsp;
", " ", $html);

 $html = preg_replace("/<!--(.*?)-->/", "$1", $html);

 if ($charset == null) {
 $min_pos = 99999999999999;
 //十分に大きな数字 $from_encoding = 'UTF-8';
 //デフォルト foreach (array('UTF-8', 'SJIS', 'EUC-JP', 'ASCII', 'JIS', 'ISO-2022-JP') as $charcode) { if ($min_pos > stripos($html, $charcode, 0) && stripos($html, $charcode, 0) > 0) { $min_pos = stripos($html, $charcode, 0);
 $from_encoding = $charcode;
 } } } else { $from_encoding = $charset;
 } $html = mb_convert_encoding($html, 'HTML-ENTITIES', $from_encoding);

 $domDocument = new DOMDocument();
 libxml_use_internal_errors(true);
 $domDocument = new DOMDocument();
 @$domDocument->loadHTML($html);
 $xmlObject = @simplexml_import_dom($domDocument);
 if (!$xmlObject) { $this->errors("ページの書式が不正です。");
 return false;
 }
 return $xmlObject;

 }

サンプルですが、このような内容で、XML化します。途中にある、brを\nに置き換える部分は、BR自体もタグとして認識される為、最初に変更しておかないと全ての文章にBRのたぐリストが生成されてしまう為です。また、必要に応じて、fontや、spanタグなども消すかエスケープした方がよいでしょう。XMLは例えば次のような文章の場合、取得する際に順番が異なって出力されます。

<p>サンプルですが、このような内容で、XML化します。途中にある、<font color="red">brを\nに置き換える部分は</font>
、<span>BR自体もタグとして認識される為</span>
、最初に変更しておかないと全ての文章にBRのたぐリストが生成されてしまう為です。</p>

ここのPタグ内を取得した場合、

サンプルですが、このような内容で、XML化します。途中にある、、、最初に変更しておかないと全ての文章にBRのたぐリストが生成されてしまう為です。

Pタグ以下のfontタグ内とSPANタグ内を検索して始めて以下の部分が得られます。

brを\nに置き換える部分は
BR自体もタグとして認識される為

そのため、エスケープ処理は必要に応じて行う必要があります。
ここで得た物が、XML形式として変更したHTMLです。
XPATHは、チートシートがあります。それを参考に組み立てていきましょう。「 http://aoproj.web.fc2.com/xpath/XPath_cheatsheets_v2.pdf 」
例えば、

内にある物を探す場合、

$xpath=$xml->xpath("../div[class='article']")

とすると、article内の情報が入った物が得られます。ここからさらにタイトル等へたどり着く形で、本文やタイトルを得ることができます。2chのスレッドや掲示板サイト等の場合は、この形で書き込み全てをリスト化できます。2chのまとめサイトなどを作る際は、まとめツールはこうした仕組みを利用しています。(datの平文を整形する場合もありますが)

さて、取得してきたデータを、自分のサイトのコンテンツにしてしまうには。他のブログの記事を著作権がばれないように変更してしまうには。
やはりそのままの文章ではSEO上もよろしくありません。
なので、preg_replaceを用いて語尾などを変更してしまうのも一つの手です。特定のキーワード、タグ付けしたキーワードを強調する事も可能です。

$html=preg_replace([○○,○○],[○○,○○],$html);

の要領で、どんどん変更してみましょう。
もちろん、著作権は重要です。

自己責任の上、自分の制作物となりえる範囲に整形しましょう。

ビットコインを毎日受け取る最新HYIP特集

PR:BitConnect

体感:一年以上継続中

月利:最大月利40%、日利0〜1.5%周辺
期間:120日〜299日
最小投資単位:$100
参加する

PR:Bitpetite

体感:比較的安心

日利:3.60%〜4.5%
期間:6週間〜9週間
最小投資単位:0.005ビットコイン
参加する

PR:BitDragon

体感:潰れる前提で

日利:9%〜12%
元本:しない
期間:永遠に
最小投資単位:0.001ビットコイン
参加する
HYIPは高リターン高リスク商材ですので、リスク管理を各自行ってください。

新着記事

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトについて

このサイトはネットビジネスで稼ぐとなっていますが、筆者本人はネットビジネスは嫌いです。
「ネットビジネスで一緒にビジネスをしましょう!」と、言葉では説明しているものの、あくまでも「貴方はお客様です」。
なので、本当にネットでビジネスをするとはどういう事かをここで書いていければなと思います。
連絡はこちらまでinfo@omorovie.com