【Python】Seleniumを利用したスクレイピングでよく使うプログラムサンプル集 | ムノログ 合同会社ムジンケイカクプロのITノウハウブログ
Pythonと機械学習

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

python Pythonと機械学習

pythonでスクレイピングする時のサンプル コードです。

指定したタグとクラスで要素をテキストで取り出しリストに格納、pandasのseriesに変換してリターン

#タグで要素取る  
def tag_get(self,tag1,tag2):

  #リスト初期化
  all_list = []

  for txt in self.res.find_all(tag1, class_ = tag2):
    #print(txt.text)
    all_list.append(txt.text)
  
  s = pd.Series(all_list)

  return s
html = self.driver.page_source.encode('utf-8')
res = BeautifulSoup(html, "lxml")   

tag1 = ‘p’はタグ
tag2 = ‘link’はクラス

リンクのaタグを見つけて、指定条件でリストに追加と置換

for element in elements.find_all("a"):

    url = element.get("href")

    if 'なんとか' in url:
        all_list.append(url)
    elif 'かんとか' in url:
        url = url.replace('かんとか', 'なんとか')
        url = uri + url
    elif '//' in url:
        url = url.replace('http://', 'https://')
    else:
        pass

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

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

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

        return len(elements)

find_element_by_class_nameは、Seleniumのバージョンにより非推奨になる。

By.CSS_SELECTOR

Seleniumのバージョンにより以下

driver.find_elements(By.CSS_SELECTOR,'div.class')

指定したCSSクラスでURLを見つけてリストに格納し、pandasデータフレームに格納

elements = driver.find_elements(By.CSS_SELECTOR,'div.heading > a')

elem_url=[]

for elem in elements:
    elem_url.append(elem.get_attribute("href"))
    
alink = pd.DataFrame(elem_url)

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)

HTMLタグ指定でのスクレイピング

driver.find_element(By.TAG_NAME, "h2")
Seleniumのバージョンによっては、もう動かないはず。非推奨かな?
find_elements_by_tag_name

CSS指定でのスクレイピング

複数クラス指定の一例

driver.find_element(By.CSS_SELECTOR,'.gLFyf.gsfi')

クラスとタグ指定

driver.find_elements(By.CSS_SELECTOR,'div.yuRUbf > a')

ID指定

driver.find_elements(By.CSS_SELECTOR,'#ID')

前方一致や後方一致もあるものの、あまり私が使わないため省略。

参考

【Python】Seleniumを利用したスクレイピングでよく使うプログラムサンプル集
【Python】Seleniumを利用したスクレイピングでよく使うスプレッドシートのプログラムサンプル集