webスクレイピング
enebularの公式プライベートノード、web-scraping
はwebスクレイピング機能を提供しています。
webスクレイピング機能では、フローエディターまたはクラウド実行環境からヘッドレスブラウザ制御ライブラリPuppeteer
を用いたwebスクレイピングを実行できます。
このチュートリアルでは、プライベートノードとサンプルフローをインポートし、フローを実行してウフルのコーポレートサイトにあるニュースページからニュースのタイトルとリンクのリストを取得します。(所要時間10分)
※1 webスクレイピング機能はエンタープライズプラン、トライアルプラン限定の機能です。
※2 webスクレイピング機能はエージェント実行環境、enebular Editorからは利用できません。
Puppeteerについてのより詳細な情報は、Puppeteer公式ドキュメントを参照してください。
Table of Contents
プライベートノードのインポート
Discover Assetsから、webスクレイピングを実行するためのプライベートノード
をインポートする手順を説明します。
enebularの画面右上にあるDiscover Assetsをクリックしてください。
以下の手順でプライベートノードweb-scraping
を検索します。
- アセットの種類で
Private Node
を選択します - 検索バーに
web-scraping
と入力します - プルダウンから
名称
を選択します
検索結果に表示されるenebular
のラベルがついたプライベートノードをクリックしてください。
インポート
をクリックします。
インポート先のプロジェクトを選択し、インポート
をクリックしてください。これでプライベートノードのインポートは完了です。インポート先として選択したプロジェクトのアセット一覧画面で、プライベートノードが追加されたことを確認してください。
サンプルフローのインポート
インポートしたプライベートノード利用してwebスクレイピングを行うサンプルフローをプロジェクトにインポートする方法を説明します。
このサンプルフローはDiscover Assets
に公開しています。
サンプルフローを開く
サンプルフローについて説明します。
スクレイピング実行用コード
インポートしたフローを開きます。
webスクレイピング
と表記されているノードを開くと、Puppeteer用コード
とラベルのついたエディターが表示されます。
エディターにはウフルのコーポレートサイトにあるニュースページにアクセスし、最新のページに表示されているニュースのタイトルとリンクを取得するコードが入力されています。
const URL = "https://uhuru.co.jp/news/" // アクセスするURL
const SELECTOR = "#main > div > div.ly_under_contents > div > div.bl_newsList.hp_mt55.hp_sp_mt50 > div > div.bl_newsList_title > a" // セレクター
// 関数の定義
const scrapeNews = async () => {
// ブラウザーの起動
const browser = await puppeteer.launch({
args: ['--no-sandbox', '--single-process']
})
// ウフルニュースページへのアクセス
const page = await browser.newPage()
await page.goto(URL)
// ニュース一覧に存在するすべてのaタグからテキストとリンクを取得
const newsItems = await page.$$eval(
SELECTOR,
(elements) =>
elements.map((element) => ({
title: element.textContent,
link: element.href
}))
)
// ブラウザーの終了
await browser.close()
// 結果を返す
return newsItems
}
// 関数の実行
scrapeNews()
ブラウザーの起動
// ブラウザーの起動
const browser = await puppeteer.launch({
args: ['--no-sandbox', '--single-process']
})
puppeteerでブラウザーを起動します。ここで設定されている起動オプションは以下の通りです。
- --no-sandbox: Sandboxモードの無効化
- puppeteerが行う操作の制限を解除します
- --single-process: シングルプロセスモードでの起動
- すべてのページが同一のプロセスで実行されます
ブラウザーが正常に起動しない場合があるため、上記を必ず設定してください。
webページへのアクセス
// ウフルニュースページへのアクセス
const page = await browser.newPage()
await page.goto(URL)
page
オブジェクトを宣言し、ブラウザーのタブを操作できるようにします。
page.goto()
メソッドにURLを渡すことで、任意のページにアクセスできます。
テキストとリンクの取得
// ニュース一覧に存在するすべてのaタグからテキストとリンクを取得
const newsItems = await page.$$eval(
SELECTOR,
(elements) =>
elements.map((element) => ({
title: element.textContent,
link: element.href
}))
)
ウフルニュースページに表示されている要素を取得します。page.$$eval
メソッドは、セレクターの条件に合う要素をすべて取得するメソッドです。取得された各要素は評価関数である(elements) => elements.map((element) => ...)
部分に渡され、map
メソッドにより配列を作成しています。element.textContent
では要素の持つテキストを、element.href
では要素の持つリンク先のURLを取得します。
セレクターの取得方法について
Google Chromeでセレクターを取得する例を紹介します。ここではウフルコーポレートサイトのニュースページ(https://uhuru.co.jp/news/)を例に行います。
Google Chromeウィンドウの右上にある三点マークをクリックし、メニューを開きます。その他のツール
にカーソルを合わせ、メニューにデベロッパーツール
が現れたらクリックします。
デベロッパーツールが画面に表示されます。Elements
タブが開いていることを確認し、左上にある矢印のついたアイコンをクリックします。この状態でページの要素にカーソルを合わせると、ポップアップに要素の詳細な情報が表示されます。
セレクターを取得したい要素にカーソルを合わせ、クリックします。デベロッパーツールに選択した要素のソースがフォーカスされるので、フォーカスされた箇所を右クリック→Copy
→Copy selector
を選択すると、クリップボードにセレクターがコピーされます。
クリップボードにコピーされたセレクターは以下のようになっています。
#main > div > div.ly_under_contents > div > div.bl_newsList.hp_mt55.hp_sp_mt50 > div:nth-child(1) > div.bl_newsList_title > a
div:nth-child(1)
から:nth-child(1)
を削除します。
#main > div > div.ly_under_contents > div > div.bl_newsList.hp_mt55.hp_sp_mt50 > div > div.bl_newsList_title > a
これで条件に合致するすべての要素を指定できるセレクターとなりました。
Google ChromeはGoogle LLCの商標です。
ブラウザーの終了と結果の返却
// ブラウザーの終了
await browser.close()
// 結果を返す
return newsItems
コードの正常な実行のため、ブラウザーの終了を行なってください。
ノードに値を出力させるため、return
で返り値を定義してください。
サンプルフローの実行
タイムスタンプ
と表記されているノードのボタンをクリックし、フローを実行します。
フローの実行が完了すると、デバッグメッセージに以下のような結果が出力されます。
配列をクリックして展開すると、各オブジェクトが0: object
のように格納されています。
さらにクリックして展開すると、title
にニュースタイトル、link
にURLが格納されています。
Well Done!
サンプルフローを用いてenebularでwebスクレイピングが実行できました。クラウド実行環境での実行の際には、LCDPノードの追加およびクラウド実行環境設定ページでのwebスクレイピング利用設定を忘れずに行ってください。 クラウド実行環境でのwebスクレイピング利用設定は、クラウド実行環境の管理ページのwebスクレイピングの利用を参照してください。