Home / AI / Python / pandas / JavaScriptによる動的サイトからテーブルデータをスクレイピングする

JavaScriptで作成された動的サイトのページから、テーブルデータをスクレイピングする方法をまとめました。

目次

  1. 環境構築
    1. docker-compose.ymlを作成する
    2. Dockerfileを作成する
    3. イメージをビルドする
    4. コンテナを起動する
    5. コンテナの起動状態を確認する
    6. コンテナに入る
    7. インストール済みのパッケージを確認する
  2. スクレイピング
    1. ファイルを作成する
    2. ファイルにコードを記述する
    3. ファイルを実行する

環境構築

スクレイピング環境をDockerで構築します。

docker-compose.ymlを作成する

docker-compose.ymlにコンテナ起動時の情報を指定します。

version: "3"

services:
  scraping:
    build:
      context: .
      dockerfile: Dockerfile
    working_dir: /var/scenario
    volumes:
      - $PWD:/var/scenario
    tty: true

Dockerfileを作成する

Dockerfileにイメージ作成時の情報を指定します。

Playwrightの公式イメージをベースにカスタムイメージを作成します。

Playwrightはブラウザ操作を行うためのライブラリです。

Pandasのread_html()を使用するには、HTMLパーサーとしてlxmlとBeautifulSoupが必要なので同時にインストールします。

FROM mcr.microsoft.com/playwright

RUN apt-get update &&\
    apt-get install -y python3 &&\
    apt-get install -y python3-pip &&\
    pip install -U pip &&\
    pip install pandas bs4 lxml playwright &&\
    playwright install

イメージをビルドする

docker compose buildコマンドでイメージをビルドします。

--no-cacheオプションを指定すると、キャッシュの利用を無効にすることができ、イメージの更新が反映されないなどの不具合を回避することができます。

% docker compose build --no-cache
[+] Building 377.7s (6/6) FINISHED
 => [scraping internal] load build definition from Dockerfile                                                                     0.2s
 => => transferring dockerfile: 304B                                                                                              0.1s
 => [scraping internal] load .dockerignore                                                                                        0.1s
 => => transferring context: 2B                                                                                                   0.0s
 => [scraping internal] load metadata for mcr.microsoft.com/playwright:latest                                                     0.0s
 => CACHED [scraping 1/2] FROM mcr.microsoft.com/playwright                                                                       0.0s
 => [scraping 2/2] RUN apt-get update &&    apt-get install -y python3 &&    apt-get install -y python3-pip &&    pip install   355.7s
 => [scraping] exporting to image                                                                                                21.6s
 => => exporting layers                                                                                                          21.5s
 => => writing image sha256:d38e3ba8f6d9538217665871b511f8d8dff8b4baf0dd535cfbc1c5ce82e6e410                                      0.0s
 => => naming to docker.io/library/js-table-scraping-scraping

コンテナを起動する

docker compose upコマンドでコンテナを起動します。

-dオプションを付けると、コンテナをバックグラウンドで実行することができます。

% docker compose up -d
[+] Building 0.0s (0/0)
[+] Running 2/2
 ✔ Network js-table-scraping_default       Created                                                                                1.2s
 ✔ Container js-table-scraping-scraping-1  Started

コンテナの起動状態を確認する

docker compose psコマンドでdocker-compose.ymlに関連する起動状態のコンテナを確認します。

% docker compose ps
NAME                           IMAGE                        COMMAND             SERVICE             CREATED              STATUS              PORTS
js-table-scraping-scraping-1   js-table-scraping-scraping   "/bin/bash"         scraping            About a minute ago   Up About a minute

コンテナに入る

docker compose execコマンドでコンテナ内に入ります。

% docker compose exec scraping /bin/bash

インストール済みのパッケージを確認する

pip listコマンドでインストール済みのパッケージを確認します。

root@7eb7666c8181:/var/scenario# pip list
Package           Version
----------------- -------
beautifulsoup4    4.12.2
bs4               0.0.1
greenlet          2.0.2
lxml              4.9.2
numpy             1.24.4
pandas            2.0.3
pip               23.1.2
playwright        1.35.0
pyee              9.0.4
python-dateutil   2.8.2
pytz              2023.3
setuptools        45.2.0
six               1.16.0
soupsieve         2.4.1
typing_extensions 4.7.0
tzdata            2023.3
wheel             0.34.2

スクレイピング

Playwrightでブラウザを操作し、Pandasのread_html()でテーブルデータをスクレイピングします。

ファイルを作成する

docker-compose.ymlDockerfileが置かれているディレクトリ下でファイルを新規作成します。

% vi get_table_data.py

ファイルにコードを記述する

作成したファイル内に下記のコードを記述します。

page.goto("https://www.example.com/")https://www.example.com/を、スクレイピングするサイトのURLに置き換えて下さい。

import pandas as pd
from bs4 import BeautifulSoup
from playwright.sync_api import sync_playwright


def get_table_data(playwright):
    try:
        browser = playwright.chromium.launch()
        context = browser.new_context()
        page = context.new_page()
        page.goto("https://www.example.com/")
        html = page.content()
        soup = BeautifulSoup(html, "lxml")
        table = soup.find_all("table")
        df = pd.read_html(str(table))

    except:
        print("Error")

    else:
        print(df)

    finally:
        page.close()
        context.close()
        browser.close()


with sync_playwright() as playwright:
    get_table_data(playwright)

ファイルを実行する

ファイル内にコードを記述し実行すると、スクレイピングが開始されます。

root@7eb7666c8181:/var/scenario# python3 get_table_data.py

参考