Selenium+Pythonでブラウザの自動操作


Selenium とは?

ブラウザの操作を自動化するツールです。

https://docs.seleniumhq.org/
OS・ブラウザごとのWebDriverと合わせて使用します。

実行環境

オフィス用のPC上で実行することを想定して、今回はWindowsを使用します。
Windows10 Pro 1903

Python3の準備(Anaconda)

Pythonでも良いんですが、今回はAnacondaをインストールします。

https://www.anaconda.com/distribution/
Python 3.7 version をダウンロードしてインストール。

Anaconda Promptを開いて、パッケージをインストールします。

conda install beautifulsoup4
conda install selenium

WebDriverの配置

https://sites.google.com/a/chromium.org/chromedriver/downloads
Current ReleasesからChromeに対応したものをダウンロードし、パスが通るところ(環境変数Pathで設定された場所)に起きます。

Seleniumの動作の流れ

Seleniumの基本的な流れは以下です。
- Chromeを開く
- ページ内の要素を見つける
- 要素を操作する

今回は例として、Chromeでブラウザを操作して、Googleで猫画像を検索し、その画像が掲載されたHTMLファイルを作成して開きます。

今回のコード

import time 
import re
import csv
from selenium import webdriver
from bs4 import BeautifulSoup
import os

# get current path
path = os.getcwd()

# open chrome
driver = webdriver.Chrome()
driver.get('https://www.google.com')

time.sleep(1)

# input search form 
neko = driver.find_element_by_name("q")
neko.send_keys("猫");
neko.submit();

time.sleep(1)

# move image search page
nekoimg = driver.find_element_by_xpath('//*[@id="hdtb-msb-vis"]/div[2]/a')
nekoimg.click()

time.sleep(1)

# get page source
html = driver.page_source
bs = BeautifulSoup(html, "html.parser")

# select neko image 
rows = bs.findAll("img",src=re.compile("data:image/jpeg"))

with open("neko.html", "w", encoding='utf-8') as file:
# write html header
    file.write('<!DOCTYPE html>\n')
    file.write('<html>\n')
    file.write('<body>\n')

# write html body 
    for row in rows:
        if row.get("src") != None:
            str = '<img src=\"' + row.get("src") + '">\n'
            file.write(str)
# write html footer
    file.write('</body>\n')
    file.write('</html>\n')

# close browser
driver.get('file:///' + path + '/neko.html')

解説

まずはwebdriver.Chrome()でサイトを開き、driver.getでサイトを開きます。

  driver = webdriver.Chrome()
  driver.get('https://www.google.com')

Googleのサイトの検索ボックスに「猫」を入れて検索します。driver.find_element_by_nameで要素(今回だと検索ボックスのnameの値であるq)を指定します。

send_keysでフォームに文字列を入力し、submitで検索します。

neko = driver.find_element_by_name("q")
neko.send_keys("猫");
neko.submit();

検索画面が開いたら「画像」をクリックします。要素はxpathで指定します。

nekoimg = driver.find_element_by_xpath('//*[@id="hdtb-msb-vis"]/div[2]/a')
nekoimg.click()

driver.page_sourceでソースコードを取得し、BeautifulSoupでパースします。

html = driver.page_source
bs = BeautifulSoup(html, "html.parser")

findAllでimgタグのうち、data:image/jpegを含む文字列を検索します。

rows = bs.findAll("img",src=re.compile("data:image/jpeg"))

取得したimgタグをそのまま貼り付けます。

for row in rows:
    if row.get("src") != None:
         str = '<img src=\"' + row.get("src") + '">\n'
         file.write(str)

作成したファイルを開きます。

driver.get('file:///' + path + '/neko.html')