様々なサイトでPHPでスクレイピングをしたいと考えています。

例えば
http://www.find-job.net/startup/10-js-css-compressors

http://www.ibm.com/developerworks/jp/web/library/wa-objectorientedjs/index.html?ca=drs-
のサイトなどです。

その中でも、そのページのコンテンツのメインとなる記事の文章部分を取得してきたいのですが、どうすればよいのでしょうか。

※記事の文章文=フッターやサイドにある別のページへのリンクではなく、
そのWebページを読むときにメインで読むところの文章です

回答の条件
  • 1人20回まで
  • 登録:
  • 終了:2013/10/31 20:29:52

ベストアンサー

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

(1)はじめに

ウェブスクレイピングするならば…、
そのサイトの構成やページの構成を調べるところから始めます。

(2)ツール

昔はソースコードを目で追いかけたものですが、
最近はブラウザに便利な機能が備わっていて、
おおよその目安を付けやすくなっています。

たとえば、IEには「F12 開発者ツール」があります。
ツールメニューからも呼び出せますし、F12キーを押しても呼び出せます。
「開発者ツール」の検索機能(Ctrlキー+Bキー)をスタートさせて、
構造を知りたい箇所をクリックすれば、
ソースコードの該当する箇所が反転表示されます。
http://msdn.microsoft.com/ja-jp/library/ie/gg589512%28v=vs.85%29.aspx

Firefoxには「インスペクタ」があります。
調べたい箇所を右クリックして「要素を調査」とするだけで、
ソースコードが表示され、該当する箇所が反転表示されます。
https://developer.mozilla.org/ja/docs/Tools/Page_Inspector

どのようなツールを使うのが便利なのかはその人によりますので、
現在使っている環境に合わせたものからやってみると良いでしょう。
(私はFirefoxアドオンのFirebugを今も主に使っています。)

(3)構造解析

実際にツールで探した箇所を抜き出してみたのが下記です。
※本文は長くなるので省略しています。

<div class="ctL">
    <div id="post-3102" class="post-3102 post type-post status-publish format-standard hentry category-1"> 
        <div class="title">
            タイトル
        </div>
        <div class="articleCt">
            本文(ソーシャルリンクも含まれる)
        </div>
    </div>
</div>
<div id="ibm-content-main">
    <div class="ibm-container">
        本文(ソーシャルリンクも含まれる)
    </div>
</div>

(4)phpプログラミング

私は回線の細かった時代(Kbps)の名残で、読み取りながらパーツを分離し、
正規表現で細かく抜き出すことが多いのですが、
パソコンも高速になり、回線もMbpsが当然の現代では、
構文解析のクラスを使う方が賢いでしょう。

phpにはいくつかのクラスがありますが有名どころは次の2つです。
・HTML、XML問わずに使えるDOMDocumentクラス
http://php.net/manual/ja/class.domdocument.php
・XMLに特化したSimpleXML
http://www.php.net/manual/ja/book.simplexml.php

さて、
「1人20回まで」となっていますが、
私の仕事ではないので、そこまでのお付き合いはできません。
あとは自助努力してください。

id:windofjuly

>要素の調査まではできています。

それならそうと書いておいてください。
互いに長々と無駄な時間を過ごしてしまいました。
(whitedevさんのこれまでの質問を見直し、
そして、どのように答えたら良いかを考え、サンプルを用意し、
回答を書き上げるまで20分ほど要しました…。
「あんたに頼んだわけじゃない」と言われればそれまでですが…。)

>汎用性を持ったスクレイピングはできないのでしょうか

共通形式での配信を行うATOMやRSSとは違って、
共通性はありませんので、
「はじめに」書いたように調べることから始めます。

2013/10/31 00:07:26
id:whiterdev

申し訳ありませんでした。
自分がどこまで把握しているかを、載せておくべきでした。

