🦔

【Python】SeleniumでWebスクレイピングをする

2023/02/23に公開

概要

Chromeで検索を自動実行するプログラムを組んだ。検索ワードを渡して、それをGoogle検索するという単純な仕組み。主に、引用記事を参考にしているので、詳しく学びたい方はそちらへ。

準備

chromedriverが必要なので、ターミナルにて、下記コマンドを入力する。

brew install chromedriver --cask

コード

下記に全体コードを記載する。

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()

#Open Google
driver.get('https://www.google.com/')
time.sleep(2)

#search some word
search_box = driver.find_element("name", "q")
search_box.send_keys('スタビジ')
search_box.submit()
time.sleep(2)

#get the top website URL
g = driver.find_element(By.CLASS_NAME, "g")
r = g.find_element(By.TAG_NAME, "a")
r.click()
time.sleep(2)


#get screenshot
driver.maximize_window()
driver.save_screenshot('スタビジ.png')

#close browser
driver.quit()

注意点

seleniumがバージョンアップして、idやnameの指定方法が変わったっぽい。多くの記事では古い情報となっているので、下記に新しい書き方を記載する。

old API New API
Text Text
Text Text
find_element_by_id(‘id’) find_element(By.ID, ‘id’)
find_element_by_name(‘name’) find_element(By.NAME, ‘name’)
find_element_by_xpath(‘xpath’) find_element(By.XPATH, ‘xpath’)
find_element_by_link_text(‘link_text’) find_element(By.LINK_TEXT, ‘link_text’)
find_element_by_partial_link_text(‘partial_link_text’) find_element(By.PARTIAL_LINK_TEXT, ‘partial_link_text’)
find_element_by_tag_name(‘tag_name’) find_element(By.TAG_NAME, ‘tag_name’)
find_element_by_class_name(‘class_name’) find_element(By.CLASS_NAME, ‘class_name’)
find_element_by_css_selector(‘css_selector’) find_element(By.CSS_SELECTOR, ‘css_selector’)

古い書き方をすると、下記エラーが発生する。

AttributeError: 'WebDriver' object has no attribute 'find_element_by_name'

次に向けて

検索結果1位のサイトにアクセスして、スクリーンショットを撮る方法で詰まっていた。下記で質問したら回答いただけたので、一応記載。
https://stackoverflow.com/questions/75540507/can-run-driver-find-elementby-name-g0-for-selenium

引用

https://toukei-lab.com/selenium-python#i
https://stackoverflow.com/questions/72773206/selenium-python-attributeerror-webdriver-object-has-no-attribute-find-el
https://pythoninoffice.com/fixing-attributeerror-webdriver-object-has-no-attribute-find_element_by_xpath/

Discussion