この連載記事では、全国のデリヘル嬢のデータベース作成を目標にプログラミングをしていきます。
本記事は連載記事の第3回に当たります。
ここに至るまでの手順については前回、前々回の記事をご覧いただけると幸いです。
前回の記事
~各回の内容~
第1回 データベース作成用の風俗情報サイトを選ぶ
第2回 デリヘルタウン全店舗のURLリストを作る
第3回 全店舗のURLリストから、htmlのソースコードを取得 ←いまここ
第4回 htmlのソースコードから女の子のデータベースを作成
もくじ
前回までのあらすじ
デリヘルタウンに登録されている全デリヘル嬢のデータベースを作ることにしました。
方針としては、店舗ごとに存在する「女の子一覧」ページをかき集めて作ります。
前回は、全店舗のURLをtxtファイルにまとめるところまで終了しました。
※「女の子一覧」ページの例
https://www.dto.jp/shop/7/gals
今回やること:「女の子一覧」ページのhtmlソースを丸ごと取得します
作業の概略
前回作った全店舗のURLリストを使い、「女の子一覧」ページのhtmlソースコードをまるごと取得して自分のPCに保存します。
以下のように、前回作成したhtmlsフォルダにソースコードを保存することになります。

例えば、7という名前のファイルは、以下のページのソースコードを丸々コピーしてきたものです。
https://www.dto.jp/shop/7/gals
こんな感じで全店舗分、すなわち約6000個のhtmlファイルを取得するのが今回の作業です。
今回の作業を行う目的
後に行う作業の際にデリヘルタウンのサーバに負荷がかからないようにするためです。
繰り返しになりますが、連載記事の最終的なゴールはデータベースを作ることです。
このデータベース作成は、htmlファイルから女の子の名前やスリーサイズを抽出して作ります。
要は短期間で大量のファイルにアクセスするため、デリヘルタウンのサーバ上のファイルにアクセスするとサーバに負荷がかかってしまうのですね。
それに加え、実際にデータベースを作ってみると抽出する情報も色々変えたくなるものです。
例えば自分は、「スリーサイズだけじゃなくて所属店舗名も追加しよう」とか「都道府県の情報も追加しよう」とか考え直して、5回ぐらいデータベースの作り直しを行いました。
そのたびにサーバ上のファイルにアクセスするのではやはり負荷がかかりますよね。
以上のような理由で、解析したいファイルはいったん自分のPCにコピーしてから行うほうが、デリヘルタウンに迷惑がかからなくなります。
なお、今回行うのは自分のPCにhtmlソースコードを保存するところまでです。名前やスリーサイズの抽出は最終回である第4回に行う予定です。
htmlコード取得の際の注意
本記事では、スクレイピングという手法を使ってデリヘルタウンのデータを取得します。
取得したデータを解析に利用するのは合法ですが、そのデータでデリヘルタウンのコピーサイトを作るなどの行為は違法です。
取得したデータは解析目的にのみ利用するようお願いします。
スクレイピングの合法、違法の基準については以下のサイトの説明がわかりやすいです。作業前にご参照ください。
htmlコード取得のためのプログラム作成
プログラム作成
今回作るべきプログラムは1つだけです。
このプログラムによって、前回作ったshop_list.txtを読み込み、そこに書かれたURLのhtmlコードを丸々取得します。
download_gal_html.py
# 本プログラムの目的:
# 全店舗のトップページURLをもとに「女の子一覧」ページにアクセスし、
# 「女の子一覧」ページのソースを自分のPCにコピーする
import urllib.request
from urllib.error import URLError, HTTPError
import re
import time
import os
# 本プログラムは実行に時間がかかる。
# そのため、進捗をコンソール上に表示するための変数を用意
num_current = 0
num_shops = sum(1 for line in open('list/shop_list.txt'))
# 全店舗のトップページURLリストを開く
shop_top_urls = open('list/shop_list.txt', 'r')
for shop_top_url in shop_top_urls:
shop_id = re.sub("\\D", "", shop_top_url)
# 店舗のトップページのURLをもとに、
# 「女の子一覧」ページのURLを生成
# 例:https://s.dto.jp/shop/16721/gals
gals_url = shop_top_url.strip() + '/' + 'gals'
# 「女の子一覧」ページのhtmlを文字列で取得
try:
rf = urllib.request.urlopen(url=gals_url)
except HTTPError as e:
continue
except URLError as e:
continue
tmp = rf.read() # 「tmp」はbytes型の文字列になる
html = tmp.decode("utf-8") # str型に変換して変数「html」に格納
rf.close()
# URLから数字(店舗ID)を抜き出す。書き出しファイルの名前指定用。
shop_id = re.sub("\\D", "", gals_url)
# 書き出し先のファイルを作成。ファイル名は「htmls/(店舗ID).html」とする
# 例:htmls/16721.html
wf = open('htmls/' + shop_id + '.html', 'w', encoding='utf-8')
# ファイルへの書き出し
wf.write(html)
wf.close()
# デリヘルタウンのサーバに負荷をかけないよう、1回アクセスしたら2秒待つ
time.sleep(2)
# 現在何店舗取得したかをコンソール上に表示
num_current += 1
print( '\r' + '現在 %04d / %04d 店舗目を取得' % (num_current, num_shops), end='' )
35行目の、「rf.read()」がソースコードを丸々取得している部分ですね。
このプログラムが書けたら実行(※)します。
(※)anaconda promptでsrcフォルダに移動して実行
> python download_gal_html.py
なお、このプログラムは実行時間がとても長いです。4時間くらいかかります。
なぜなら、サーバに負荷をかけないように低速でアクセスしつつ約6000店舗のデータをとってくるからですね。
会社や学校に行っている間とか夜中に動かすのをおすすめします。
最終的には以下のように、第2回の記事で作成したhtmlsフォルダにファイルが保存されます。
2020年7月26日に実行したところ、取得したデータの容量は約250MBでした。
補足1: 店舗IDに抜け番がある理由
htmlsに保存されたファイルを見ると、一番若い番号が7で、次が17になっていますね。
「あれ?1から始まってないの?」と思った方もいるかもしれません。
これは、要するに1~6、8~16の店舗IDを持つお店がつぶれたのだと思われます。
デリヘルタウンは、登録したお店がつぶれるとURLが削除され、その店舗IDは抜け番になる仕様のようですね。
補足2: 例外処理の必要性
今回作成したプログラムは、URLが見つからない場合は例外処理を行います。
具体的には、存在しないURLにアクセスした場合はそのURLに対応したhtmlコードを取得せずスキップする実装にしています。
31~34行目にその処理が実装されていますね。
結論から言うと、存在しないURLが数店舗分ある可能性が高いです。
これは前回作ったリストが不完全という話ではなく、URLリストを作った後に店がつぶれてURLがなくなってしまうのです。
繰り返しになりますが、デリヘルタウンの登録店舗は非常に多く、約6000店舗あります。
デリヘル店の平均寿命が5年だとすると、期待値的には1日に4店舗くらいつぶれる計算になりますね。
つまり、第2回で全店舗のURLリストを作りましたが、それらのお店は時間がたつごとにどんどんつぶれます。
仮にURLリストを作った直後にこのプログラムを走らせても、今回作ったプログラムは1店舗ずつ合計4時間かけてアクセスしていくので、
プログラムを動かしている間に1店舗ぐらいつぶれている可能性が高いですね。
以上のような理由で、この例外処理が必要になるというわけですね。
最後に
以上、今回はデリヘルタウンのhtmlソースコードを取得しました。
最終回となる次回は、このソースコードから女の子の情報を抽出してデータベースを完成させます。
次の記事は以下からどうぞ