タグ: スクレイピング

  • Selenium, BeautifulSoup スクレイピング入門

    Selenium, BeautifulSoup スクレイピング入門

    これは何?


    SeleniumとBeautifulSoupを使用して、一般的なWebスクレイピングを行う基本的な流れについての技術メモです。

    環境

    • Apple Silicon M1 MacBook Air
    • 16 Gb
    • macOS Sequoia 15.0
    • chromedriver version : ChromeDriver 129.0.6668.58
    • Google Chrome version : 129.0.6668.59(Official Build) (arm64)
    • 2024/09/18 現在の実行

    手順

    ディレクトリの作成と仮想環境の作成

    mkdir ScrapingTest
    cd ScrapingTest
    python -m venv nenv

    ライブラリのインストール

    • Selenium: Webブラウザを自動操作するためのライブラリです。JavaScriptで動的に生成されるページのスクレイピングに特に有効です。
    • BeautifulSoup: WebページのHTMLを解析し、指定したデータを抽出するためのライブラリです。
    pip install selenium beautifulsoup4 pandas webdriver-manager

    Chromeドライバーのインストールは以下の記事を参照してください。


    まず、Seleniumを使ってChromeブラウザを操作するために、ChromeDriverを設定します。webdriver_managerを使うことで、ChromeDriverを自動でインストールし、最新バージョンに対応させることができます。

    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from webdriver_manager.chrome import ChromeDriverManager
    from bs4 import BeautifulSoup
    import pandas as pd
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    # ChromeDriverのサービス設定
    service = Service(ChromeDriverManager().install())
    
    # ChromeDriverを初期化
    driver = webdriver.Chrome(service=service)

    次にアクセスしたいページを追加します。今回は私のサイトにしましたが、お好きなサイトで試してください。

    # ターゲットのWebページにアクセス
    driver.get('https://coiai.net')


    ページ全体がロードされるまで最大20秒待機します。指定された要素がロードされるのを待つことで、動的に生成されるコンテンツにも対応できます.

    # ページ全体のロードを待つ (20秒まで待機)
    WebDriverWait(driver, 20).until(
        EC.presence_of_element_located((By.TAG_NAME, 'body'))
    )


    BeautifulSoupを使って、HTMLソースを解析し、ページ内のデータを取得します。この例では、h2タグ内のデータを抽出します。

    # ページのソースをBeautifulSoupで解析
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    
    # h2タグのみを取得
    h2_tags = soup.find_all('h2')

    データをリストに格納します。

    # 抽出したデータをリストに格納
    test_list = []
    
    # 各h2タグの内容をリストに追加
    for h2 in h2_tags:
        test_list.append({
            'テストデータ': h2.text.strip()
        })

    データをCSVに書き出すようにしました。

    # データフレームに変換
    df = pd.DataFrame(test_list)
    
    # 結果を表示またはCSVに保存
    df.to_csv('test_data.csv', index=False)
    print(df)

    最後に開いたブラウザを閉じます。

    # ブラウザを閉じる
    driver.quit()

    まとめ

    全てを踏まえると以下のコードになります。
    こちらを適宜実行していただければ動作すると思います。

    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from webdriver_manager.chrome import ChromeDriverManager
    from bs4 import BeautifulSoup
    import pandas as pd
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    # ChromeDriverのサービス設定
    service = Service(ChromeDriverManager().install())
    
    # ChromeDriverを初期化
    driver = webdriver.Chrome(service=service)
    
    # ターゲットのWebページにアクセス
    driver.get('https://coiai.net')
    
    # ページ全体のロードを待つ (20秒まで待機)
    WebDriverWait(driver, 20).until(
        EC.presence_of_element_located((By.TAG_NAME, 'body'))
    )
    
    # ページのソースをBeautifulSoupで解析
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    
    # h2タグのみを取得
    h2_tags = soup.find_all('h2')
    
    # 抽出したデータをリストに格納
    test_list = []
    
    # 各h2タグの内容をリストに追加
    for h2 in h2_tags:
        test_list.append({
            'テストデータ': h2.text.strip()
        })
    
    # データフレームに変換
    df = pd.DataFrame(test_list)
    
    # 結果を表示またはCSVに保存
    df.to_csv('test_data.csv', index=False)
    print(df)
    
    # ブラウザを閉じる
    driver.quit()

    この例では、SeleniumとBeautifulSoupを使って、Webページからh2タグ内のテキストデータを抽出し、CSVに保存する方法を紹介しました。この手法を応用すれば、さまざまなWebサイトから必要なデータを自動的に取得することが可能です。

    Seleniumを使うことで、動的に生成されるコンテンツにも対応できるため、より複雑なページからのスクレイピングにも対応可能です。ぜひ試してみてください。

    これで、一般的なスクレイピングのやり方を解説する技術記事のベースが完成しました。必要に応じて、サンプルデータや具体的な利用ケースに合わせて調整してください。

  • スクレイピング chrome driver を実行するまで

    スクレイピング chrome driver を実行するまで

    これは何

    スクレイピングを実行するにあたって、chromedriver を導入するまでの記事です。


    ChromeDriver (クロームドライバー)とは、Google Chromeブラウザを自動的に操作するためのツールです。これは、WebDriverプロトコルを実装しており、主にウェブアプリケーションのテストを自動化するために使われます。ChromeDriverは、特にSeleniumというオープンソースの自動化フレームワークと組み合わせて使用され、ブラウザ操作をスクリプトで自動化する際に非常に便利です。


    🪴 実行環境

    • Apple Silicon M1 MacBook Air
    • 16 Gb
    • macOS Sequoia 15.0
    • chromedriver version : ChromeDriver 129.0.6668.58
    • Google Chrome version : 129.0.6668.59(Official Build) (arm64)
    • 2024/09/18 現在の実行

    🛠️ やり方

    まずは作業するディレクトリを作成します。

    mkdir scrapingTest

    venv モジュールを使用して仮想環境を作成する。
    venv という名前のディレクトリがカレントディレクトリに追加されます。

    python -m venv venv

    仮想環境有効化

    source venv/bin/activate

    必要なライブラリのインストール

    pip install requests beautifulsoup4 selenium
    • requests: ウェブページからデータを取得するライブラリ。
    • BeautifulSoup4: HTMLやXMLのデータを解析し、必要な情報を抽出するためのライブラリ。
    • Selenium: JavaScriptで生成されたコンテンツを扱うための自動化ライブラリ。動的なページにも対応。

    ChromeDriver のインストール

    ChromeDriver のインストール

    macの方はbrewをつかって入れます。

    brew install chromedriver

    Webサイトから落としたい方は最新安定版は以下リンクからお使いのOSに合ったものをダウンロードできるはずです。https://googlechromelabs.github.io/chrome-for-testing/#stable

    chromedriver のパスを確認する

    which chromedriver

    brew –prefix を使った確認は“No available formula with the name “chromedriver”. Did you mean chrome-cli?”と返ってくるため、できませんでした。解決方法はあると思いますが…。

    実行確認

    pythonファイルを作る

    touch scraper.py
    from selenium import webdriver
    
    # ChromeDriverのパスを指定
    driver = webdriver.Chrome(executable_path='/opt/homebrew/bin/chromedriver')
    
    # 例: Webページにアクセス
    driver.get('https://coiai.net')
    
    # ブラウザを閉じる
    driver.quit()

    私の場合出力されたパス名は/opt/homebrew/bin/chromedriverだったのでこれを当てはめています。

    上記ファイルを正しく実行できた場合は、一瞬私のブログが立ち上がって、ブラウザが閉じる動作をすると思います。
    ターミナルからの返答はありません。

    このような場合は失敗

    【ケース1】システム環境設定の問題

    実行すると下記のポップアップが出る場合があります。

    Appleは、“chromedriver”にMacに損害を与えたり、プライバシーを侵害する可能性のあるマルウェアが含まれていないことを検証できませんでした。

    その場合は システム環境設定 を開いてください。
    プライバシーとセキュリティ の項目をクリックして、下部までスクロールすると、 お使いの Mac を保護するために “chromedriver” がブロックされました。 と表示されているはずです。
    その右にある”このまま許可” のボタンを押下し、再度ターミナルで実行すればできます。

    【ケース2】ChromeDriver と Chrome のバージョン違いによるエラー

    もしここで以下のような返答があれば、お使いの Chrome と chromedriver のバージョンが合っていない可能性があります。

    Traceback (most recent call last):
      File "/Users/coiai/Code/scrapingTest/scraper.py", line 6, in <module>
        driver = webdriver.Chrome(service=service)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/coiai/Code/scrapingTest/venv/lib/python3.12/site-packages/selenium/webdriver/chrome/webdriver.py", line 45, in __init__
        super().__init__(
      File "/Users/coiai/Code/scrapingTest/venv/lib/python3.12/site-packages/selenium/webdriver/chromium/webdriver.py", line 66, in __init__
        super().__init__(command_executor=executor, options=options)
      File "/Users/coiai/Code/scrapingTest/venv/lib/python3.12/site-packages/selenium/webdriver/remote/webdriver.py", line 212, in __init__
        self.start_session(capabilities)
      File "/Users/coiai/Code/scrapingTest/venv/lib/python3.12/site-packages/selenium/webdriver/remote/webdriver.py", line 299, in start_session
        response = self.execute(Command.NEW_SESSION, caps)["value"]
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/coiai/Code/scrapingTest/venv/lib/python3.12/site-packages/selenium/webdriver/remote/webdriver.py", line 354, in execute
        self.error_handler.check_response(response)
      File "/Users/coiai/Code/scrapingTest/venv/lib/python3.12/site-packages/selenium/webdriver/remote/errorhandler.py", line 229, in check_response
        raise exception_class(message, screen, stacktrace)
    selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 129
    Current browser version is 128.0.6613.138 with binary path /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
    Stacktrace:
    0   chromedriver                        0x0000000102457ed4 cxxbridge1$str$ptr + 1906348
    1   chromedriver                        0x0000000102450344 cxxbridge1$str$ptr + 1874716
    2   chromedriver                        0x0000000102064264 cxxbridge1$string$len + 89492
    3   chromedriver                        0x000000010209a1dc cxxbridge1$string$len + 310540
    4   chromedriver                        0x0000000102099404 cxxbridge1$string$len + 306996
    5   chromedriver                        0x00000001020951b0 cxxbridge1$string$len + 290016
    6   chromedriver                        0x00000001020916c0 cxxbridge1$string$len + 274928
    7   chromedriver                        0x00000001020d2188 cxxbridge1$string$len + 539832
    8   chromedriver                        0x00000001020d1ac8 cxxbridge1$string$len + 538104
    9   chromedriver                        0x000000010209d134 cxxbridge1$string$len + 322660
    10  chromedriver                        0x000000010209dd84 cxxbridge1$string$len + 325812
    11  chromedriver                        0x000000010241ff90 cxxbridge1$str$ptr + 1677160
    12  chromedriver                        0x00000001024248fc cxxbridge1$str$ptr + 1695956
    13  chromedriver                        0x00000001024054b8 cxxbridge1$str$ptr + 1567888
    14  chromedriver                        0x00000001024251cc cxxbridge1$str$ptr + 1698212
    15  chromedriver                        0x00000001023f6a60 cxxbridge1$str$ptr + 1507896
    16  chromedriver                        0x0000000102441214 cxxbridge1$str$ptr + 1812972
    17  chromedriver                        0x000000010244136c cxxbridge1$str$ptr + 1813316
    18  chromedriver                        0x000000010244ffe4 cxxbridge1$str$ptr + 1873852
    19  libsystem_pthread.dylib             0x000000019abbf2e4 _pthread_start + 136
    20  libsystem_pthread.dylib             0x000000019abba0fc thread_start + 8
    
    chromedriver --version

    で返ってくるバージョン情報と
    chrome の更新はchromeの設定からchromeについて、からみられるバージョン情報を見比べてみてください。(場合によってはアップデートしましょう)

Home
About
Blog
Works
Contact