logo
ダウンロード
languageJPdown
menu

Pythonクローラー入門:SeleniumでWebクローラーを作る方法

star

PythonとSeleniumを使ってWebクローラーを作る基本手順を初心者向けに解説。クローリングとスクレイピングの違い、環境準備、サンプルコード、CSV保存、運用時の注意点まで紹介します。

約5分で読めます

Webサイト上の情報を自動で収集したいと考えたとき、よく使われる言語の一つがPythonです。Pythonには、Webページへアクセスするためのライブラリや、HTMLを解析するためのライブラリ、ブラウザ操作を自動化するためのライブラリがそろっており、Webクローラーの開発にも活用されています。

中でもSeleniumは、実際のブラウザを操作しながらページを開けるため、JavaScriptで内容が表示される動的ページや、クリック・スクロールなどの操作が必要なページにも対応しやすいのが特徴です。

本記事では、PythonとSeleniumを使ってWebクローラーを作る基本的な流れを、初心者向けに解説します。Pythonクローラーの仕組み、必要な開発環境、Selenium 4に対応したサンプルコード、CSVへの保存方法、運用時の注意点まで順番に見ていきましょう。


Pythonクローラーとは?

Pythonクローラーとは、Pythonで作成されたWebクローラーのことです。Webクローラーは、Webページを自動で巡回し、ページ内の情報やURLを収集するプログラムを指します。

たとえば、ニュース記事の一覧ページから記事タイトルとURLを取得したり、複数ページに分かれた商品一覧から商品名や価格を集めたりする処理が、Pythonクローラーの代表的な利用例です。

ただし、Webサイトにはそれぞれ利用規約やrobots.txtなどのルールがあります。クローラーを作成する際は、技術的に取得できるかだけでなく、そのデータ取得が許可されているか、対象サイトに過度な負荷をかけない設計になっているかも確認する必要があります。

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

クローリングとスクレイピングは似た文脈で使われますが、厳密には役割が少し異なります。

クローリングは、Webページを巡回し、リンクをたどりながらページやURLを収集する処理を指します。一方、スクレイピングは、取得したページの中から必要なデータを抽出する処理を指します。

たとえば、ECサイトの商品一覧ページをたどって複数の商品ページにアクセスする部分がクローリング、各商品ページから商品名・価格・レビュー件数などを取り出す部分がスクレイピングです。実務では、この2つを組み合わせてWebデータ収集を行うことが多くあります。


Pythonクローラー開発でよく使われるライブラリ

PythonでWebクローラーを作る場合、目的に応じて使うライブラリが変わります。代表的なものは以下の通りです。

ライブラリ主な用途向いているケース
requestsWebページのHTMLやAPIレスポンスを取得する静的ページやAPIからデータを取得したい場合
BeautifulSoupHTMLを解析し、必要な要素を抽出する取得したHTMLからタイトル・URL・本文などを取り出したい場合
Seleniumブラウザ操作を自動化するJavaScriptで表示される動的ページ、クリックやスクロールが必要なページ
Scrapy本格的なクローリング処理を構築する大量ページを効率よく巡回し、継続的にデータ取得したい場合
初心者の場合は、まずSeleniumでブラウザ操作の流れを理解し、その後、対象サイトの構造や取得規模に応じてrequests、BeautifulSoup、Scrapyなどを使い分けるとよいでしょう。

Seleniumとは?

Seleniumは、Webブラウザの操作を自動化するためのライブラリです。指定したURLを開く、入力欄に文字を入れる、ボタンをクリックする、ページが読み込まれるまで待つ、といった操作をPythonコードで実行できます。

通常のHTML取得ではデータが見えないページでも、Seleniumを使えば実際のブラウザ表示に近い状態でページを開けるため、動的ページの取得に役立ちます。

Seleniumが向いているケース

Seleniumは、以下のようなページで特に役立ちます。

  • JavaScriptでコンテンツが後から表示されるページ
  • ボタンをクリックするとデータが切り替わるページ
  • スクロールによって追加データが読み込まれるページ
  • ログインや検索条件の入力など、ブラウザ操作が必要なページ

一方で、Seleniumは実際のブラウザを起動するため、requestsでHTMLを取得する方法に比べると処理速度は遅くなりがちです。大量のページを高速に取得したい場合は、Seleniumだけに頼るのではなく、APIや静的HTMLの取得、Scrapyなどの選択肢も検討しましょう。

Seleniumクローラー開発の基本フロー

PythonとSeleniumでWebクローラーを作る準備

PythonでSeleniumを使うには、まずPython本体とSeleniumをインストールします。必要に応じて、HTML解析用のBeautifulSoupや、WebDriver管理を補助するwebdriver-managerを追加することもあります。

Selenium 4.6以降では、Selenium Managerによってブラウザドライバーの管理が自動化されているため、環境によってはChromeDriverを手動でダウンロードしなくても、以下のように簡単にChromeを起動できます。

pip install selenium beautifulsoup4

必要に応じてwebdriver-managerを使う場合は、以下もインストールします。

pip install webdriver-manager
ライブラリをインストールする