ただ、回答をいただいたことで自分の中でぼんやりとこうやればいいんじゃないかというところが、裏付けできたためすごく参考になりました。

ありがとうございます。

2013/10/31 20:28:38

その他の回答1件)

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149ここでベストアンサー

(1)はじめに

ウェブスクレイピングするならば…、
そのサイトの構成やページの構成を調べるところから始めます。

(2)ツール

昔はソースコードを目で追いかけたものですが、
最近はブラウザに便利な機能が備わっていて、
おおよその目安を付けやすくなっています。

たとえば、IEには「F12 開発者ツール」があります。
ツールメニューからも呼び出せますし、F12キーを押しても呼び出せます。
「開発者ツール」の検索機能(Ctrlキー+Bキー)をスタートさせて、
構造を知りたい箇所をクリックすれば、
ソースコードの該当する箇所が反転表示されます。
http://msdn.microsoft.com/ja-jp/library/ie/gg589512%28v=vs.85%29.aspx

Firefoxには「インスペクタ」があります。
調べたい箇所を右クリックして「要素を調査」とするだけで、
ソースコードが表示され、該当する箇所が反転表示されます。
https://developer.mozilla.org/ja/docs/Tools/Page_Inspector

どのようなツールを使うのが便利なのかはその人によりますので、
現在使っている環境に合わせたものからやってみると良いでしょう。
(私はFirefoxアドオンのFirebugを今も主に使っています。)

(3)構造解析

実際にツールで探した箇所を抜き出してみたのが下記です。
※本文は長くなるので省略しています。

<div class="ctL">
    <div id="post-3102" class="post-3102 post type-post status-publish format-standard hentry category-1"> 
        <div class="title">
            タイトル
        </div>
        <div class="articleCt">
            本文(ソーシャルリンクも含まれる)
        </div>
    </div>
</div>
<div id="ibm-content-main">
    <div class="ibm-container">
        本文(ソーシャルリンクも含まれる)
    </div>
</div>

(4)phpプログラミング

私は回線の細かった時代(Kbps)の名残で、読み取りながらパーツを分離し、
正規表現で細かく抜き出すことが多いのですが、
パソコンも高速になり、回線もMbpsが当然の現代では、
構文解析のクラスを使う方が賢いでしょう。

phpにはいくつかのクラスがありますが有名どころは次の2つです。
・HTML、XML問わずに使えるDOMDocumentクラス
http://php.net/manual/ja/class.domdocument.php
・XMLに特化したSimpleXML
http://www.php.net/manual/ja/book.simplexml.php

さて、
「1人20回まで」となっていますが、
私の仕事ではないので、そこまでのお付き合いはできません。
あとは自助努力してください。

id:windofjuly

>要素の調査まではできています。

それならそうと書いておいてください。
互いに長々と無駄な時間を過ごしてしまいました。
(whitedevさんのこれまでの質問を見直し、
そして、どのように答えたら良いかを考え、サンプルを用意し、
回答を書き上げるまで20分ほど要しました…。
「あんたに頼んだわけじゃない」と言われればそれまでですが…。)

>汎用性を持ったスクレイピングはできないのでしょうか

共通形式での配信を行うATOMやRSSとは違って、
共通性はありませんので、
「はじめに」書いたように調べることから始めます。

2013/10/31 00:07:26
id:whiterdev

申し訳ありませんでした。
自分がどこまで把握しているかを、載せておくべきでした。

ただ、回答をいただいたことで自分の中でぼんやりとこうやればいいんじゃないかというところが、裏付けできたためすごく参考になりました。

ありがとうございます。

2013/10/31 20:28:38
id:whiterdev

要素の調査まではできています。

しかしながら、各サイトで本文が書かれているところ(たとえばdiv class)が変わってしまうので、汎用性がありません。

汎用性を持ったスクレイピングはできないのでしょうか。

なお、構文解析にはsimple_html_dom.phpというパーサーを使用してはいます。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません