前回はScrapyによるスクレイピングをやりましたが、今回はseleniumを使ってスクレイピングをしていきます。
BeautifulSoupより高度なスクレイピングができ、(個人的には)Scrapyより扱いやすいなと感じました。
ではさっそくやっていきましょう。
seleniumとは
seleniumとはブラウザ(GoogleChromeとかFirefoxとか)を自動操作し、ボタンをクリックしたりスクロールしたりスクショを撮ったりすることができるUIテストツールのことです。
もともとはWebテストに使うように開発されていたそうですが、スクレイピングにも応用できるということで、今ではそのような使い方もされています。
スクレイピングしていこう
準備するもの
最初から必要なのは
- jupyternotebook
- Anaconda prompt(or powershell)
です。
driverを準備する
seleniumを使うにはまず、driverというものをインストールしなくてはいけません。これによってブラウザを操作してスクレイピングを行います。
driverはブラウザによって違うものを使います。Chromeを今回は使っていきたいので専用のdriverをインストールしていきます。
まず、 公式サイトにアクセスしdriverをインストールしていきます。
ぼくは「ChromeDriver 76.0…..」をダウンロードしました。

お使いのブラウザに合わせてダウンロードしましょう。(間違っていると使うことができません。)

お使いのOSを選んでzipファイルをダウンロードします。
zipファイルがダウンロード出来たら展開しておきましょう。
seleniumをインストール
次にseleniumをインストールします。
Anacondapromptで
pip install selenium
としてインストールします。
titleとurlをスクレイピング
さて、準備が整いました。さっそくスクレイピングしていきましょう。
今回もぼくのサイト記事のtitleとurlをスクレイピングしていきます。
同じだとつまらないのでseleniumで自動操作させながらスクレイピングしていきたいと思います。
具体的にいうと
- キーワードを検索
- ページを移動してスクレイピング
という機能をつけてみました。
ではコーディングしていきましょう。
コーディング
from selenium import webdriver import pandas as pd from pandas import DataFrame,Series import time #Access to page driver = webdriver.Chrome(executable_path="chromedriver_win32/chromedriver.exe") #"python"でサイト内検索 kw = "python" url = "https://imagisi.com/?s="+kw driver.get(url) page = 1 #This number shows the number of current page later columns = ["url","title"] df = pd.DataFrame(columns=columns) #スクレイピング処理 while True: if len(driver.find_elements_by_css_selector("a.pagination-next-link")) > 0: print("######################page: {} ########################".format(page)) print("Starting to get posts...") links = driver.find_elements_by_css_selector(".a-wrap") #title,urlを読み取ってデータフレームに追加 for href in links: url = href.get_attribute("href") title = href.find_element_by_css_selector("h2").text se = pd.Series([url, title],columns) df = df.append(se, columns) print(df) #次のページへ遷移するリンクを探して移動 btn = driver.find_element_by_css_selector(".pagination-next-link").get_attribute("href") print("next url:{}".format(btn)) driver.get(btn) page+=1 driver.implicitly_wait(10) print("Moving to next page......") time.sleep(10) #次のページのリンクがないときは処理をした後スクレイピングを終える elif len(driver.find_elements_by_css_selector("a.pagination-next-link")) == 0: print("######################page: {} ########################".format(page)) print("Starting to get posts...") links = driver.find_elements_by_css_selector(".a-wrap") for href in links: url = href.get_attribute("href") title = href.find_element_by_css_selector("h2").text se = pd.Series([url, title],columns) df = df.append(se, columns) print(df) #スクレイピングを終える print("no pager exist anymore") break #csvに保存 df.to_csv(kw + ".csv",encoding='utf_8_sig') print("DONE") driver.close()
モジュールのインストール
はじめから解説していきます。
from selenium import webdriver import pandas as pd from pandas import DataFrame,Series import time
まず、必要なモジュールをインストールします。
driverのパスを通す・キーワードで検索できるようにする
driver = webdriver.Chrome(executable_path="chromedriver_win32/chromedriver.exe") kw = "python" #"python"でサイト内検索 url = "https://imagisi.com/?s="+kw driver.get(url)
次に先ほどダウンロードしたdriverのパスを通します。
そのあとスクレイピングするurlを取得します。サイト内検索のurlを設定し、キーワード(kw)で検索できるようにします。
繰り返し処理
if len(driver.find_elements_by_css_selector("a.pagination-next-link")) > 0: print("######################page: {} ########################".format(page)) print("Starting to get posts...") links = driver.find_elements_by_css_selector(".a-wrap") #title,urlを読み取ってデータフレームに追加 for href in links: url = href.get_attribute("href") title = href.find_element_by_css_selector("h2").text se = pd.Series([url, title],columns) df = df.append(se, columns) print(df) #次のページへ遷移するリンクを探して移動 btn = driver.find_element_by_css_selector(".pagination-next-link").get_attribute("href") print("next url:{}".format(btn)) driver.get(btn) page+=1 #10秒待つ driver.implicitly_wait(10) print("Moving to next page......") time.sleep(10)
ここで、繰り返し処理をしてtitleとurlを取ってきます。
ほしい情報が取れたら”.pagination-next-link”をクリックさせて次のページに遷移します。そして同じ処理を繰り返します。その際サーバーに負荷をかけないよう10秒止めます。
最終ページまで進んだ場合
elif len(driver.find_elements_by_css_selector("a.pagination-next-link")) == 0: print("######################page: {} ########################".format(page)) print("Starting to get posts...") #get all posts in a page links = driver.find_elements_by_css_selector(".a-wrap") for href in links: url = href.get_attribute("href") title = href.find_element_by_css_selector("h2").text se = pd.Series([url, title],columns) df = df.append(se, columns) print(df) #スクレイピングを終える print("no pager exist anymore") break
次は最終ページに来た後の処理です。次のページがもうないので得たい情報を得た後はスクレイピングを終えます。
csvに保存してブラウザを閉じる
df.to_csv(kw + ".csv",encoding='utf_8_sig') print("DONE") driver.close()
最後にcsvに出力し、ブラウザを閉じます。

“python.csv”という名前でこのように保存されていたら成功です。
参考





