seleniumでスクレイピング(次のページ対応)

Colaboratoryを使ってください

colab.research.google.com

Seleniumのインストール

!apt install chromium-chromedriver
!cp /usr/lib/chromium-browser/chromedriver /usr/bin
!pip install selenium
import time

from bs4 import BeautifulSoup

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.chrome.options import Options

options = webdriver.ChromeOptions()
options.add_argument("--headless")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")

driver = webdriver.Chrome("chromedriver", options=options)
driver.implicitly_wait(10)

driver.set_window_size(1280, 720)

driver.get("http://example.jp")

# メインのウインドウ
parent_window = driver.current_window_handle

n = 1

while True:

    # URL表示
    print(driver.current_url)

    for i in driver.find_elements_by_link_text("XXXXX"):

        time.sleep(3)

        i.click()

        # ウインドウ切替
        driver.switch_to.window(driver.window_handles[-1])

        # ソース取得
        html = driver.page_source.encode("utf-8")
        soup = BeautifulSoup(html, "html.parser")

        # スクレイピング処理

        # script・styleを除去
        for script in soup(["script", "style"]):
            script.decompose()

        # テキスト化
        text = soup.get_text("\n", strip=True)

        # テキストファイルに保存
        with open(f"result-{n:05}.txt", mode="w") as fw:
            fw.write(text)

        n += 1

        # スクリーンショット
        # driver.save_screenshot("ss.png")

        # ウインドウを閉じる
        driver.close()

        # メインのウインドウに戻る
        driver.switch_to.window(parent_window)

    # 次のページ
    try:
        driver.find_element_by_css_selector("XXXXX").click()

    # 見つからない場合は終了
    except NoSuchElementException:
        driver.quit()
        break

ファイル圧縮

!zip data result*.txt