Selenium初体験
動的な要素を持つサイトをスクレイピングしなければいけなくなったので、仕方なくSeleniumを学び始めました。
pip install selenium
ブラウザはChromeを使用したいのでChromeDriverをダウンロードして仮想環境下に移動させます。
私は /bin へ移動しました。
早速動くかどうかやってみます。検証はYahoo!をURLとして。
test.py
import os
import time
from selenium import webdriver
DRIVER_PATH = os.path.join(os.path.dirname(__file__), 'chromedriver')
browser = webdriver.Chrome(DRIVER_PATH)
browser.get('https://www.yahoo.co.jp')
try:
elem_1 = browser.find_element_by_class_name('emphasis')
print ('<{}>発見!'.format(elem_1.text))
time.sleep(3)
except:
print ('ないよ')
(flaskworks) $ python test.py
<GDP 年1.0%増に下方修正
加計問題 首相答弁に矛盾写真NEW
英テロ容疑者おじ 怒りの証言写真
群馬に富士山? 誤解招く駅名写真NEW
元アイドル バーテンダーNo.1写真
田中は言語覚えろ 解説者謝罪写真NEW
本田 試合直後に受動喫煙語る写真
山崎アナ おばたと交際認める写真NEW>発見!
無事動くことを確認。
ページ送りも試してみます。
test.py
import os
import time
from selenium import webdriver
DRIVER_PATH = os.path.join(os.path.dirname(__file__), 'chromedriver')
browser = webdriver.Chrome(DRIVER_PATH)
browser.get('https://www.yahoo.co.jp')
try:
link_elem = browser.find_element_by_link_text('もっと見る')
link_elem.click()
text_elem = browser.find_element_by_class_name('ttl')
print (text_elem.text)
time.sleep(3)
except:
print ('ないよ')
(flaskworks)$ python test.py
北朝鮮が未詳の発射体を発射
あれ? 1件しか取得出来ないですね。
link_elem = browser.find_element_by_class_name('list')
書き換えると、
(flaskworks) $ python test.py
北朝鮮が未詳の発射体を発射
国際
6/8(木) 7:42
錦織敗退 悔いはタイブレイク
スポーツ
6/8(木) 5:10
錦織逆転負け 全仏4強ならず
スポーツ
6/8(木) 2:12
北朝鮮 弾道ミサイル発射兆候
国際
....以下省略
なるほど。もしかするとこれBeautifulSoupより楽なんじゃないですかね。
複数ページを自動巡回するカスタム
ざっくりページパラメータを足していくだけのやつです。結局次へ、をクリックしているので処理としては美しくないですね。もっといいやり方があると思うんですが、初めたばかりなのでこれが限界。
test.py
import os
import time
from selenium import webdriver
DRIVER_PATH = os.path.join(os.path.dirname(__file__), 'chromedriver')
browser = webdriver.Chrome(DRIVER_PATH)
url = 'https://news.yahoo.co.jp/list/?c=domestic&p='
a = 0
i = 1
while a < 5:
a += 1
try:
browser.get(url)
link_elem = browser.find_element_by_link_text('次へ')
link_elem.click()
text_elem = browser.find_element_by_css_selector('.list')
print (text_elem.text)
time.sleep(3)
i += 1
url = 'https://news.yahoo.co.jp/list/?c=domestic&p=' + str(i)
except:
print ('ないよ')