さまざまな言語でWebスクレイピング

2023年 4月 6日 Posted 野々瀨(フロントエンドエンジニア)

さまざまな言語でWebスクレイピングをどのように行うのかを簡単にご紹介します。

Webスクレイピングとは

そもそもWebスクレイピングとは、あるWebページから特定の情報を抽出するための技術です。テキストなどの情報はもちろん、HTML自体を抽出することも含まれます。

クローリングとは

クローリングとは、複数のサイトを巡回し情報を収集する技術です。クローリングするロボット(ボット)のことをクローラーといいます。代表的な例としては、Googlebotがクローラーです。

Webスクレイピングとクローリングの違い

Webスクレイピングは抽出するのが主な役割なのに対し、クローリングは巡回をするのが主な役割となっています。

スクレイピングする上で気を付けるべきこと

自身で管理されていない、あるいは許可されていない外部の情報を取得する際、幾つか気を付けることがあります。連続してWebサーバへアクセスすると、サーバへの過度な負荷をかけて障害を与えたりするDoS攻撃とみなされたり、著作権や利用規約に違反したりする可能性があります。次の内容を確認し、問題ないようにスクレイピングを行うようにします。

言語別にWebスクレイピング

事前準備

次の事前準備を行ってください。

PHP

PHPでWebスクレイピングを行うには、php-webdriverライブラリを使用します。2022年11月現在のバージョン1.13.1でPHP 7.3(またはPHP 8.0以上)以上で動作します。

php-webdriver/php-webdriver - GitHub

インストール

php-webdriverのインストールは、次のコマンドのようにComposerで行います。

php composer.phar require php-webdriver/webdriver

コード例

WebDriverを起動します。Chromeでは次のようなコマンドで起動します。

chromedriver --url-base=wd/hub --port=4444

PHPで実際にスクレイピングすると次のようなコードになります。

// ライブラリの読み込み
require_once __DIR__.'/vendor/autoload.php';

// 使用する機能を読み込む
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\WebDriverCapabilityType;
use Facebook\WebDriver\WebDriverBy;

// ブラウザーの起動
// ※ 第一引数:WebDriverのホストURL(WebDriverを起動したときのURL)
// ※ 第二引数:ブラウザーのオプション
$driver = RemoteWebDriver::create('http://localhost:4444/wd/hub', [
	// 起動するブラウザー名
	WebDriverCapabilityType::BROWSER_NAME => 'chrome'
]);

// URLを開く
$driver->get('https://example.co.jp/foo/sample.html');

// CSSセレクターから要素を取得
$elements = $driver->findElements(WebDriverBy::cssSelector('.bar > p'));

// 取得した要素を繰り返す
foreach ($elements as $element) {
	// HTMLを取得し出力
	echo $element->getAttribute('outerHTML');
}

// ブラウザーを終了(停止)
$driver->quit();

Node.js

Node.jsでWebスクレイピングを行うには、selenium-webdriverパッケージを使用します。

selenium-webdriver - npm

インストール

selenium-webdriverのインストールは、次のコマンドのようにnpmで行います。

npm i --save-dev selenium-webdriver

コード例

Node.jsで実際にスクレイピングすると次のようなコードになります。

// モジュールを読み込み
const webdriver = require('selenium-webdriver');

// 必要な機能を読み込み
const { Builder, Browser } = webdriver;

(async () => {
	// ブラウザーを起動
	const driver = await new Builder().forBrowser(Browser.CHROME).build();

	// URLにアクセス
	await driver.get('https://example.co.jp/foo/sample.html');

	// CSSセレクターから要素を取得
	const elements = await driver.findElements(By.css('.bar > p'))

	// 取得した要素を繰り返す
	elements.forEach(async element => {
		// HTMLを取得し出力
		console.log(await driver.executeScript('return arguments[0].outerHTML;', element));
	});

	// ブラウザーを終了(停止)
	await driver.quit();
})();

selenium-webdriverは非同期が基本なので、ほとんどのメソッドはPromiseで返します。上記のコードではasync / awaitを使用して処理しています。

Python

PythonでWebスクレイピングを行うには、seleniumパッケージを使用します。

selenium - PyPI
Selenium with Python

インストール

seleniumのインストールは、次のコマンドのようにpipで行います。

pip install selenium

コード例

Pythonで実際にスクレイピングすると次のようなコードになります。

# モジュールを読み込み
from selenium import webdriver

# ブラウザーを起動
driver = webdriver.Chrome()

# URLにアクセス
driver.get('https://example.co.jp/foo/sample.html')

# CSSセレクターから要素を取得
elems = driver.find_elements_by_css_selector('.bar > p')

# 取得した要素を繰り返す
for elem in elems:
	# HTMLを取得し出力
	print(elem.get_attribute('outerHTML'))

# ブラウザーを終了(停止)
driver.quit()

Ruby

RubyでWebスクレイピングを行うには、selenium-webdriverパッケージを使用します。

selenium-webdriver | RubyGems.org

インストール

seleniumのインストールは、次のコマンドのようにgemで行います。

gem install selenium-webdriver

コード例

Rubyで実際にスクレイピングすると次のようなコードになります。

# モジュールを読み込み
require 'selenium-webdriver'

# ブラウザーを起動
driver = Selenium::WebDriver.for :chrome

# URLにアクセス
driver.get('https://example.co.jp/foo/sample.html')

