0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

PythonでスクレイピングしてExcelに書き出す

Last updated at Posted at 2024-06-13

自分メモ
業務で使用しているシステム(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()

無駄な動きもあると思いますが、とりあえずこれで思い通りの動きをしてくれます。
初心者なので、改善点等を指摘していただけたら助かります。

0
0
2

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?