LoginSignup
1
2

More than 3 years have passed since last update.

Selenium+Pythonでスクレイピングその1

Last updated at Posted at 2020-05-23

前回のおさらい

前回Goutteを使ってログイン後のページ情報を取ろうとするも、画像認証によって惨敗しました。
https://qiita.com/shioharu_/items/818154ac145c78076487

なので今回は手段を変え、Selenium+Pythonでスクレイピングをしようかと思います!

導入

Windows10でVagrant、VirtualBoxを用いて、
仮想環境のCentOS7.0にSelenium、Python、ChromeDriverを導入します。

先人の知恵を参考に導入しました。
https://worklog.be/archives/3422

使ってみる

sample.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1280,1024')

driver = webdriver.Chrome(options=options)
driver.get('https://www.yahoo.co.jp/')

driver.save_screenshot('test.png')
driver.quit()

いざ実行
python sample.py

test_.png

無事、yahooのトップページがキャプチャーされたのでサンプルは大丈夫そうですね!

前回の課題

前回は画像認証があって、ログイン後の画面を表示することができませんでした。
Seleniumなら待機処理があるのでその間に手動でログインすれば画像認証のページにもいけるはず!
と考えておりましたが、Chromeのプロフィールパスを指定してあげることで指定したプロフィールの状態を維持してくれることがわかりました。
https://rabbitfoot.xyz/selenium-chrome-profile/

つまるところあらかじめ手動でログインした状態のプロフィールパスを指定してあげればよいということですね。
それは簡潔になってありがたい。

今回は仮想環境のCentOSを使っているわけなので、マウント先にwindows環境のシンボリックリンクを貼ればそこから参照してくれるのではと考えました。

mklink /J "C:\Users\[ユーザー名]\Desktop\work\vagrant\User Data" "C:\Users\[ユーザー名]\AppData\Local\Google\Chrome\User Data"

サンプルソースを書き換えて実行してみます

sample2.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1280,1024')
options.add_argument('--user-data-dir=シンボリックリンクを貼ったプロフィールパス')

driver = webdriver.Chrome(options=options)
driver.get('https://p.eagate.573.jp/game/2dx/27/ranking/weekly.html')

driver.save_screenshot('test2.png')
driver.quit()

ところがどっこい

そこには無慈悲にも非ログイン状態の画像がキャプチャされました…

hilogin.png

原因としてはやはりプロフィールパスの参照がうまくいっておりませんでした。
仮想環境にインストールしているchromeのプロフィールとwindows側のchromeのプロフィールの違いなどありますからね…
ということで無理に仮想環境で縛る意味も特にないのでwindows側にPythonとSeleniumを導入し実行したいと思います。

Windows側の環境設定

参考:https://mylife8.net/install-selenium-and-run-on-windows/

Python

https://www.python.org/downloads/
インストーラに沿うだけなので特記事項なし

Selenium

Python 導入後、コマンドプロンプトから以下の実行でインストール可能です。
pip install selenium

ChromeDriver

https://sites.google.com/a/chromium.org/chromedriver/downloads
Chromeのバージョンと同じChromeDriverをダウンロードしましょう。
chromedriver.exeの配置場所はどこでもよいのですが、わかりやすくPythonと同じところに置きました。
C:\Users\[ユーザー名]\AppData\Local\Programs\Python\Python38\chromedriver.exe

環境変数のPATHも上記で設定しました。

windows側から実行

事前にChromeから https://p.eagate.573.jp/game/2dx/27/ranking/weekly.html でログインを済ませて、
Chromeを閉じておきましょう。
ソースを以下に書き換え実行!

sample3.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1280,1024')
options.add_argument('--user-data-dir=C:\\Users\\[ユーザー名]\\AppData\\Local\\Google\\Chrome\\User Data')

driver = webdriver.Chrome(options=options)
driver.get('https://p.eagate.573.jp/game/2dx/27/ranking/weekly.html')

driver.save_screenshot('test3.png')
driver.quit()

無事、取れました!
screencapture-p-eagate-573-jp-game-2dx-27-ranking-weekly-html-2020-05-10-13_26_24.png

実際に欲しい部分はランキングの部分なのでランキングの部分に到達できるか実験。
目的の部分を表示させるため、クリックを行ったりページ位置を調節したりしてみます。

sample4.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1280,1024')
options.add_argument('--user-data-dir=C:\\Users\\[ユーザー名]\\AppData\\Local\\Google\\Chrome\\User Data')

driver = webdriver.Chrome(options=options)
driver.get('https://p.eagate.573.jp/game/2dx/27/ranking/weekly.html')
driver.find_element_by_xpath("/html/body/div/div[1]/div/div/div[2]/div/div[2]/form/div[2]/ul[1]/li[3]/input").click()
time.sleep(3)

driver.execute_script("window.scrollTo(0, 800)")
time.sleep(3)

driver.save_screenshot('sample.png')
driver.quit()

大丈夫そうです!
_sample.png

総評

  • ようやく画像認証が必要なページをスクレイピングするところまでたどり着けました…
  • 今回はキャプチャでしたが次回は実際にデータを取得して加工していこうと思います。
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2