【Python】Seleniumを利用したスクレイピングでよく使うプログラム集 | 合同会社ムジンケイカクプロ

【Python】Seleniumを利用したスクレイピングでよく使うプログラム集

python Python

指定したclassの数をカウントする

この回数分の処理を繰り返す。

    def check_datenum(self):   
        
        elements = self.driver.find_elements_by_class_name(self.key_class)

        return len(elements)

Xpathであいまい検索、ワイルドカード

Xpath自体はChromeのデバッグで、検証からコピーしています。

//*[@id="IDname_20211004"]/dd/ul[1]/li[1]/a
↑だった場合に
xpath= '//*[contains(@id,"IDname_")]/dd/ul[1]/li[1]/a'

URLの連番の一部をループで回して作ってしまう

##レース開催日分のレース詳細を取りに行く
## この時にclass内で第一レースのURLは予想して入れてしまう

for i in range(1, num+1):

  CD.key_URL = 'https://.jp/a' + str(i) + '0001/nav_btn'

  CD.table_name = 'detail'
  CD.key_tag = 'a'
  CD.ifstr = "nav_btn"

  CD.dget()
  linklists = CD.check_txtnum()
  print(linklists)

ドライバー準備のオプション設定

class DClass():

    def __init__(self):
        
        #ドライバー呼び出し
        self.driver_option()

    def driver_option(self):
    
        options = webdriver.ChromeOptions()
        options.add_argument('disable-infobars')
        options.add_argument('--no-sandbox')
        options.add_argument('--headless')
        options.add_argument('--window-size=1024,768')
        user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"
        options.add_argument('--user-agent=' + user_agent)

        driver = webdriver.Chrome(options=options);
        driver.implicitly_wait(25)
        driver.set_page_load_timeout(25)
        
        self.driver = driver

マルチスレッド化

windowsアプリ制作の時に使用。
そうしないとボタン動作でアプリは動作しているが、画面上はフリーズしたように見えてしまうため。

    def callback(self):
        th = threading.Thread(target=self.DF_MAKE)
        th.start()

対象URLのリトライ関連

        j = 0
        while j < 9:
            try:
                self.driver.get(self.key_URL)
                print("The page was loaded " + self.key_URL)
            except TimeoutException:
                j = j + 1
                print("Timeout, Retrying... (%(j)s/%(max)s)" % {'j': j, 'max': 9})
                time.sleep(15)
                continue
            else:
                break

        sleep(3)