7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

株式会社デジタルクエスト エンジニアAdvent Calendar 2019

Day 22

LaravelでシンプルなWebスクレイピング

Last updated at Posted at 2019-12-21

#まえおき
RPA(ロボティック・プロセス・オートメーション)って流行ってますよね。
色んな所でお客さんから「RPAを使って業務の自動化をしたい」と言われてるかと思います。

最近、同じようなことをお客さんから言われていましたが
内容を聞いてみると「特定のWebサイトを開いて一部の内容を取得する」みたいな
Httpリクエストを投げてDOMを検索するだけで十分な作業だったりしました。

という訳で今回は以下の作業内容をWebスクレイピングでやってみようと思います。

①Qiitaで特定のキーワードで記事検索
②検索結果の一番上の記事を開く
③開いた記事の本文を取得

使用するのはLaravel v5.8です。

#前準備

HTTPクライアントのライブラリのGuzzleを使いたいので
Composerを使ってインストールします
(通信さえできればcURLでもいいです)

composer require guzzlehttp/guzzle

#コード

routes/web.php
Route::get('/', function () {
    $client = new \GuzzleHttp\Client([
        'base_uri' => 'https://qiita.com/'
    ]);
    $dom = new DOMDocument();

    // Qiitaで特定のキーワードで記事検索(今回は「RPA」でやります)
    $res = $client->request('GET', 'search?q=RPA');

    // 開いたページから一番上の記事のリンクを取得
    @$dom->loadHTML($res->getBody()->getContents());
    foreach( $dom->getElementsByTagName("h1") as $searchNode ){
        if( "searchResult_itemTitle" ==  $searchNode->getAttribute('class') ){
            $firstArticlelink = $searchNode->getElementsByTagName("a")->item(0)->getAttribute('href');
            break;
        }
    }

    // 記事を開いて本文を取得
    $res = $client->request('GET', $firstArticlelink);
    @$dom->loadHTML($res->getBody()->getContents());
    foreach( $dom->getElementsByTagName("div") as $searchNode ){
        if( "p-items_article" ==  $searchNode->getAttribute('class') ){
            $articleBody = $searchNode->nodeValue;
            break;
        }
    }
    return $articleBody;
});

#DOMXPathを使ったやり方

要素の検索あたりは DOMXPath を使うと
もう少しスッキリ書けます(使い方が若干クセがあるかも)

routes/web.php
Route::get('/', function () {
    $client = new \GuzzleHttp\Client([
        'base_uri' => 'https://qiita.com/'
    ]);
    $dom = new DOMDocument();

    // Qiitaで特定のキーワードで記事検索(今回は「RPA」でやります)
    $res = $client->request('GET', 'search?q=RPA');

    // 開いたページから一番上の記事のリンクを取得
    @$dom->loadHTML($res->getBody()->getContents());
    $xpath = new DOMXPath($dom);
    $firstArticlelink = $xpath->query('//*[@class="searchResult_itemTitle"][1]/a')->item(0)->getAttribute('href');

    // 記事を開いて本文を取得
    $res = $client->request('GET', $firstArticlelink);
    @$dom->loadHTML($res->getBody()->getContents());
    $xpath = new DOMXPath($dom);
    $articleBody = $xpath->query('//*[@class="p-items_article"]')->item(0)->nodeValue;
    return $articleBody;
});

#まとめ
意外と簡単に取得できました。

RPAツールを使うまでもない簡単な情報収集系の作業は
こういう感じでも実現できそうです。

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?