自分メモ
業務で使用しているシステム(made by Excel)に郵便番号から配達局をオフラインで検索する機能を実装するため、全国の郵便番号と配達局のデータベースが必要になりましたが、なかったのでデータベースを作成するためのコードを書きました。
郵便番号リストは日本郵便のHPからダウンロードします。
郵便番号だけほしかったので、郵便番号リストをExcelで保存して、郵便番号がA列に来るよう余計なデータを削除し、頭が0の郵便番号は7桁になっていないので、ExcelVBAで桁を揃えました。
スクレイピング前のリストには、A列に郵便番号が入力されているだけの状態です。
このコードを動かすと、スクレイピングでB列に配達局の名前、C列に配達局の郵便番号と住所が入力されます。
完成前に中断しても、コードを書き換えずに途中から再開します。
画面が切り替わったとき、time.sleep(1) でエラーが出ずに進みました。
一応、確認しましたが、スクレイピングを規制するような利用規約は見当たりませんでした。
import openpyexcel
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
workbook = openpyexcel.load_workbook('結果を書き出すブック名.xlsx')
sheet = workbook['シート名']
maxRow = sheet.max_row + 1
maxClm = sheet.max_column + 1
# 列を指定(例:3列目=C列)
target_column = 3 #C列を指定
# 行を逆ループして最終行を探す 逆ループだと失敗したから消した 表にヘッダーが必要
for i in range(1, maxRow):
if sheet.cell(row=i, column=target_column).value is not None:
saisyugyo = i
driver = webdriver.Edge()
driver.get('https://www.post.japanpost.jp/shiten_search/')
#日本郵便HPゆうゆう窓口検索画面
LastRow = sheet.max_row
for i in range(saisyugyo + 1, LastRow):
driver.get('https://www.post.japanpost.jp/shiten_search/')
cell_a = sheet.cell(row=i, column=1).value #A列
driver.find_element(By.NAME, 'zip').send_keys(cell_a) #A列の郵便番号を入力
time.sleep(1)
driver.find_element(By.ID,'number').submit() #検索ボタンをクリック
time.sleep(1)
search_path = '//*[@id="main-box"]/div/form/table/tbody/tr[2]/td[1]/a'
driver.find_element(By.XPATH, search_path).click() #検索結果のリストから郵便局名をクリック
time.sleep(1)
GetOfficeName = driver.find_element(By.TAG_NAME, 'h1').text #配達局名をB列に書き込む
sheet.cell(row=i, column=2).value = GetOfficeName
GetAddress = driver.find_element(By.CLASS_NAME, 'wrap').text #配達局の郵便番号、住所をC列に書き込む
sheet.cell(row=i, column=3).value = GetAddress
workbook.save('結果を書き出すブック名.xlsx')
driver.quit()
無駄な動きもあると思いますが、とりあえずこれで思い通りの動きをしてくれます。
初心者なので、改善点等を指摘していただけたら助かります。