0
0

More than 1 year has passed since last update.

ログインしてからキャプチャとHTMLを取得する

Last updated at Posted at 2021-11-18

やりたいこと

  • ログインが必要なサイトをスクレイピングする
  • 対象サイトは別ファイルで一覧にする
  • SSLのワーニングを無視する
  • 取得するのは、画面キャプチャとHTMLの内容

ソース

capture.py
# https://gaaaon.jp/blog/capture
# ↓でセレニウムをインストールしておく
# pip install selenium
# ↓インストールしているChromeと同じバージョンのドライバをダウンロードしてPathに通しておく
# https://sites.google.com/chromium.org/driver/
# https://sites.google.com/a/chromium.org/chromedriver/downloads
# https://posipochi.com/2021/04/25/python-scrape-sample/
#
# ↓でpandasをインストールしておく (CSV読み込み)
# pip install pandas

from selenium import webdriver
from selenium.webdriver.common.keys import Keys # webdriverからスクレイピングで使用するキーを使えるようにする
from selenium.webdriver.common.by import By #入力先指定のため
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import JavascriptException

import pandas as pd # CSVを利用するため
import time # sleepするため
import configparser # configファイル読み込みの為
import os

# distutils.util.strtobool() が非推奨になっていたので作成
def strtobool(targetStr):
    return targetStr.lower() in ["y", "yes", "t", "true", "on", "1"]

# 画面最小サイズを判定する関数
def getMinimumSize(driver, target, minSize):
    try:
        return driver.execute_script(target) if driver.execute_script(target) > minSize else minSize
    except JavascriptException:
        return minSize

# configの読み込み
config_ini = configparser.ConfigParser()
config_ini.read('capturepy_config.ini', encoding='utf-8')

page_width = int(config_ini['screen']['minimumWidth'])
page_height= int(config_ini['screen']['minimumHeight'])
screenShotFlg=strtobool(config_ini['output']['screenShotFlg'])
getHtmlFlg=strtobool(config_ini['output']['getHtmlFlg'])


# 出力先Dirの作成
loginId=config_ini['login']['loginIdInputValue']
outputDir=config_ini['output']['outputDir']
outpudDir=outputDir if outputDir.endswith('\\') else outputDir + '\\' # \終わりにする
outpudDir=outpudDir + '\\' + loginId + '\\'# loginIdごとにフォルダを分ける
os.makedirs(outpudDir, exist_ok=True)

# web driver の設定
op = Options()
op.add_argument('--ignore-certificate-errors')
op.add_argument('--ignore-ssl-errors')
op.add_experimental_option('excludeSwitches', ['enable-logging'])
op.use_chromium = True
if strtobool(config_ini['screen']['hideBrowserFlg']):
    op.add_argument('--headless')

driver = webdriver.Chrome(options=op)

# loginUrlが存在する場合は、ログイン処理を行う
if config_ini['login']['loginUrl']:
    driver.get(config_ini['login']['loginUrl'])
    driver.find_element(by=By.XPATH, value=config_ini['login']['loginIdElementValue']).send_keys(loginId)
    driver.find_element(by=By.XPATH, value=config_ini['login']['passwordElementValue']).send_keys(config_ini['login']['passwordInputValue'])
    driver.find_element(by=By.XPATH, value=config_ini['login']['loginButtonElementValue']).click()
    time.sleep(1)
    driver.set_window_size(getMinimumSize(driver, 'return document.body.scrollWidth', page_width), getMinimumSize(driver, 'return document.body.scrollHeight', page_height))
    driver.save_screenshot(outpudDir + "000_loginResult" + ".png")

# CSVから対象URLを読み込み
data = pd.read_csv(config_ini['input']['targetUrlCSV'], header=None)
urls = list(data[0])
#urls = ["https://qiita.com/login?redirect_to=%2F"]

prefix_num = 1

for url in urls:
    driver.get(url)
    driver.set_window_size(getMinimumSize(driver, 'return document.body.scrollWidth', page_width), getMinimumSize(driver, 'return document.body.scrollHeight', page_height))
    url_name = url.lstrip("https://" "http://" ).replace("/","_").replace("?", "_").replace(":", "_")
    
    if screenShotFlg:
        driver.save_screenshot(outpudDir + str(prefix_num).zfill(3) + "_" + str(url_name) + ".png")
    
    if getHtmlFlg:
        f = open(outpudDir + str(prefix_num).zfill(3) + "_" + str(url_name) + ".html", 'w', encoding='utf-8')
        f.writelines(str(driver.page_source))
        f.close()

    prefix_num += 1
    
driver.quit()

capturepy_config.ini
[login]
loginUrl=https://qiita.com/login?redirect_to=%2F
loginIdInputValue=loginid
passwordInputValue=password123
# ↓ユーザID・パスワード入力先とログインボタンをXPATHで指定する
loginIdElementValue=//*[@id="identity"]
passwordElementValue=//*[@id="password"]
loginButtonElementValue=/html/body/div[1]/div/div/div/div[2]/div[2]/form/div[3]/input

[input]
targetUrlCSV=urls.csv

[output]
outputDir=C:\Users\user\out
# 画像取得するかどうか ["y", "yes", "t", "true", "on", "1"](大文字小文字問わず)
screenShotFlg=yes
# HTMLを取得するかどうか ["y", "yes", "t", "true", "on", "1"](大文字小文字問わず)
getHtmlFlg=y

[screen]
minimumWidth=1280
minimumHeight=768
# ブラウザ非表示にするかどうか ["y", "yes", "t", "true", "on", "1"](大文字小文字問わず)
hideBrowserFlg=y

urls.csv(iniファイルのtargetUrlCSVで指定したファイル)
対象のURL
 ・
 ・
 ・

XPATHは、開発者ツールからコピーできる
image.png

実装時に出会ったエラーと解決方法はこちら

0
0
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
0
0