概要

PowerShellでウェブページのスクレイピングを行い、ページネーションを処理するサンプルスクリプトを以下に示します。この例では、複数ページにわたるデータを取得する方法を説明します。ウェブサイトの構造によっては、実際のスクリプトを調整する必要があります。

1. プロジェクトフォルダの構成

📂WebScrapingSample
┣ 📜ScrapeData.ps1
┣ 📜Scraper.psm1
┣ 📜Utilities.psm1
┗ 📂Data
  ┗ 📜ScrapedData.csv

2. データのスクレイピング

実際のデータスクレイピング処理をScrapeData.ps1で行います。

ScrapeData.ps1

# モジュールのインポート
Import-Module "$PSScriptRoot\\\\Scraper.psm1"
Import-Module "$PSScriptRoot\\\\Utilities.psm1"

# スクレイピングを行う初期URL
$initialUrl = "<https://example.com/page1>"

# スクレイピング結果を格納する配列
$data = @()

# 現在のページURL
$currentUrl = $initialUrl

# ページが存在する限りループ
while ($currentUrl) {
    # Webページの内容を取得
    $htmlContent = Get-WebPageContent -url $currentUrl

    # データを抽出
    $pageData = Extract-Data -htmlContent $htmlContent
    $data += $pageData

    # 次のページのURLを取得
    $currentUrl = Get-NextPageUrl -htmlContent $htmlContent
}

# データをCSVに保存
Save-DataToCsv -data $data -filePath "$PSScriptRoot\\\\Data\\\\ScrapedData.csv"

3. ページネーションの処理

各関数の実装例を以下に示します。

Scraper.psm1

Function Get-WebPageContent {
    param (
        [string]$url
    )
    try {
        $webClient = New-Object System.Net.WebClient
        $content = $webClient.DownloadString($url)
        return $content
    } catch {
        Write-Error "Failed to download content from $url"
        return $null
    }
}

Function Extract-Data {
    param (
        [string]$htmlContent
    )
    # ここにHTMLパース処理を記述
    # 必要に応じてHtmlAgilityPackなどのライブラリを使用
    $data = @()
    # ダミーデータ
    $data += [PSCustomObject]@{ Title = "Sample"; Link = "<https://example.com>" }
    return $data
}

Function Get-NextPageUrl {
    param (
        [string]$htmlContent
    )
    # ここに次のページURL取得処理を記述
    # 例: 正規表現やHtmlAgilityPackを使用して次のページリンクを抽出
    if ($htmlContent -match 'href="([^"]+)" rel="next"') {
        return $matches[1]
    } else {
        return $null
    }
}

Utilities.psm1

Function Save-DataToCsv {
    param (
        [array]$data,
        [string]$filePath
    )
    try {
        $data | Export-Csv -Path $filePath -NoTypeInformation -Encoding UTF8
        Write-Output "Data saved to $filePath"
    } catch {
        Write-Error "Failed to save data to $filePath"
    }
}

これで、ページネーションを処理しながらデータをスクレイピングするサンプルスクリプトが完成です。このスクリプトを実行すると、複数ページにわたるデータが取得され、CSVファイルに保存されます。

graph TD
    subgraph WebScrapingSample
        direction TB
        subgraph Data
            ScrapedData[ScrapedData.csv]
        end
        subgraph Modules
            subgraph Scraper
                ScraperFile[Scraper.psm1]
                subgraph ScraperFile
                    GetWebPageContent[Get-WebPageContent]
                    ExtractData[Extract-Data]
                    GetNextPageUrl[Get-NextPageUrl]
                end
            end
            subgraph Utilities
                UtilitiesFile[Utilities.psm1]
                subgraph UtilitiesFile
                    SaveDataToCsv[Save-DataToCsv]
                end
            end
        end
        subgraph RootFiles
            ScrapeDataFile[ScrapeData.ps1]
            ScrapeDataFile --> ScraperFile
            ScrapeDataFile --> UtilitiesFile
        end
    end

    %% Functions within Scraper.psm1
    GetWebPageContent --> htmlContent1[HTML Content]
    ExtractData --> pageData[Page Data]
    GetNextPageUrl --> nextPageUrl[Next Page URL]

    %% Functions within Utilities.psm1
    SaveDataToCsv --> csvFile[ScrapedData.csv]

    %% Flow in ScrapeData.ps1
    ScrapeDataFile --> initialUrl[Initial URL]
    ScrapeDataFile --> whileLoop[While Loop]
    whileLoop --> GetWebPageContent
    whileLoop --> ExtractData
    whileLoop --> GetNextPageUrl
    whileLoop --> SaveDataToCsv