PHPでスクレイピングを勉強中のほぼ初心者です。
スクレイピングのプログラムをお借りして(自分で作成したプログラムではない)実際に実行してみましたが思ったような結果が表示されませんでした。
実行環境はオンラインのPaiza.ioとXamppのローカル環境です。両方試しました
まず下記はスクレイピング対象の2ちゃんねるのソースです。
<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=Shift_JIS" /> <meta http-equiv="Content-Script-Type" content="application/javascript" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta name="viewport" content="initial-scale=1" /> <title></title> <script type="text/javascript" src="http://2ch.sc/js/index.js" defer="defer"></script> <script type="text/javascript" src="http://2ch.sc/js/read.js" defer="defer"></script> <style type="text/css">/*<![CDATA[*/@media only screen and (max-width: 640px) {
html { font-size: 60%; }
input, select, textarea { font-size: inherit; }
input[type=checkbox] { height: 1em; margin: 0; }
label span { display: none; }
}
body { background-color: #EFEFEF; color: black; word-break: break-word; overflow-wrap: break-word; }
div#header { margin-bottom: 1em; }
div#header img { width: 400px; height: 15px; border-width: 0; max-width: 98%; }
div#alertMsg { margin: 1px; padding: 1px; }
h1#title { color: red; font-size: larger; font-weight: normal; margin: -.5em 0 0; }
dt span { color: green; }
dt span.id { color: black; }
dd { margin-bottom: 1em; }
span#datSize { color: red; font-family: "Arial"; font-weight: bold; padding: 2px; }
div#newResLink { text-align: center; }
textarea { white-space: pre; /* for browsers that don't support vw */ max-width: 98%; max-width: 95vw; }
/]]>/</style>
</head><body> <div id="header"> <a href="http://2ch.sc/"><img src="about:blank" alt="2ちゃんねるの掟とは?" /></a> </div> <div><span style="float:left;"> <a href="http://2ch.sc/">2ちゃんねる</a> <a href="javascript:void 0;">■掲示板に戻る■</a> <a href="javascript:void 0;">全部</a> <a href="javascript:void 0;">1-</a><span id="chunkedLinks"></span> <a href="javascript:void 0;">最新50</a> <small>(Alt+Click: クイックモード)</small> </span> <span style="float:right;"> [PR]<a href="http://info.2ch.sc/guide/">2ちゃんねるガイド</a>[PR] </span> </div> <div id="alertMsg"></div> <hr style="background-color:#888;color:#888;border-width:0;height:1px;position:relative;top:-.4em;" /> <h1 id="title">読み込み中。。。</h1> <dl id="thread"> <dt>1 :<span><b>[読み込み中。。。]</b></span>:[読み込み中。。。]</dt> <dd>[読み込み中。。。] <p>(正常に表示されない場合は、URL 中の read.cgi を read.so に変えて下さい。<br /> あるいは、掲示板トップにある「read.cgi モード切替」のリンクから「CGI モード」に設定して下さい)</p> <noscript><p><em>JavaScript が有効でないと見られません。。。</em></p></noscript></dd> </dl> <div> <hr /> <small style="float:right;"> <span id="datSize">0 kB</span> <a href="http://info.2ch.sc/wiki/?read.html" title="read.html - いきいき Wiki">解説</a> </small> <div id="newResLink"><span><a href="javascript:void 0;">リロード[Ctrl+R]</a> <a href="javascript:void 0;">新着レスの表示</a> / </span><small><a href="javascript:void 0;">スレッド保存はここを右クリック</a></small> <hr /></div> <a href="javascript:void 0;">掲示板に戻る</a> <a href="javascript:void 0;">全部</a> <a href="javascript:void 0;">前100</a> <a href="javascript:void 0;">次100</a> <a href="javascript:void 0;">最新50</a> <small>(Alt+Click: クイックモード)</small></div> <form id="postForm" action="javascript:void 0;"><div> <input type="submit" name="submit" value="書き込む" /> <label><span>名前: </span><input name="FROM" size="19" /></label> <label><span>E-mail<span style="font-size:xx-small;"> (省略可) </span>: </span><input name="mail" size="19" /></label><br /> <textarea name="MESSAGE" cols="70" rows="5"></textarea> <input type="hidden" name="bbs" /> <input type="hidden" name="key" /> <input type="hidden" name="time" /> </div></form> </body></html>2ちゃんねるソース終了
続いて下記は実行したソースコードです
<?php //下記URL【急騰】今買えばいい株9296【金はゴミ】 $url = "http://anago.2ch.sc/test/read.cgi/stock/1511346531/"; $raw_contents = file_get_contents($url); $raw_contents = mb_convert_encoding($raw_contents, "UTF-8", "SJIS"); // タイトル取得 preg_match('/<title>.+?</title>/', $raw_contents , $match_title); $title = removeStr($match_title[0], array("<title>", "</title>")); echo($title. "\n"); // コメント取得 mb_ereg('<dl class=\"thread\">(\n|.)*?</dl>', $raw_contents, $match_dl); preg_match_all('/<dt>(\n|.)*?<br><br>/', $match_dl[0] , $match_dt); foreach($match_dt[0] as $dt){ // コメントNo preg_match('/<dt>\d+/', $dt , $match_comment_no); $comment_no = removeStr($match_comment_no[0], array("<dt>")); echo($comment_no. "\n"); // ハンドルネーム preg_match('/<b>.*?</b><//', $dt , $match_name); $name = removeStr($match_name[0], array("<b>", "</b></")); echo($name. "\n"); // 投稿時間 preg_match('/\d{4}/\d{2}/\d{2}(.*?)\s\d{2}:\d{2}:\d{2}/', $dt , $match_time); $time = $match_time[0]; echo($time. "\n"); // ID preg_match('/ID:.*<dd>/', $dt , $match_id); if(isset($match_id[0])){ $id = removeStr($match_id[0], array("ID:", "<dd>")); } else { $id = ""; } echo($id. "\n"); // コメント preg_match('/<dd>.*\s<br><br>$/', $dt , $match_contents); $comment = removeStr($match_contents[0], array("<dd> ", " <br><br>")); $comment = str_replace("<br>", "<br/>", $comment); echo($comment. "\n"); } exit(); function removeStr($data, $remove_array){ foreach($remove_array as $remove_data){ $data = str_replace($remove_data, "", $data); } trim(mb_convert_kana($data, "s")); return $data; } ?>タイトル、コメント、コメントNO、ハンドルネーム、投稿時間、IDのすべてがちゃんと出力されるかと思ったのですが、タイトルのみ→【急騰】今買えばいい株9296【金はゴミ】しか出力されませんでした。Paiza.ioとXammpローカル環境どちらもです。
エラーコードはXammpのみでNotice: Undefined offset: 0 in C:\xampp\htdocs\2channeru.php on line 13
上記のようなコードがでていました。
どこをどのように訂正すればすべての項目が出力されるのか教えていただけないでしょうか。
回答1件
あなたの回答
tips
プレビュー