このシリーズ、えらい長ーくひっぱりましたが、この記事でオシマイです。
あんまりカッコよくもないプログラムをさらします。
何とかこれで会社のかたからいただいたお題をクリアしました。
なのですが、未熟きわまりないプログラムです。
その点、ご了承ください。
完成したプログラム
実際に作ったプログラムはこんな感じです。
import requests from bs4 import BeautifulSoup import time url = "(URL固定値)" for num in range(開始値,終了値,ステップ): if num < 10: load_url = url + "00000000000" + str(num) elif num < 100: load_url = url + "0000000000" + str(num) elif num < 999: load_url = url + "000000000" + str(num) else: load_url = url + "00000000" + str(num) html = requests.get(load_url) soup = BeautifulSoup(html.content, "html.parser") load_title = soup.find("title").text if load_title != "404 Not Found": shisetsu = soup.find(id="(施設名)").text.replace("\n","\t") data = soup.find_all(class_="(郵便番号・住所・電話番号)") with open("ファイル名","a",encoding="utf-8") as f: f.write("\n" + str(num) + "\t") f.write(shisetsu) for data_element in data: f.write(data_element.text.replace("\n","\t")) num = num + 1 load_url = "" time.sleep(3)
自分のための備忘録として
★1-3行目:各モジュールをインポートします。
★5行目:変数urlにデータを取得するためにアクセスするURLの固定部分を代入します。
★6-14行目:
データ取得先のURLの可変部分は12桁の数字です。ただし、最小値は1、最大値は7500程度でした。
URLの可変部分は、000000000001から000000007500くらいとなります。
そこで1桁から4桁まで変わり、それ以外は0の個数を調節します。
変数load_urlに変数url(固定)+URLの可変部分をくっつけたものを代入します。その変数load_urlがアクセスするURLとなります。
なお変数urlと8桁から11桁の0は文字列です。そのため数値である数値である変数numを結合するために、変数numをstr関数を使い、文字列にデータ型を変更しています。
★16-18行目:
Requests、BeautifulSoupを使い、変数load_urlに代入されたURLにアクセスし、変数load_titleにアクセスしたページ内のtitleタグの文字列を代入します。
★20行目:
変数load_titleに「404 Not Found」が代入されていないかを確認します。
変数load_urlに代入されたURLは機械的に設定しています。変数load_urlで示されるウェブページは存在しない場合もあります。存在しない場合、titleタグに「404 Not Found」という文字列があることを事前に調べました。
そこで、変数load_titleに「404 Not Found」が代入されている場合は、21行目から26行目の動作はスキップします。
★21-22行目:
変数shisetsu、dataにアクセスしたURLより取得したデータを代入します。
変数shisetsuには、取得したデータの改行をタブに置き換えたものを代入します。
変数dataには、郵便番号・住所・電話番号を代入します。
★23行目:
ファイルへの書き込みを行います。モードは追記、文字コードはUTF-8で書き込みます。
★24行目:
変数numをファイルへ書き込みます。
書き込むさい、先頭に改行、末尾にタブを追加します。
★25行目:
変数shisetsuをファイルへ書き込みます。(21行目の時点で末尾の改行をタブに変更しているので、そのままでファイルへ書き込みます。)
★26-27行目:
変数dataをファイルへ書き込みます。
代入されている郵便番号・住所・電話番号を1つずつ取り出した上で書き込みます。
for文を使い、変数dataよりデータを取り出し、変数data_elementに代入します。
変数data_elementをファイルへ書き込みます。そのさい、末尾の改行をタブに変更してから書き込みます。
ここまでで、変数numの1つ分の作業が完了します。
★29行目:変数numに1を追加します。
★30行目:変数load_urlを初期化します。(しなくていいかも。。。)
★31行目:sleep関数を使い、動きを一時停止します。ここでは3秒間止めています。
反省点
もう少しすっきりしたプログラムにできないかな?と思います。
このあたりまだまだ手探りです。
今回のプログラムにはエラー処理は一切設定していません。
本来はあるべきものですが、今回はそこは考えませんでした。
実をいいますと、データを全部取得するまでに、数回止まりました。
プログラムの問題ではあると思います。
しかし、停止した回数の少なさを考えると、インターネット回線の状態、ウェブサーバやウェブページの状態にもよるのでは?とも考えます。
完全に動作することを考えるよりは、止まった時点で対応することを考えて作りました。(^^;)
超現実仕様です。
コメント