🛃

HSコードのCSVを出力する

2023/07/24に公開

TL;DR

ここからダウンロードしてください。
https://drive.google.com/file/d/1_nPDITqOpXVMKOF-cuo4RGy-opTOtteG/view?usp=drive_link

概要

ボンジュルノ、にわとろです。最近越境ECに挑戦してみようかと日本の輸出品目の統計を見ていたのですが、e-Statからダウンロードすると品目名が全てHSコードで表されていることに気付きました。HSコードとは、海外とやり取りされる荷物に種類に応じて割り振られる番号のことです。EMSで海外に荷物を発送したことのある方は、送り状を書くときに税関のサイトで中身に対応する番号を調べた経験があるんじゃないでしょうか。

ところでこのHSコード、一覧表がありません。調べたければ一々税関のサイトに行って一つひとつ検索するしかありません。しかもサイトはやけに遅くて変な効果がかかっており、スクロールもままなりません。そこで、このHSコードと品目の対応表をcsvで作成することにしました。

実装

PythonでBeautifulSoupを使ってスクレイピングします。幸い税関のサイトには類別毎に分けられた対応表があるので、類別さえ知ることができれば事足ります(全部まとめてほしい)。そこで、まずホームページで類別を全て取得した後にそれぞれの類別のページに飛んでスクレイピングを繰り返します。

結局、完成したコードは次のようになりました。

import re
import requests
import time
import pandas as pd
from bs4 import BeautifulSoup
from time import sleep

hs_codes = []

# ホームページを取得
index_html = requests.get("https://www.customs.go.jp/yusyutu/2022_12_01/").content
index_soup = BeautifulSoup(index_html)

index_trs = index_soup.find_all("tr")
for tr in index_trs:
  tds = tr.find_all("td")
  code = re.sub("[^0-9]","",tds[0].text)
  content = tds[1].text

  hs_codes.append([code,content])

# 個別のページについて取得
for j in range(1,len(index_trs)+1):  
  j_soup = BeautifulSoup(requests.get("https://www.customs.go.jp/yusyutu/2022_12_01/data/print_j_"+str(j).zfill(2)+".htm").content)
  # 神奈川県警の侵入を防止
  sleep(1)

  # 最初のヘッダー諸々を飛ばす
  trs = j_soup.select("table:nth-child(4) tr")[2:]

  td_rows = []
  for tr in trs:
    td_rows.append([td.text for td in tr.find_all("td")][:3])

  # 行ごとの処理を開始
  new_rows = []
  for i in range(len(td_rows)):
    row = td_rows[i]
    main_code = row[0]
    if main_code == "":
      try:
        main_code = new_rows[-1][0]
      except:
        continue

    sub_code = td_rows[i][1]

    categories = []
    # 税関はハイフンではなくマイナス記号を使うので注意
    priority = re.match("−",row[2]).group().count("−") if "−" in row[2] else 0
    # 下位分類になるほど上位分類が省略されているので、一つ前の処理結果を使って補間
    for k in range(priority):
      categories.append(new_rows[-1][k+1])
    categories.append(td_rows[i][2])

    new_rows.append([(main_code+sub_code).replace(".",""),*categories])

  # このページ分の処理結果を戻す
  for new_row in new_rows:
    hs_code = new_row[0]
    content = " ".join([item for item in new_row[1:] if item != ""]).replace("−","-")
    if content != "":
      hs_codes.append([hs_code,content])
   
# pandasでcsvに書き込む
pd.DataFrame(hs_codes,columns=["hscode","content"]).to_csv("hscodes.csv",index=False)

過去記事

https://zenn.dev/niwatoro/articles/180f6185c382bb
https://zenn.dev/niwatoro/articles/51f22ab69e0c9b

Discussion