Pythonでウェブサイトからデータを入手する(10)

python Python

このシリーズ、えらい長ーくひっぱりましたが、この記事でオシマイです。

あんまりカッコよくもないプログラムをさらします。
何とかこれで会社のかたからいただいたお題をクリアしました。

なのですが、未熟きわまりないプログラムです。
その点、ご了承ください。

完成したプログラム

実際に作ったプログラムはこんな感じです。

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秒間止めています。

反省点

もう少しすっきりしたプログラムにできないかな?と思います。
このあたりまだまだ手探りです。

今回のプログラムにはエラー処理は一切設定していません。
本来はあるべきものですが、今回はそこは考えませんでした。

実をいいますと、データを全部取得するまでに、数回止まりました。
プログラムの問題ではあると思います。
しかし、停止した回数の少なさを考えると、インターネット回線の状態、ウェブサーバやウェブページの状態にもよるのでは?とも考えます。

完全に動作することを考えるよりは、止まった時点で対応することを考えて作りました。(^^;)
超現実仕様です。

コメント

タイトルとURLをコピーしました