【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サイトやギャラリーなどのサイトのスクレイピングに非常に有効です。
待機処理時間を短くしたり、長くしたりすることで工夫の余地があります。
この記事が気に入ったらサポートをしてみませんか?