# CSSセレクターから要素を取得
elems = driver.find_elements(:css, '.bar > p')

# 取得した要素を繰り返す
for elem in elems do
	# HTMLを取得し出力
	p elem.attribute('outerHTML')
end

# ブラウザーを終了(停止)
driver.quit

C#

C#でWebスクレイピングを行うには、AngleSharpライブラリを使用します。

AngleSharpDocs

インストール

AngleSharpのインストールは、Visual Studioから行います。Visual Studioを起動し、対象のプロジェクトを開きます。メニューから「プロジェクト」を展開し、「NuGet パッケージマネージャーの管理」を押します。

参照タブを押し、検索の入力欄に「AngleSharp」と入力しEnterを押します。検索結果の最初の「AngleSharp」を押して選択し、右側にある「インストール」ボタンを押します。

出力パネルに「'AngleSharp 0.x.x' が Develop に正常にインストールされました」というようなメッセージが表示されれば、インストールが完了です。

コード例

C#で実際にスクレイピングすると次のようなコードになります。

// ライブラリの読み込み
using System;
using System.Net;
using System.Text;
using AngleSharp;
using AngleSharp.Html.Parser;

public class Program {
	static void Main() {
		// Webクライアントのインスタンスを生成
		WebClient wc = new WebClient();

		// URLのエンコードを指定
		wc.Encoding = Encoding.UTF8;

		// 200以外のコードは例外となるため
		try {
			// URLからドキュメント全体のHTMLを取得
			string htmlStr = wc.DownloadString("https://example.co.jp/foo/sample.html");

			// パーサーを作成
			var parser = new HtmlParser();

			// HTML文字列から解析
			var document = parser.ParseDocument(htmlStr);

			// CSSセレクターから要素を取得
			var elements = document.QuerySelectorAll(".bar > p");

			// 取得した要素を繰り返す
			foreach (var item in elements) {
				// HTMLを取得し出力
				Console.WriteLine(item.OuterHtml);
			}
		} catch (System.Exception) {
			throw;
		}
	}
}

Go

GoでWebスクレイピングを行うには、Agoutiライブラリを使用します。

Agouti - GitHub
Agouti

インストール

Agoutiのインストールは、次のコマンドのようにgo getで行います。

go get github.com/sclevine/agouti

コード例

Goで実際にスクレイピングすると次のようなコードになります。

package main

// モジュールを読み込み
import (
	"fmt"
	"github.com/sclevine/agouti"
)

func main() {
	// ドライバーの作成
	driver := agouti.ChromeDriver()

	// ドライバーの起動
	err := driver.Start()
	if err != nil {
		fmt.Println(err)
		return
	}

	// 新しいページを作成
	page, err := driver.NewPage()
	if err != nil {
		fmt.Println(err)
		return
	}

	// URLにアクセス
	err = page.Navigate("https://example.co.jp/foo/sample.html")
	if err != nil {
		fmt.Println(err)
		return
	}

	// CSSセレクターから要素を取得
	elements := page.All(".bar > p")

	// 要素の数を取得
	count, err := elements.Count()
	if err != nil {
		fmt.Println(err)
		return
	}

	// 取得した要素を繰り返す
	for i := 0; i < count; i++ {
		// HTMLを取得し出力
		fmt.Println(elements.At(i).Attribute("outerHTML"))
	}
}

VBA

ExcelのVBAでWebスクレイピングを行うには、標準ではInternet Explorerのみ対応していて、Microsoft Internet ControlsライブラリとMicrosoft HTML Object Libraryライブラリを使用します。その他のブラウザーでWebスクレイピングを行う場合は、SeleniumBasicというソフトウェアをインストールする必要がありますが、ここではInternet ExplorerでのWebスクレイピングをご紹介します。

インストール

Excelのリボンから「開発」を開き、「Visual Basic」を押します。メニューから「ツール」を開き、「参照設定」を押します。

「Microsoft Internet Controls」と「Microsoft HTML Object Library」にチェックを入れ、「OK」ボタンを押します。

コード例

VBAで実際にスクレイピングすると次のようなコードになります。

Sub スクレイピング()
	' IEを起動
	Dim IE As InternetExplorer
	Set IE = New InternetExplorer

	' IEを表示
	IE.Visible = True

	' URLにアクセス
	IE.navigate "https://example.co.jp/foo/sample.html"

	' 読み込みの待機
	Application.Wait Now() + TimeValue("00:00:03")

	' "462"エラー回避
	Dim objShell As Object, objWin As Object
	Set objShell = CreateObject("Shell.Application")
	For Each objWin In objShell.Windows
		If objWin.Name = "Internet Explorer" Then
			Set IE = objWin
			Exit For
		End If
	Next

	' HTML操作用のプロシージャを呼び出し
	Call HTML操作(IE)
End Sub

Sub HTML操作(IE As InternetExplorer)
	' ページのdocumentオブジェクトを取得
	Dim htmlDoc As HTMLDocument
	Set htmlDoc = IE.document

	' 要素を取得し繰り返す
	For Each element In htmlDoc.querySelectorAll(".bar > p")
		' HTMLを取得し出力
		Debug.Print element.outerHTML
	Next
End Sub

シート上にボタンのActive Xコントロールを設置し、上記コードの「スクレイピング」プロシージャをマクロ登録することで、設置したボタンを押すとスクレイピングを行います。