Selenium Managerを使う基本例

from selenium import webdriver

# Selenium 4.6以降では、基本的にSelenium ManagerがWebDriverを自動管理します。

driver = webdriver.Chrome()

driver.get("https://www.python.org/")

print(driver.title)

driver.quit()

環境によってドライバーの自動管理がうまくいかない場合は、webdriver-managerを使って明示的にChromeDriverを指定する方法もあります。

webdriver-managerを使う場合の書き方

from selenium import webdriver

from selenium.webdriver.chrome.service import Service

from webdriver_manager.chrome import ChromeDriverManager

service = Service(ChromeDriverManager().install())

driver = webdriver.Chrome(service=service)

driver.get("https://www.python.org/")

print(driver.title)

driver.quit()


サンプルコード:ページ情報を取得してCSVに保存する

ここでは、Seleniumでページを開き、ページ内のリンクテキストとURLを取得してCSVファイルに保存する簡単な例を紹介します。

実際の記事一覧ページや商品一覧ページで利用する場合は、CSSセレクターを対象サイトの構造に合わせて調整してください。

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

import csv

url = "https://www.python.org/"

driver = webdriver.Chrome()

try:

    driver.get(url)

    # ページの読み込みを待つ

    WebDriverWait(driver, 10).until(

        EC.presence_of_element_located((By.TAG_NAME, "body"))

    )

    links = driver.find_elements(By.CSS_SELECTOR, "a")

    data = []

    for link in links:

        text = link.text.strip()

        href = link.get_attribute("href")

        if text and href:

            data.append([text, href])

    with open("links.csv", "w", newline="", encoding="utf-8-sig") as file:

        writer = csv.writer(file)

        writer.writerow(["text", "url"])

        writer.writerows(data)

finally:

    driver.quit()

このコードでは、まずChromeブラウザを起動し、指定したURLを開きます。その後、ページのbody要素が読み込まれるまで待機し、ページ内のaタグを取得します。最後に、リンクのテキストとURLをCSVファイルに保存します。

ポイントは、単にページを開くだけでなく、WebDriverWaitを使ってページの読み込みを待っている点です。動的ページでは、ページを開いた直後に要素を取得しようとすると、まだデータが表示されておらず、空白データやエラーになることがあります。

複数ページを巡回するPythonクローラーの考え方

「python クローラー」というキーワードで検索する読者は、1ページだけではなく、複数ページを自動で巡回する方法を知りたいケースが多いです。

複数ページを巡回する場合は、取得済みURLを記録し、同じページを何度も取得しないようにすることが重要です。また、対象サイトへの負荷を抑えるため、ページごとに待機時間を入れ、取得範囲を必要最小限に絞ることも大切です。

from selenium import webdriver

from selenium.webdriver.common.by import By

from urllib.parse import urljoin, urlparse

import time

start_url = "https://www.python.org/"

max_pages = 10

visited = set()

to_visit = [start_url]

driver = webdriver.Chrome()

