エロゲ価格 スクレイピング ver.2

はじめに

この記事は前回の「エロゲ価格 スクレイピング」の記事を読んでいることを前提にしています。まだ記事を見ていない方はそちらから先にご覧ください。
前回:https://note.com/pikuouji/n/n21f8f67e973c

今回の記事は前回のプログラムの改良版の配布&解説となります。
筆者が試行錯誤して改良版を作成しましたので、最後まで見て頂けると嬉しいです!
また、それぞれの略称は前回の通りです。
スプシについては前回のものを流用してもらって構いません。
ですが、前回配布したスプシのA2セルを「=concatenate("購入予定作品 (作品数:",COUNTA(A3:A), ")")」にすると「購入予定作品 (作品数:63作品)」のように表示されて作品数が分かりやすくなりますので、ちょっと便利になるかと。

2022/8/5追記
スプシは前回のものを流用してもらっても構いませんが、新しく使いやすく、そしてより便利にしたver.2のスプシを作成しましたのでこちらを使っても大丈夫です!
ダウンロードは以下より

では今回のプログラムはこちらです!

導入方法や実行方法等は前回と変わりませんので、そちらを参考にしてください。
プログラムが無事に動いたら、詳しい解説に興味のない方とはここでお別れです。お疲れ様でした!



詳しい解説(Python,FANZA)

では解説に移ります!
前回と同じ部分はFANZA,DLsite共に全て省略しますのでご了承ください。

listURL = [r["FANZAリンク"] for r in list_of_dicts]

15行目のこの部分。前回はfor~って書いてましたが、リスト内包表記で記述できました。処理の本質は一切変わっていませんので省略します。


#要素取得
table = str.maketrans('','',',円')
listC = [i.text for i in soup.find_all(class_=['campaign-price red','normal-price-discount','normal-price red'])]
if len(listC) == 0:
  print('-----')
else:
  listC_int = [int(i.translate(table)) for i in listC]
  print(listC_int)
  print(min(listC_int))
  print(z)
  print('-----')
  st.update_acell(z , min(listC_int))

大きく変更したのはこの部分。要素取得のプログラムを大幅に変更しました。
では1行目から解説していきます!

まず今回は文字列の置換としてtranslate関数を使用しています。前回はreplace関数でしたが、こちらの方が短く書け、処理が早いらしい(どっかのサイトでみた)ので採用しました。
まず文字列の置換用のテーブルを作成しています。
テーブルの作成の法則は「table = str.maketrans(変換前文字列,変換後文字列,削除対象文字列)」となっていて、今回は削除のみを使用するので前2つは値無しにしています。

そして2行目ですが、リスト内包表記で要素の取得と要素のテキストだけを抜き出しています。要素の取得とテキスト化を1行で済ませられるの便利。
ちなみに、今回このような処理にしたら以前問題点として挙げていた

ただ、この影響で「Making*Lovers」みたいにデジタル原画集付属セットと通常版の2種類以上あった場合最初の方の価格(デジタル原画付属セット)しか出せないという……

エロゲ価格 スクレイピングの記事より

という部分が解決しました。
というのも、今回のようなプログラムにしたことで通常版の価格を正常に持ってくることが出来たためです!
やったぜ('ω')

そして3行目のif文では空配列かどうかの判別を行っています。len関数は指定したオブジェクトの要素の数を取得できるので、その要素数が0、つまり空配列の場合とそれ以外を判別できるわけですねー。
そして空配列のときは「-----」と出力します。

6行目の処理ですが、1行目で作成したtableを呼び出して文字列の置換と文字列型から整数型への変換をリスト内包表記で行っています。
まず文字列の置換部分ですが「i.translate(table)」で処理しており、1行目で作成したテーブルに従って置換を行っています。そしてtranslateの部分をintで囲むことで整数型へ変換しています。

後の処理は前回とほぼ変わらないので、解説を省略します。


詳しい解説(Python,DLsite)

では次にDLsiteの方の解説です。
URLのリスト内包表記はFANZAの方で説明したので省略します。

table = str.maketrans('','',',円')
listA = [i.text for i in soup.select('span.price')]
last = listA.pop()
last_int = int(last.translate(table))
print(last)
print(last_int)
print(z)
print('-----')
st.update_acell(z , last_int)

こちらでも要素取得のプログラムを大幅に変更しました。
では解説していきます!

1行目はFANZAの方と同じなので省略します。

2行目もほぼFANZAの方と同様で、リスト内包表記を用いて要素の取得と要素のテキストだけを抜き出しています。

そして3行目から違ってきます。
DLsiteはサイトの性質上class「price」が複数該当し、その最後の要素が値段ということが確定しています。
なので、要素の最後だけを抜き出してlastという変数に代入しています。

そして4行目でテーブルに従って文字列の置換と整数型への変換を行っています。

後の処理は前回のプログラムとほとんど変わらないので、解説を省略します。

終わりに

今回は前回からの改良の解説が主でした。
結局FANZAの方の処理が遅い原因ですが、前回の記事にも追記したようにスクレイピング部分が原因となっているようです。
指定してクラスの部分の要素を引っ張ってくる処理ですが、ここは仕様上どうしても変更できないため、諦めるしかなさそうです(>_<)

一応マルチスレッド処理にして高速化は出来るようですが、
・Colabがマルチスレッド処理に対応しているか
・そもそもどのようなプログラムを書けばマルチスレッド処理できるか
この2点がよく分からないため、断念しました。
もし分かる方がいれば教えてくださいm(__)m

今回の記事はここら辺で終了です!
ではまたノシ

この記事が気に入ったらサポートをしてみませんか?