webスクレイピング

enebularの公式プライベートノード、web-scrapingはwebスクレイピング機能を提供しています。 webスクレイピング機能では、フローエディターまたはクラウド実行環境からヘッドレスブラウザ制御ライブラリPuppeteerを用いたwebスクレイピングを実行できます。

このチュートリアルでは、プライベートノードとサンプルフローをインポートし、フローを実行してウフルのコーポレートサイトにあるニュースページからニュースのタイトルとリンクのリストを取得します。(所要時間10分)

※1 webスクレイピング機能はエンタープライズプラン、トライアルプラン限定の機能です。

※2 webスクレイピング機能はエージェント実行環境、enebular Editorからは利用できません。

Puppeteerについてのより詳細な情報は、Puppeteer公式ドキュメントを参照してください。

Table of Contents

  1. プライベートノードのインポート
  2. サンプルフローのインポート
  3. サンプルフローを開く
  4. サンプルフローの実行

プライベートノードのインポート

Discover Assetsから、webスクレイピングを実行するためのプライベートノードをインポートする手順を説明します。

enebularの画面右上にあるDiscover Assetsをクリックしてください。

discoverMenu

以下の手順でプライベートノードweb-scrapingを検索します。

  1. アセットの種類でPrivate Nodeを選択します
  2. 検索バーにweb-scrapingと入力します
  3. プルダウンから名称を選択します

検索結果に表示されるenebularのラベルがついたプライベートノードをクリックしてください。

PrivateNode

インポートをクリックします。

インポート先のプロジェクトを選択し、インポートをクリックしてください。これでプライベートノードのインポートは完了です。インポート先として選択したプロジェクトのアセット一覧画面で、プライベートノードが追加されたことを確認してください。

サンプルフローのインポート

インポートしたプライベートノード利用してwebスクレイピングを行うサンプルフローをプロジェクトにインポートする方法を説明します。

このサンプルフローはDiscover Assetsに公開しています。

サンプルフローを開く

サンプルフローについて説明します。

スクレイピング実行用コード

インポートしたフローを開きます。

SampleFlow

webスクレイピングと表記されているノードを開くと、Puppeteer用コードとラベルのついたエディターが表示されます。

CodeEditor

エディターにはウフルのコーポレートサイトにあるニュースページにアクセスし、最新のページに表示されているニュースのタイトルとリンクを取得するコードが入力されています。

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ウィンドウの右上にある三点マークをクリックし、メニューを開きます。その他のツールにカーソルを合わせ、メニューにデベロッパーツールが現れたらクリックします。

DeveloperTool

デベロッパーツールが画面に表示されます。Elementsタブが開いていることを確認し、左上にある矢印のついたアイコンをクリックします。この状態でページの要素にカーソルを合わせると、ポップアップに要素の詳細な情報が表示されます。

DeveloperTool2

セレクターを取得したい要素にカーソルを合わせ、クリックします。デベロッパーツールに選択した要素のソースがフォーカスされるので、フォーカスされた箇所を右クリック→CopyCopy selectorを選択すると、クリップボードにセレクターがコピーされます。

DeveloperTool3

クリップボードにコピーされたセレクターは以下のようになっています。

#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で返り値を定義してください。

サンプルフローの実行

タイムスタンプと表記されているノードのボタンをクリックし、フローを実行します。 フローの実行が完了すると、デバッグメッセージに以下のような結果が出力されます。

Result1

配列をクリックして展開すると、各オブジェクトが0: objectのように格納されています。

Result2

さらにクリックして展開すると、titleにニュースタイトル、linkにURLが格納されています。

Result3

Well Done!

サンプルフローを用いてenebularでwebスクレイピングが実行できました。クラウド実行環境での実行の際には、LCDPノードの追加およびクラウド実行環境設定ページでのwebスクレイピング利用設定を忘れずに行ってください。 クラウド実行環境でのwebスクレイピング利用設定は、クラウド実行環境の管理ページのwebスクレイピングの利用を参照してください。

results matching ""

    No results matching ""