弁護士は,それぞれ固有の「弁護士登録番号」を持っています。
弁護士の所属事務所や事務所住所・電話番号等の情報は,日弁連の「弁護士検索」を通じて入手することができますが,トップページから適切な遷移を経て検索しなければ取得できません。
そこで,会員番号からそれらの情報にアクセスするAPIを作ってみます。
なお,節度を持ったアクセスに留めた方が無難かと思います。
使ったライブラリ
- Flask
- requests
- BeatifulSoup4
手順
検索のトップページにアクセスし,セッションごとに設定されるトークンを取得します。
その上で,詳細検索URLにそのトークンを含むリクエストをポストして,検索結果のHTMLを得ます。
あとはそのHTMLを解析して,データの形にします。
from flask import Flask, jsonify, abort, make_response
import requests
from bs4 import BeautifulSoup
app = Flask(__name__)
URL_top = "https://www.nichibenren.jp/member_general/lawyerandcorpsearchselect/corpInfoSearchInput/changeBarSearch/"
URL_search_detail = "https://www.nichibenren.jp/member_general/lawyer/lawyerSearchResultsList/showMembersDetailedInfo"
@app.route('/infoOf/<int:reg_no>', methods=['GET'])
def getIno(reg_no):
search_requests = {
"membership_classification":"1",
"registration_no": reg_no, #登録番号で検索する
}
#検索ページのセッションを作り,トークンを取得
s = requests.Session()
resp = s.get(URL_top, timeout=1)
soup = BeautifulSoup(resp.text, "html.parser")
token = soup.find("input", attrs={"name":"org.apache.struts.taglib.html.TOKEN"}).get("value")
search_requests["org.apache.struts.taglib.html.TOKEN"] = token
#検索する。
resp = s.post(URL_search_detail, data=search_requests)
soup = BeautifulSoup(resp.text, "html.parser")
tbodys = soup.select("div.mainCont tbody")
result = {}
#表1からの情報取得
ths = tbodys[0].find_all("th")
tds = tbodys[0].find_all("td")
for i in range(0, len(ths)):
result[ths[i].string] = tds[i].string
#表2からの情報取得
for tr in tbodys[1].find_all("tr"):
result[ tr.b.string] = tr.span.string if tr.span else tr.td.string
return make_response(jsonify(result))
余談
登録番号がわからない場合,まず氏名等で検索し,検索結果から得られた登録番号から詳細検索を行うことになります。
https://www.nichibenren.jp/member_general/lawyerandcorpsearchselect/lawyerInfoSearchInput/
に,検索したい要素を含んだrequestをPOSTし,返ってきたhtmlの表から登録番号を取得します。
下記をデフォルトの値として,必要な情報だけ上書きしましょう。
search_requests = {
"org.apache.struts.taglib.html.TOKEN": "", #トークンはセッションごとに設定します。
"__Click":0,
"membership_classification":"1", #会員区分。
"registration_no": "", #登録番号
"kana_last_name":"", #氏(かな)
"kana_first_name":"", #名(かな)
"last_name":"", #氏
"first_name":"", #名
"lawyers_association":"0", #弁護士会
"sex":2, #性別。0=女,1=男,2=不指定
"office_address_state":0, #都道府県
"office_address_city":"", #市区町村
"office_address_building_name_etc":"", #ビル名・企業・団体等
"firm_name":"", #事務所名
"country_of_primary_qualification_country":0, #原資格国の国名
"view_results":0, #結果表示順の制御
"doLawyerInfoSearch":"検索"
}
複数の該当がある場合は先頭20件のみ返ってくるので,うまく絞り込む必要があります。