事情はこうです。会社は第三者の決済ツール ping++ を使用しており、仕事で彼らの文書にある銀行番号と銀行名を Json 文字列に変換してローカルで使用する必要があります。
具体的なリンクはこちらです:https://www.pingxx.com/api# 銀行番号説明
さて、問題が発生しました。この銀行番号の表をどう処理するか、ひとつずつコピーするわけにはいきません。これでは効率が悪すぎますし、プログラマーのやり方ではありません。そこで、iOS の同僚に解析済みの json データをもらいました。。。ハハハ。。こんなに簡単に済みました。。確かにもらいましたが、自分でもやってみる必要があります。生活の中でコードで処理できることはコードで解決することが大切です。
何をするかが決まれば、あとは簡単です。まず思いついたのは Python クローラーを使ってウェブページを解析し、データを処理することです。
クローラーの主要モジュール#
- URL 管理者
クローリングする必要のある URL とすでにクローリングした URL を管理するために使用します。set で管理することもできますし、他のツールを使って処理することもできます。ここでは単一の固定ウェブページをクローリングするだけなので、文字列で代用しました。 - HTML ダウンローダー
URL 管理者の対応する URL のウェブページをダウンロードし、文字列として保存します。その後、この文字列をウェブページ解析器に渡して解析できます。ここでは Python に付属の urllib モジュールを使用しています。Python2.7 ではこのモジュールは有名な urllib2 で、Python3.0 では urllib2 が urllib.request に統一され、使用方法が少し異なりますので、自分でググってください。 - HTML 解析器
一方では価値のあるデータを解析し、もう一方では各ページには他のページへの多くのリンクがあるため、これらの URL が解析された後、URL 管理者に追加して後でクローリングできるようにします。ここではサードパーティのモジュール BeautifulSoup を使用します。インストールが必要です。インストール方法は以下の通りです:
$ easy_install beautifulsoup4
または
pip install beautifulsoup4
ウェブページのダウンロード#
import urllib.request
response = urllib.request.urlopen("https://www.pingxx.com/api#銀行番号説明")
print(response.read())
そうです、たった 2 行のコードでウェブページをダウンロードできます。実際には 1 行でも可能です。
ウェブページの解析#
上記でダウンロードしたウェブページは HTML のソースコードです。これを解析するために、BeautifulSoup はさまざまな解析方法をサポートしており、自分が欲しいデータを取得できます。ここではウェブサイトを見てソースコードを確認する必要があります。Command+option+J で要素を検査し、データが必要な部分のソースコードの利用可能な場所を確認して、クローリングを容易にします。下の図は私たちが特定したソースコードです。
確認した後、必要なデータがその div の下の table にあることを分析しました。table を取得し、table を解析すれば良いのですが、div を直接取得するのは難しいですが、次のような
<h2 id="銀行番号説明">銀行番号説明</h2>
の方が取得しやすいので、まずそれを取得し、その親ノードを取得してから table を取得します。
コードは以下の通りです:
import urllib.request
from bs4 import BeautifulSoup
response = urllib.request.urlopen("https://www.pingxx.com/api#銀行番号説明")
soup = BeautifulSoup(response, "html.parser")
table = soup.find("h2", id="銀行番号説明").parent.find("table").find("tbody")
これで table を取得できました。残りは簡単で、table を処理するだけです。まずすべての tr を取得し、次に各 tr の td を取得し、必要な td の値を取得して Json 文字列を組み立てます。
完全なコードは以下の通りです:
import urllib.request
from bs4 import BeautifulSoup
response = urllib.request.urlopen("https://www.pingxx.com/api#銀行番号説明")
soup = BeautifulSoup(response, "html.parser")
table = soup.find("h2", id="銀行番号説明").parent.find("table").find("tbody")
bankJson = "["
for row in table.findAll('tr'):
if len(row) > 2:
cells = row.findAll('td')
bank_code = cells[0].find(text=True)
bank_name = cells[1].find(text=True)
bankJson = bankJson + "{" + "\"code\":\"" + bank_code + "\"," + "\"name\":\"" + bank_name + "\"},"
bankJson = bankJson[0:len(bankJson) - 1] + "]"
print(bankJson)
コードを実行すると、次のような結果が表示されます:
[{"code":"0100","name":"中国郵政貯蓄銀行"},{"code":"0102","name":"工商銀行"},{"code":"0103","name":"農業銀行"},{"code":"0104","name":"中国銀行"},{"code":"0105","name":"建設銀行"},{"code":"0301","name":"交通銀行"},{"code":"0302","name":"中信銀行"},{"code":"0303","name":"光大銀行"},{"code":"0304","name":"華夏銀行"},{"code":"0305","name":"民生銀行"},{"code":"0306","name":"広発銀行"},{"code":"0308","name":"招商銀行"},{"code":"0309","name":"興業銀行"},{"code":"0310","name":"浦発銀行"},{"code":"0311","name":"恒豊銀行"},{"code":"0313","name":"臨沂市商業銀行"},{"code":"0316","name":"浙商銀行"},{"code":"0317","name":"渤海銀行"},{"code":"0318","name":"平安銀行"},{"code":"0328","name":"新韓銀行(中国)"},{"code":"0329","name":"韓亞銀行(中国)"},{"code":"0336","name":"企業銀行"},{"code":"0401","name":"上海銀行"},{"code":"0402","name":"厦門銀行"},{"code":"0403","name":"北京銀行"},{"code":"0404","name":"煙台市商業銀行"},{"code":"0405","name":"福建海峡銀行"},{"code":"0406","name":"吉林銀行"},{"code":"0408","name":"寧波銀行"},{"code":"0412","name":"温州銀行"},{"code":"0413","name":"広州銀行"},{"code":"0414","name":"漢口銀行"},{"code":"0418","name":"洛陽銀行"},{"code":"0420","name":"大連銀行"},{"code":"0422","name":"河北銀行"},{"code":"0423","name":"杭州商業銀行"},{"code":"0424","name":"南京銀行"},{"code":"0427","name":"ウルムチ市商業銀行"},{"code":"0428","name":"紹興銀行"},{"code":"0433","name":"葫蘆島市商業銀行"},{"code":"0434","name":"天津銀行"},{"code":"0435","name":"鄭州銀行"},{"code":"0436","name":"寧夏銀行"},{"code":"0438","name":"齊商銀行"},{"code":"0439","name":"錦州銀行"},{"code":"0440","name":"徽商銀行"},{"code":"0441","name":"重慶銀行"},{"code":"0442","name":"ハルビン銀行"},{"code":"0443","name":"貴陽銀行"},{"code":"0447","name":"蘭州銀行"},{"code":"0448","name":"南昌銀行"},{"code":"0449","name":"晋商銀行"},{"code":"0450","name":"青島銀行"},{"code":"0455","name":"日照市商業銀行"},{"code":"0456","name":"鞍山銀行"},{"code":"0458","name":"青海銀行"},{"code":"0459","name":"台州銀行"},{"code":"0461","name":"長沙銀行"},{"code":"0463","name":"贛州銀行"},{"code":"0465","name":"營口銀行"},{"code":"0467","name":"阜新銀行"},{"code":"0474","name":"内蒙古銀行"},{"code":"0475","name":"湖州市商業銀行"},{"code":"0476","name":"滄州銀行"},{"code":"0479","name":"包商銀行"},{"code":"0481","name":"威海商業銀行"},{"code":"0483","name":"攀枝花市商業銀行"},{"code":"0485","name":"綿陽市商業銀行"},{"code":"0490","name":"張家口市商業銀行"},{"code":"0492","name":"龙江銀行"},{"code":"0495","name":"柳州銀行"},{"code":"0497","name":"莱商銀行"},{"code":"0498","name":"德陽銀行"},{"code":"0503","name":"晋城銀行"},{"code":"0505","name":"東莞商行"},{"code":"0508","name":"江蘇銀行"},{"code":"0513","name":"承徳市商業銀行"},{"code":"0515","name":"德州銀行"},{"code":"0517","name":"邯鄲市商業銀行"},{"code":"0525","name":"浙江民泰商業銀行"},{"code":"0526","name":"上饶市商業銀行"},{"code":"0527","name":"東營銀行"},{"code":"0528","name":"泰安市商業銀行"},{"code":"0530","name":"浙江稠州商業銀行"},{"code":"0534","name":"鄂爾多斯銀行"},{"code":"0537","name":"済寧銀行"},{"code":"0547","name":"昆仑銀行"},{"code":"0554","name":"邢台銀行"},{"code":"0556","name":"漯河商行"},{"code":"1401","name":"上海農商銀行"},{"code":"1402","name":"昆山農信社"},{"code":"1403","name":"常熟市農村商業銀行"},{"code":"1404","name":"深セン農村商業銀行"},{"code":"1405","name":"広州農村商業銀行"},{"code":"1408","name":"仏山順徳農村商業銀行"},{"code":"1409","name":"昆明農村信用社連合社"},{"code":"1410","name":"湖北農信社"},{"code":"1415","name":"東莞農村商業銀行"},{"code":"1416","name":"張家港農村商業銀行"},{"code":"1417","name":"福建省農村信用社連合社"},{"code":"1418","name":"北京農村商業銀行"},{"code":"1419","name":"天津農村商業銀行"},{"code":"1420","name":"寧波鄞州農村合作銀行"},{"code":"1424","name":"江蘇省農村信用社連合社"},{"code":"1428","name":"江蘇呉江農村商業銀行"},{"code":"1430","name":"蘇州銀行"},{"code":"1443","name":"広西農村信用社連合社"},{"code":"1446","name":"黄河農村商業銀行"},{"code":"1447","name":"安徽省農村信用社連合社"},{"code":"1448","name":"海南省農村信用社連合社"},{"code":"1513","name":"重慶農村商業銀行"},{"code":"6462","name":"潍坊市商業銀行"},{"code":"6466","name":"富滇銀行"},{"code":"6473","name":"浙江泰隆商業銀行"},{"code":"6478","name":"広西北部湾銀行"},{"code":"6567","name":"商丘商行"}]
さて、問題が解決しました。正直なところ、実際の問題を解決するために初めてコードを書くのはとても楽しかったです。解決すべき問題を持って学ぶことは、より良い結果をもたらします。私の感想は、何かを学びたい、または何かをしたいと思ったときに、あまり考えすぎないことです。例えば、すべての資料を準備する、誰の資料が良いか、どうすれば遠回りを避けられるか、うまく学べなかったり、うまくできなかったらどうなるか、などなど..... そうすると、あなたの情熱は失われ、この事は結局何も進まなくなります。これらは良くありません。私たちが求めているのは、やりたいことをすぐにやること、just do it です。