さまざまな言語でWebスクレイピング
2023年 4月 6日 Posted 野々瀨(フロントエンドエンジニア)
さまざまな言語でWebスクレイピングをどのように行うのかを簡単にご紹介します。
Webスクレイピングとは
そもそもWebスクレイピングとは、あるWebページから特定の情報を抽出するための技術です。テキストなどの情報はもちろん、HTML自体を抽出することも含まれます。
クローリングとは
クローリングとは、複数のサイトを巡回し情報を収集する技術です。クローリングするロボット(ボット)のことをクローラーといいます。代表的な例としては、Googlebotがクローラーです。
Webスクレイピングとクローリングの違い
Webスクレイピングは抽出するのが主な役割なのに対し、クローリングは巡回をするのが主な役割となっています。
スクレイピングする上で気を付けるべきこと
自身で管理されていない、あるいは許可されていない外部の情報を取得する際、幾つか気を付けることがあります。連続してWebサーバーへアクセスすると、サーバーへの過度な負荷をかけて障害を与えたりするDoS攻撃とみなされたり、著作権や利用規約に違反したりする可能性があります。次の内容を確認し、問題ないようにスクレイピングを行うようにします。
- 連続してアクセスする際の間隔を確認
- 著作権を確認
- 対象となるWebサイトにある利用規約を確認
- robots.txtやHTML内にあるrobotsのメタタグを確認
言語別にWebスクレイピング
事前準備
次の事前準備を行ってください。
- 使用するブラウザーをインストール
- 使用するブラウザーのWebDriverをインストール
- 環境変数のPathへWebDriverのあるディレクトリーパスを追加
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で行います。
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ライブラリを使用します。
インストール
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のインストールは、次のコマンドのように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コントロールを設置し、上記コードの「スクレイピング」プロシージャをマクロ登録することで、設置したボタンを押すとスクレイピングを行います。