from bs4 import BeautifulSoup
import csv
import logging
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 設定値
login_id_1 = ""
password_1 = ""
login_id_2 = ""
password_2 = ""
formatter = '[%(asctime)s] %(levelname)s: %(message)s'
logging.basicConfig(level=logging.INFO, format=formatter)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
file_handler = logging.FileHandler('log_test.log', encoding='utf-8')
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(logging.Formatter(formatter))
logger.addHandler(file_handler)
logger.info("プログラム開始")
logger.info("chromedriver読み込み")
# Pathは\より\\にしたほうがエラーが起きにくい
# WIN:chromedriver.exe(Mac:no extension)
driver_path = "C:\\Users\\●●●\\chromedriver.exe"
driver = webdriver.Chrome(driver_path)
logger.info("WEBを開く")
url = "https://www.fit-portal.go.jp/mypage/UserLogin"
driver.get(url)
time.sleep(5)
logger.info("ID/PW認証")
login_id = driver.find_element(By.ID, 'loginPage:j_id3:username')
password = driver.find_element(By.ID, 'loginPage:j_id3:password')
login_bt = driver.find_element(By.NAME, 'loginPage:j_id3:j_id33')
time.sleep(2)
login_id.send_keys(login_id_1)
time.sleep(2)
password.send_keys(password_1)
time.sleep(2)
login_bt.click()
time.sleep(5)
logger.info("メニュー:認定設備")
top_niteisetsubi = driver.find_element(By.XPATH, '//*[@id="global_header"]/div[2]/div/table/tbody/tr/td[2]/div/ul/li[1]/a')
top_niteisetsubi.click()
time.sleep(5)
logger.info("認定設備一覧")
left_niteisetsubi_ichiran = driver.find_element(By.XPATH, '//*[@id="page:form:j_id48"]/div/a/div')
left_niteisetsubi_ichiran.click()
time.sleep(5)
logger.info("検索")
search_btn = driver.find_element(By.CLASS_NAME, "input_btn")
search_btn.click()
time.sleep(5)
logger.info("ページ遷移数を取得")
# 遷移するページ数を取得する(例:●件中1件~10件まで表示)
# ● // 10 + 1 回の遷移をおこなう
cnt_char = driver.find_element(By.CLASS_NAME, "pagenate_info").text
cnt_all = int(cnt_char.split('件')[0])
paginate_num = cnt_all // 10 + 1
logger.info(f'ページ遷移数:{paginate_num}')
# ヘッダーのみ書き込んでおく
header = ["No", "認定状態", "認定法区分","発電設備の区分", "出力区分", "設備ID", "発電設備の設置場所", "事業者名", "発電設備の出力(kW)", "申請の認定日", "発電設備の名称"]
logger.info("CSV出力(ヘッダーのみ)")
# CSV(utf-8)をExcelで読み込むと文字化けするためBOM(+_sig)を追加
with open('output.csv', mode='w', encoding='utf_8_sig', newline="") as f:
writer = csv.writer(f)
writer.writerow(header)
logger.info("ページ読み込みループ開始")
# 全ページを読み込み、テーブル(ヘッダー除外)データを書き込み
for page in range(0, paginate_num):
logger.info(f'{page + 1}/{paginate_num} ページを読み込み中')
page_source = driver.page_source
soup = BeautifulSoup(page_source, 'html.parser')
logger.info(f'実際の画面表示:「{driver.find_element(By.CLASS_NAME, "pagenate_info").text}」')
logger.info("テーブル全体を読み込み")
rows = soup.find(class_='list_table').find('tbody').find_all('tr')
logger.info("CSV出力(本体)")
# CSVへ書き込み(ヘッダー除外。1行空くためnewline)
with open('output.csv', mode='a', encoding='utf-8', newline="") as f:
writer = csv.writer(f)
logger.info("テーブルのセル情報を読み込み")
for i, row in enumerate(rows):
csvRow = []
if i == 0:
continue
for cell in row.find_all(['td', 'th']):
csvRow.append(cell.get_text())
writer.writerow(csvRow)
logger.info("CSV出力完了")
logger.info("次ページへ遷移")
# 次のページに遷移(paginate_btn next?)
next_page = driver.find_element(By.CSS_SELECTOR, "#page\:form\:j_id91 > div:nth-child(1) > ul > li.paginate_btn.next > a")
if page < paginate_num:
next_page.click()
time.sleep(2)
logger.info("ループ終了")
logger.info("webdriver終了処理")
driver.close()
driver.quit()
logger.info("プログラム終了")