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

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

ただいまの
回答率

91.36%

  • PHP

    15209questions

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

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

受付中

回答 1

投稿 2017/11/25 14:08

  • 評価
  • クリップ 0
  • VIEW 94

take_5996

score 0

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2017/11/25 15:00

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • umyu

    2017/11/25 23:04

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

    キャンセル

回答 1

+1

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

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

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

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

 Links

投稿 2017/11/25 19:01

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/25 21:16

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

    キャンセル

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

ただいまの回答率

91.36%

関連した質問

同じタグがついた質問を見る

  • PHP

    15209questions

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