見出し画像

【Python】Amazon selenium スクレイピング 全ページ取得とスクロール

解説動画はこちらから

実際のコード

検索窓のIDが変化することがあるのでエラー処理をしています。

# -*- coding: utf-8 -*-
"""
Created on Wed Oct 12 16:23:14 2022

@author: Tomita
"""

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

# wait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

# selenium 4.0 ↑
from selenium.webdriver.common.by import By
from time import sleep


chrome_options = Options()
# chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options) 

HREFS = []

# URL開く
driver.get("https://www.amazon.co.jp/ref=nav_logo")
# 待機処理
# driver.implicitly_wait(10)
sleep(10)
wait = WebDriverWait(driver=driver, timeout=60)

#検索窓
Word = "キーボード"
try:
    driver.find_element(By.ID, "nav-bb-search").send_keys(Word)
except :
    driver.find_element(By.ID, "twotabsearchtextbox").send_keys(Word)
    
sleep(1)
driver.find_element(By.ID,"nav-search-submit-button").click()

while True:
    #待機処理
    wait.until(EC.presence_of_all_elements_located)
    #ブラウザのウインドウ高を取得
    win_height = driver.execute_script("return window.innerHeight")
    
    #スクロール開始位置の初期値(ページの先頭からスクロールを開始する)
    last_top = 1
    
    #ページの最下部までスクロールする無限ループ
    while True:
    
      #スクロール前のページの高さを取得
      last_height = driver.execute_script("return document.body.scrollHeight")
      
      #スクロール開始位置を設定
      top = last_top
    
      #ページ最下部まで、徐々にスクロールしていく
      while top < last_height:
        top += int(win_height * 0.8)
        driver.execute_script("window.scrollTo(0, %d)" % top)
        sleep(0.5)
    
      #1秒待って、スクロール後のページの高さを取得する
      sleep(1)
      new_last_height = driver.execute_script("return document.body.scrollHeight")
    
      #スクロール前後でページの高さに変化がなくなったら無限スクロール終了とみなしてループを抜ける
      if last_height == new_last_height:
        break

    #次のループのスクロール開始位置を設定
    last_top = last_height
    
    #商品URLの取得
    URLS = driver.find_elements(By.CSS_SELECTOR,"a.a-link-normal.s-no-outline")
    
    for URL in URLS:
        URL = URL.get_attribute("href")
        print("[INFO] URL :", URL)
        HREFS.append(URL)
        
    #待機処理
    wait.until(EC.presence_of_all_elements_located)

    # 次のページへ
    try:
        try:
            next_btn = driver.find_element(By.CSS_SELECTOR, ".s-pagination-next.s-pagination-separator")
            next_btn.click()
        except KeyboardInterrupt:
            break
    except:
        break
    

コピペで動きます

スクロール動作は他のJavaScriptで動作するECサイトやギャラリーなどのサイトのスクレイピングに非常に有効です。

待機処理時間を短くしたり、長くしたりすることで工夫の余地があります。

この記事が気に入ったらサポートをしてみませんか?