Laravelで2ちゃんねるのスレッドを取得する【PHP】

Page : ( 3 / 3 )


少し長くなりましたが、完成です。
実際に使用する場合は下記のようになります。

// some controller

use App\Repositories\NichanRepository;

public function test()
{
  $repository = new NichanRepository();
  // 2ch.scのURL
  $url = 'http://awabi.2ch.sc/***';

  // textで表示
  return $repository->execute($url);

  // htmlタグで表示
  // return $repository->execute_html($url);

}


Demoページ


フルコード

namespace App\Repositories;

// app/Repositories/nichanRepository.php

/* LaravelやLumen以外で使う場合に必要
* collect($collection)が Collection::make($collection)になる
*/
// use Illuminate\Support\Collection


/**
 * Interface nichanRepositoryInterface
 * @package App\Repository
 */
interface nichanRepositoryInterface
{
    // textとして表示
    public function execute($url);

    // htmlタグで表示
    public function execute_html($url);


}

/**
 * Class NichanRepository
 * @package App\Repository
 */
class NichanRepository
    implements nichanRepositoryInterface
{
    // htmlタグを除去して表示
    public function execute($url)
    {
        return $this->tagRemove($url);

    }

    // htmlタグとして表示
    public function execute_html($url)
    {
        return $this->converter($url);

    }


    // htmlタグを除去
    private function tagRemove($url)
    {
        return collect($this->threadHandler($url))
                  ->map(function ($item) {
                          return strip_tags($item);
                          });
    }


    // タグの置換
    private function converter($url)
    {
        return str_replace(
                    $this->_keywords(),
                    $this->_replaceWords(),
                    $this->threadHandler($url)
                  );

    }

    // 置換したいタグ
    private function _keywords()
    {
        return ['<dt>', '<dd>', '<br><br>', '&gt;&gt;'];

    }

    // 置換するタグ
    private function _replaceWords()
    {
        /* ここでタグにcssクラスを当てることが可能
        * example
        * ['<dt class='redColor'>', '<dd class='greenColor'>', '', ''];
        */
        return ['<dt>', '</dt><dd>', '</dd>', '&gt;&gt;'];

    }

    // スレに関係のない不要なhtmlタグを取り除く
    private function threadHandler($url)
    {
        return collect($this->getThread($url))
            ->filter(function ($item) {
                // <dd>タグが含まれていない配列を除去
                return str_contains($item, '<dd>');
                }
            )->toArray();

    }

    // 元となるスレのページを取得
    private function getThread($url)
    {
        // スレを取得
        $raw_contents = file_get_contents($url);

        // SJISからUTF-8に変換
        $content = mb_convert_encoding($raw_contents, "UTF-8", "SJIS");

        // 改行文字をベースに配列
        return explode("\n", $content);

    }

}

 

今回は2ch.scを元に説明しましたが、
Webスクレイピングはさほど難しいことではないので、機会があれば参考にしてください。

又、サイトによっては迷惑が掛かることになるかもしれないので、注意してください。

この記事のカテゴリ
プログラミング

この記事に付けられているタグ



その他の運営サービス

最新の記事