ろじらぼ(Roji-Lab)

毎日ダラダラゆらゆらと過ごす大学生のめんどくさがりなブログ。

アプリランキングを作ろう~データ抽出編(BeautifulSoup)~

こんにちは!
Roji(ろじ)です!


今回は、前回計画したアプリランキングの作成に取り掛かっていきます。
最初は、ランキングデータの抽出です。

【概要】

データの抽出には「BeautifulSoup」を使用していきたいと思います。

今回は、アプリのタイトルとアイコン画像を抽出します。
そのために、サイトのURLとそれぞれを囲むHTMLタグで指定します。
取得したタイトルはCSVファイルに記述し、
イコン画像は指定ファイルに保存します。

この記事では、僕が開発した流れを説明します。
プログラムの詳しい解説等は行いません。
ご了承ください。

【開発】

まず、データを抽出したいサイトのHTMLを取得します。

import requests
from bs4 import BeautifulSoup

html = requests.get("サイトのURL")
soup = BeautifulSoup(html.content, "html.parser")

このように記述し、HTMLを取得します。


その後、取得したHTMLの中の欲しいタグのクラス名やID名を指定します。

element_data = soup.select("取得したいタグ")


今回はHTML内のアプリタイトルとアイコン画像を取得したいので、
それらが含まれるタグのクラス名やID名を指定します。

element_data = soup.select("アプリタイトルのタグ")
img_data = soup.select("アイコンのタグ")

これで、取得したHTMLから、
アプリタイトルとアイコン画像が含まれるタグを取得することができました。


次は、取得したアプリタイトルとアイコンを保存していきます。

今回は上位10位のアプリタイトルとアイコンを取得します。

import csv

save_path = 'データ保存用パス'
data_list = list(range(10))

for i in range(10):
    data_list[i] = element_data[i].text
    img_src = img_data[i].get('src')
    re = requests.get(img_src)

    with open(save_path +"Image" + f'{i}' + '.' + 'png', 'wb') as f:
        f.write(re.content)

with open(save_path + "AppTitle.csv", "a", newline="", encoding='utf_8_sig') as f:
    writer = csv.writer(f)
    writer.writerow(data_list)

これで、データ保存用パスにアプリタイトルとアイコンを保存できます。

data_list[i] = element_data[i].text

上のように記述し、
「data_list」に、取得してきたタイトルが含まれるタグ内のテキストを格納します。

img_src = img_data[i].get('src')
re = requests.get(img_src)

アイコンのタグの「src」からアイコン画像を取得します。

with open(save_path +"Image" + f'{i}' + '.' + 'png', 'wb') as f:
    f.write(re.content)

今回、
「Image0.png」「Image1.png」...
のようにアイコンを保存していきます。
あらかじめ「save_path」にデータを保存したいパスを指定しているので、
上のように記述することで、
取得した画像を、指定パスに指定した名前で保存できます。

with open(save_path + "AppTitle.csv", "a", newline="", encoding='utf_8_sig') as f:
    writer = csv.writer(f)
    writer.writerow(data_list)

アプリタイトルを10個取得した後、
イコン画像と同じ要領で指定したパスに保存していきます。
今回、CSVファイルに保存するので、CSVファイルを開きます。
複数のサイトのデータを取得することを考え、追記モードで開いています。


これで、アプリタイトルとアイコン画像を、指定したファイルに保存できました。


ということで、
今回目標としていたことは達成できました。

次回は、抽出したデータにポイントを割り振り、
ソートするところまで進めようと思います。


以上!


【今回のソース】

import requests
from bs4 import BeautifulSoup
import csv

def ScrapingApp():
    save_path = ‘データ保存用パス’
    data_list = list(range(10))
    for i in range(10):
        data_list[i] = element_data[i].text
        img_src = img_data[i].get(‘src’)
        re = requests.get(img_src)

        with open(save_path + “Image” + f’{i}’ + “.” + ‘png’, ‘wb’) as f:
            f.write(re.content)

    with open(save_path + “AppTitle.csv”, “a”, newline=””, encoding=’utf_8_sig’) as f:
        writer = csv.writer(f)
        writer.writerow(data_list)