JavaScriptで作成された動的サイトのページから、テーブルデータをスクレイピングする方法をまとめました。
目次
環境構築
スクレイピング環境を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.yml
とDockerfile
が置かれているディレクトリ下でファイルを新規作成します。
% 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
参考
- Pandasで超簡単!WEBスクレイピング(表・htmlのtable取得)
- 【Python】JavaScriptレンダリングページからhtmlのtableをスクレイピングする(Playwright→BeautifulSoup4→pandas) – Qiita
- Python と Playwright でブラウザを自動操作させるコードを自動生成したよ
- Playwright on Dockerをセットアップする(2022) – Zenn
- Docker | Playwright
- HTML解析に使われるHTMLParserとは?BeautifulSoupについても解説 – WEBCAMP MEDIA
人気記事
まだデータがありません。
ニューラルネットワークのフォワードプロパゲーションを実装してみた|ITエンジニアとして経験・学習したこと
"[…] なお、フォワードプロパゲーションについては、以下のサイトを参照のこと。 https://hossuii.com/?p=1803 […] "