try:

    while to_visit and len(visited) < max_pages:

        current_url = to_visit.pop(0)

        if current_url in visited:

            continue

        driver.get(current_url)

        time.sleep(2# 対象サイトへの負荷を抑えるため、待機時間を入れる

        print("取得中:", current_url)

        visited.add(current_url)

        links = driver.find_elements(By.CSS_SELECTOR, "a")

        for link in links:

            href = link.get_attribute("href")

            if not href:

                continue

            absolute_url = urljoin(current_url, href)

            # 同じドメイン内のURLだけを対象にする

            if urlparse(absolute_url).netloc == urlparse(start_url).netloc:

                if absolute_url not in visited and absolute_url not in to_visit:

                    to_visit.append(absolute_url)

finally:

    driver.quit()

この例では、最初のURLからリンクを取得し、同じドメイン内のURLだけを順番に巡回します。実運用では、取得対象のURLパターンを絞り込んだり、robots.txtや利用規約を確認したり、エラー発生時のリトライ回数を制限したりする設計が必要です。


Pythonクローラーを作る際の注意点

1. 利用規約とrobots.txtを確認する

Webサイトによっては、自動取得やスクレイピングを制限している場合があります。クローラーを作成する前に、対象サイトの利用規約、robots.txt、APIの有無を確認しましょう。

robots.txtは法的な契約そのものではありませんが、クローラーに対するサイト側のクロール方針を示す重要な情報です。禁止されているパスやクロール頻度の指定がある場合は、それに従う設計にすることが望ましいです。

from urllib.robotparser import RobotFileParser

robots_url = "https://www.example.com/robots.txt"

target_url = "https://www.example.com/sample-page"

rp = RobotFileParser()

rp.set_url(robots_url)

rp.read()

can_fetch = rp.can_fetch("*", target_url)

print(can_fetch)

2. アクセス間隔を空ける

短時間に大量アクセスを行うと、対象サイトに負荷をかけるだけでなく、403エラー、429エラー、CAPTCHA表示などが発生する可能性があります。

クローラーを運用する際は、ページごとに待機時間を入れ、同時実行数を抑え、まずは小規模なテストから始めることが大切です。

3. 取得範囲を絞る

Webサイト全体を無差別に巡回するのではなく、目的に合ったページだけを対象にしましょう。たとえば、商品一覧、記事一覧、店舗詳細など、必要なURLパターンを事前に決めておくと、無駄なアクセスを減らせます。

取得範囲を絞ることは、処理時間の短縮だけでなく、サイトへの負荷軽減やデータ品質の向上にもつながります。

4. エラー時のリトライ設計を入れる

ネットワークの一時的な不安定さやページ読み込みの遅延により、クローラーが途中で失敗することがあります。

そのため、実運用では、一定回数だけリトライする、失敗したURLをログに残す、取得済みデータを途中保存する、といった設計を入れておくと安定性が高まります。

5. 動的ページではAjax通信も確認する

JavaScriptで表示されるページでは、画面上のデータがAjax通信によって取得されている場合があります。ブラウザの開発者ツールでNetworkタブを確認すると、実際にはAPIレスポンスとしてデータが取得されているケースもあります。

その場合、Seleniumで画面を操作するよりも、公式APIや許可されたデータ取得方法を使ったほうが安定することがあります。まずは対象サイトが提供しているAPIやデータ提供方法を確認しましょう。


よくあるつまずき

Pythonでクローラーを作り始めると、最初にぶつかりやすいポイントがいくつかあります。

つまずき確認・対処ポイント
要素が見つからないページ構造が変わっている、CSSセレクターが正しくない、iframe内の要素を取得しようとしている、ページ読み込み前に取得している、などが原因として考えられます。まずは開発者ツールで対象要素を確認し、必要に応じてWebDriverWaitを使いましょう。
空白データになるJavaScriptによる表示が完了していない、スクロールしないとデータが表示されない、Ajax通信のレスポンスを待てていない、などが考えられます。待機処理やスクロール処理を見直しましょう。
403・429エラーが発生するアクセス頻度が高すぎる、同時実行数が多い、対象サイトが自動アクセスを制限している、などの可能性があります。まずは取得範囲、待機時間、実行頻度を見直し、対象サイトのルールを確認しましょう。
コードが急に動かなくなるサイト側のHTML構造やclass名が変更されると、これまで動いていたコードが失敗することがあります。定期的なメンテナンスやセレクターの見直しを前提にしましょう。

Pythonでの開発が向いている人・向いていない人

Pythonでクローラーを作る方法は、細かい処理ロジックを自分で制御したい場合や、社内システム・データベース・分析基盤と連携したい場合に向いています。

たとえば、取得対象URLを独自ルールで制御したい、取得後にデータ加工や機械学習処理につなげたい、社内の既存ツールと組み合わせたい、といったケースではPython開発の自由度が役立ちます。

一方で、できるだけ早くデータ取得を始めたい場合や、非エンジニアが運用する場合、コードの保守に時間をかけられない場合は、Pythonで自作するよりもノーコードツールを使ったほうが効率的なこともあります。

Python開発が向いているケースノーコードツールが向いているケース
細かいロジックを自由に実装したいできるだけ早くデータ収集を始めたい
社内システムやDBと連携したい非エンジニアでも運用できる方法を探している
エンジニアが継続的に保守できるコードの保守や環境構築に時間をかけたくない
大規模・複雑な処理を自社仕様で組みたい営業リスト作成、価格調査、レビュー収集などをすぐ業務に使いたい

コード不要で始めたいなら、Octoparseという選択肢もある

もし「Pythonを書くのはハードルが高い」「まずは動く形で早く試したい」と感じる場合は、

ノーコードで使えるスクレイピングツールを選ぶ方法もあります。

Octoparse なら、取得したいページのURLを入力し、ページ上のデータを自動識別したうえで、そのまま抽出フローを作成できます。

クリックやページ送り、スクロールなども画面上で設定できるため、コードを書かずにデータ取得を始めたい方には使いやすい選択肢です。

特に、営業リスト作成、EC価格調査、レビュー収集、競合監視など、

「まずデータ収集を業務で回したい」ケースでは、開発よりも運用のしやすさが重要になることも多いでしょう。

その場合、最初からツールを使うほうが効率的です。


まとめ

PythonとSeleniumを使えば、Webページを開き、必要な要素を取得し、CSVに保存する基本的なWebクローラーを作成できます。特にSeleniumは、JavaScriptで表示される動的ページや、クリック・スクロールなどのブラウザ操作が必要なページで役立ちます。

ただし、実務で継続的に使う場合は、ページ構造の変更、待機処理、エラー時のリトライ、取得済みURLの管理、robots.txtや利用規約の確認など、運用面の設計も欠かせません。

柔軟性を重視するならPython、スピードと運用のしやすさを重視するならOctoparseのようなノーコードツール、という形で目的に合わせて選ぶのがおすすめです。まずは小規模なテストから始め、安定性を確認しながら取得範囲を広げていきましょう。

クリックだけでウェブ データを取得
無料ダウンロード

人気記事

トピックを検索する

今すぐOctoparseを始めて、業務効率化を実現しましょう。

ダウンロード

関連記事