#まえおき
RPA(ロボティック・プロセス・オートメーション)って流行ってますよね。
色んな所でお客さんから「RPAを使って業務の自動化をしたい」と言われてるかと思います。
最近、同じようなことをお客さんから言われていましたが
内容を聞いてみると「特定のWebサイトを開いて一部の内容を取得する」みたいな
Httpリクエストを投げてDOMを検索するだけで十分な作業だったりしました。
という訳で今回は以下の作業内容をWebスクレイピングでやってみようと思います。
①Qiitaで特定のキーワードで記事検索
②検索結果の一番上の記事を開く
③開いた記事の本文を取得
使用するのはLaravel v5.8です。
#前準備
HTTPクライアントのライブラリのGuzzleを使いたいので
Composerを使ってインストールします
(通信さえできればcURLでもいいです)
composer require guzzlehttp/guzzle
#コード
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 を使うと
もう少しスッキリ書けます(使い方が若干クセがあるかも)
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ツールを使うまでもない簡単な情報収集系の作業は
こういう感じでも実現できそうです。