Python

Python Webスクレイピング006(Amazonの人気商品取得)

Seleniumを使用したwebスクレイピング 006

前回(005)からの追加機能

  • 待機機能を実装したが結局2ページ目の値がうまく取得できなかった。

今回の事象の原因はそもそも読み込みが終わってない等の原因ではなくDOMの構成が1ページ目と2ページ目で微妙に違う事が判明。

とはいえ、今回待機処理の実装をしたので記載しておく

seleniumを使用した待機の実装方法は以下の2パターンがある。

  • 暗黙的な待機
  • 明示的な待機

暗黙的な待機は単純待機で指定した秒数を待機する。一方で、明示的な待機は指定の要素を読み込むまで待機させる事ができる。

●暗黙的な待機

driver = webdriver.Chrome()
driver.implicitly_wait(20)

●明示的な待機

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.ID, "element"))

これは指定した要素の読み込みが完了するまで最大30秒待機する。
指定する項目はID以外にもXPATH,LINK_TEXT,NAME,CLASS_NAME等が指定可能。
待機条件に関しても、読み込み完了以外に、”指定のボタンがクリック可能になったら”等がある。

from selenium import webdriver
import chromedriver_binary
import csv
import copy
import sys
import configparser 

######Explicit Waits モジュール####################################
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
#################################################################



search_list=''

config = configparser.ConfigParser() #インスタンス生成
config.read('config.ini') #読み込む設定ファイル
section1 = 'url'#セクションの指定

#指定したセクションから対象の値を取得
book_list = config.get(section1, 'book_list')
game_list = config.get(section1, 'game_list')
apparel_list = config.get(section1, 'apparel_list')
hobby_list = config.get(section1, 'hobby_list')

def SearchList():
    #コマンドラインからの入力取得
    
    
    while 1:
        try:
            input_list = input("検索したい欲しいものリストの番号を入力してください。\n1:本\n2:ゲーム\n3:アパレル\n4:おもちゃ\n※終了の場合はCtr + C\n")


            if input_list is "1":
                search_list = book_list
                break
            elif input_list is "2":
                search_list = game_list
                break
            elif input_list is "3":
                search_list = apparel_list
                break
            elif input_list is "4":
                search_list = hobby_list
                break
        except KeyboardInterrupt: #Crt-Cが入力された場合
            print("終了")
            sys.exit()





    driver = webdriver.Chrome()
    driver.get(search_list)
    contents = driver.find_elements_by_class_name('p13n-sc-truncated') #商品名称の取得

    lists = [] #2次元配列用


    for page in range(1,3): #2ページ目まで取得
        driver.get(search_list + "#" + str(2))
        #ID:zg_learnMore(最後の方のID)が読み込まれるまで待機(Max:30)
        WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.ID, "zg_learnMore")))
        try:
            i = 0
            for i in range(1,21):
                list = []
                list.append(i)
                list.append(contents[i].text)#ここが取れてない。。。
                lists.append(copy.copy(list)) #値渡しするためコピー作成
                list.clear

                
        except:
            print(sys.exc_info())
            driver.quit()

    driver.quit()

    print(lists)
    try:
        f = open('output.csv', 'w')
        writer = csv.writer(f, lineterminator='\n')
        writer.writerows(lists)
        f.close()
    except:
        f.close()

    sys.exit()


if __name__ == '__main__':
    SearchList()