やりたいこと
- ログインが必要なサイトをスクレイピングする
- 対象サイトは別ファイルで一覧にする
- 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
・
・
・
実装時に出会ったエラーと解決方法はこちら