「スクレイピング」に適したプログラミング言語というと「Pyhon」や「Ruby」を思い浮かべる方は多いですよね。
ですが、近年「JavaScript」を使ったスクレイピングの環境がどんどん整備され、「Pyhon」や「Ruby」に次ぐスクレイピングに適した言語として「JavaScript」が挙げられているのはご存知でしょうか。
今回は、そんな「JavaScript」を使ったスクレイピングのやり方について、環境の構築方法からご紹介します。
目次
JavaScriptでスクレイピング 予備知識
スクレイピングとは
スクレイピング(Webスクレイピング)とは、Webサイトに含まれる情報から必要なものを抽出する技術のことです。
調べる対象が数ページであれば、ブラウザからコピー&ペーストすることでデータを収集することができますが、大量のページから必要なデータだけを収集したい、ということになると、かなりの手間が発生してしまいます。
そういった場合に役立つのが「Webスクレイピング」という手法です。
「Webスクレイピング」の手法を習得していれば、手作業による情報収集から解放されることにはなるのですが、誤った使い方をすると、問題となってしまう可能性があります。
スクレイピングの環境構築を学ぶ前に、事前にどういったことが問題となるのかを把握しておくとよいでしょう。
スクレイピングの注意点
スクレイピングをする際に注意しなければならない点は以下の通りです。
- スクレイピングを高頻度で繰り返し、対象のサーバーに対して大きな負荷をかける
- スクレイピングにより取得した情報を不正に使用する
スクレイピングをするということは、プログラムの実行によってデータを収集するということになりますので、誤ったプログラムを実行してしまうとデータの取得元に大量のリクエストを送りつけてしまうことになります。
当然、取得元のサーバー処理を遅延、ダウンさせる危険がありますので、最悪の場合「偽計業務妨害」といった罪に問われてしまう可能性があります。
また、収集した情報の活用方法を誤ると「著作権違反」に問われてしまう危険もあります。
「負荷をかけなければよい」わけではない
「相手サーバーに負荷さえかけなければスクレイピングしても問題ない」と豪語する猛者もいますが、原則として著作権法では「他者の創作物を他人が同意なくコピーしたり保存したりする行為は違法」と定められています。
スクレイピングは、あくまでも「コンピュータによって情報を解析することが目的である場合」に限り「例外的に認められている行為」であるということを理解しておかなければなりません。
法律の専門家の見解を聞いておこう
スクレイピング自体は違法ではありませんが、情報を取得したいWebサイトごとにスクレイピングをしても問題ないかどうかを事前に確認しておかなければ思わぬトラブルを招く恐れがあります。
「相手側のサーバーに負荷をかけない」「Webサイトの利用規約は遵守する」といったことを守るのは当然としても、「これらのことだけ注意していれば大丈夫」というわけではありません。
スクレイピングを行う際は、法律の専門家の見解を聞き、十分に注意した上で行うのが賢明な判断かと思われます。
JavaScriptでスクレイピング 環境構築
小難しいスクレイピングの注意点についてはこのへんにして、スクレイピングの環境構築の説明に移りたいと思います。
必要な環境
JavaScriptを使ってスクレイピングする方法はいくつかありますが、ここでは、「Node.js」のライブラリである「puppeteer」を使った方法を紹介します。
「Node.js」をインストールする方法はOSによって異なり、Windowsの場合はインストーラーをダウンロードすることでインストール可能ですが、Macの場合は「Homebrew」からインストールすることになります。
今回の記事ではMacの場合を説明いたしますので、以下の操作に従ってインストールを進めてください。
Homebrewのインストール
HomebrewはMac用のツールのインストールを管理するパッケージマネージャです。
公式ページに表示されている以下のスクリプトをターミナルで実行することでインストール可能です。
1 |
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" |
インストールができているか確認するには以下のコマンドを実行します。
1 |
$ brew -v |
Homebrewのバージョンが表示されていれば正常にインストールされています。
「command not found」と表示された場合はインストールに失敗しているので、手順を確認してやり直してください。
どうしてもインストールできない場合は、いっそMacを購入時の状態に初期化してしまうのもひとつの手かと思います。
nodebrewのインストール
Node.jsをインストールする前に、Node.jsのバージョンを管理してくれる「nodebrew」をインストールしておきましょう。
1 |
$ brew install nodebrew |
インストールができているか確認するには以下のコマンドを実行します。
1 |
$ nodebrew -v |
nodebrewのバージョンが表示されていれば正常にインストールされています。
Node.jsのインストール
「Homebrew」がインストール済の状態であれば、以下のコマンドで<「Node.js」をインストールできます。
$ brew install node
インストールができているか確認するには以下のコマンドを実行します。
インストールが終了するまでしばらく時間がかかりますので、気長に待ちましょう。
1 |
$ node -v |
Node.jsのバージョンが表示されていれば正常にインストールされています。
以上でJavaScriptでスクレイピングする準備が整いました。
環境の構築については、年月の経過によって異なってくる可能性があります。
ここでの説明はあくまで「こんな環境をインストールする必要があるのだな」程度に捉えていただき、ご自身で最新のインストール方法をご確認いただければと思います。
JavaScriptでスクレイピング プログラミング
それではいよいよ、スクレイピングをするためのプログラミングに移りましょう。
ここでは、以下の内容に従って操作することで「特定のサイトから記事のタイトルを取得する」ことを目的としたプログラムを作成します。
プロジェクトディレクトリの作成
まずはプログラムを保管する場所である「プロジェクトディレクトリ」を作成します。
普通にフォルダを作る要領で作成して構いません。
ディレクトリ名は何でも構いませんが後からプログラムの内容が分かるよう「scraping」としましょう。
package.jsonの作成
プロジェクトディレクトリに「package.json」ファイルを作成します。
package.jsonファイルの説明は割愛しますが、ここではプロジェクトごとに必要なファイルと思ってください。
package.jsonの作成方法は以下の通りです。
1 2 |
$ CD [プロジェクトディレクトリへのパス] $ npm ini -y |
プロジェクトディレクトリに「package.json」が生成されていれば成功です。
puppeteerのインストール
プロジェクトディレクトリに「puppeteer」をインストールします。
「puppeteer」とはNode.jsで作られたプログラムからブラウザを制御できるライブラリで、「パペティア」と読みます。
JavaScriptなどで動的に生成されるページでも操作することができますので、スクレイピングをする際は必須のライブラリと言ってもよいでしょう。
比較的環境構築は簡単で、インストール方法は以下のコマンドを実行するだけです。
1 |
$ npm i puppeteer |
コマンドを実行すると、プロジェクトディレクトリに以下のような構成のディレクトリやファイルが生成されますので内容を確認しておきましょう。
1 2 3 4 5 6 7 8 9 10 |
. ├─ node_modules │ └─ puppeteer │ ├── CONTRIBUTING.md │ ├── DeviceDescriptors.js │ ├── Errors.js │ ├── LICENSE │ ├── README.md │ └── index.js └── package-lock.json |
これらのファイルが生成されていない場合、プロジェクトディレクトリでコマンドを実行していない可能性があります。
その場合は、プロジェクトディレクトリに移動してからコマンドを実行してみてください。
scraping.jsの作成
プロジェクトディレクトリにスクレイピングをするためのプログラムを作成します。
テキストエディタで以下のコードを記載し、「scraping.js」という名前をつけてプロジェクトディレクトリに保存してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
const puppeteer = require('puppeteer'); const scrape = async () => { const browser = await puppeteer.launch({ headless: false, slowMo: 250, defaultViewport: null }); // Webサイトを開く const page = await browser.newPage(); const url = '◯◯◯◯'; await page.goto(url,{ waitUntil: 'domcontentloaded' }); // タイトルを取得 const title = await page.title(); //出力 console.log(title); browser.close(); } scrape(); |
以上でプログラムは完成です。
◯◯◯◯の部分にスクレイピングしたいWebサイトのURLを記入し、早速実行してみましょう。
プログラム実行
プログラムは以下のコマンドで実行されます。
1 |
$ node scraping.js |
ブラウザが起動し、ターミナル上に指定した記事のタイトルが表示されていれば成功です。
JavaScriptでスクレイピング 応用編
最後に、今作った「scraping.js」では記事のタイトルが取得されるのみですので、より実践に近い形で応用させてみましょう。
このプログラムを実行すると、Wikipediaにあるこちらの記事の文字列を取得することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
const puppeteer = require('puppeteer'); const scrape = async () => { const browser = await puppeteer.launch({ headless: false, slowMo: 250, defaultViewport: null }); // Webサイトを開く const page = await browser.newPage(); const url = 'https://ja.wikipedia.org/wiki/ウェブスクレイピング'; await page.goto(url, { waitUntil: 'domcontentloaded' }); // タブを移動 const wikiPages = await browser.pages(); const wikiPage = wikiPages[1]; await wikiPage.bringToFront(); // タイトル取得 let selector = '#firstHeading'; const titleDom = await wikiPage.$(selector); if (titleDom) { title = await wikiPage.$eval(selector, e => e.textContent); // 出力 console.log(title); } // 本文取得 selector = '#mw-content-text > div > p'; const contentDom = await wikiPage.$$(selector); if (contentDom.length > 0) { content = await wikiPage.$$eval(selector, elements => { let datas = []; for (e of elements) { datas.push(e.textContent); } return datas; }); // 出力 console.log(content); } browser.close(); } scrape(); |
JavaScriptの強みはDOM操作
ソースコードを見て気づいた方もいらっしゃるかと思いますが、DOM操作で取得したいデータを指定することができます。
DOM操作に慣れている方であれば、JavaScriptを使ったスクレイピングは難なく習得できるのではないでしょうか。
まとめ
いかがでしたか。
今回はJavaScriptでスクレイピングするための環境構築方法を紹介させていただきました。
近年、Node.jsやpuppeteerといった環境構築がどんどん簡単となってきており、スクレイピングに適した言語になってきたと言えるのではないでしょうか。
今後、JavaScriptでスクレイピングしたいという状況が発生した時に、こちらの記事を思い出していただければ幸いです。