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

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

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

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

Q&A

解決済

1回答

1370閲覧

PHPスクレイピングの質問です

take_5996

総合スコア16

PHP

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

0グッド

0クリップ

投稿2017/11/25 05:08

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>&nbsp;</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
上記のようなコードがでていました。

どこをどのように訂正すればすべての項目が出力されるのか教えていただけないでしょうか。

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

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

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

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

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

umyu

2017/11/25 14:04

2ch今は5chでしょうか、スクレイピングによるアクセスは許可がいった記憶がありますが、その点大丈夫でしょうか?
guest

回答1

0

ベストアンサー

質問本文とは直接の関係性は低いかもしれませんが: Web ページの情報を取得するライブラリを使用して、コードを組み上げてみると良いかもしれません(そして それが分からなければ途中のコードとともに質問する)

「PHP Scraper」で検索してみたところ、Goutte が一番にヒットしました
きっと、多くの人が利用しているのかもしれません

他にも様々なライブラリがあるので、composer を介して自コードに組み込んでみるのもいいかもしれません
(対象とするWeb サイトによっては...JavaScript で要素の取得・書き換えをする場合...、たとえばSelenium を利用して、Web ブラウザを自動操作するコードを書く必要があるかもしれません)

簡単に調べてみましたが、何か参考になれば幸いです

Links

投稿2017/11/25 10:01

gouf

総合スコア2321

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

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

take_5996

2017/11/25 12:16

回答を頂きましてありがとうございます。本日初めて登録して質問させて頂いたのですが、かなりの勢いで低評価がついてあせりました。今後は質問の仕方も勉強してから投稿させていただきます。頂いた回答をみてじっくりプログラミングの勉強させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問