##概要
今回は「WEBブラウザ上のページURLからスクレイピング→情報を抽出してcsvに追記する」という実装方法について記載します!
◼︎必要ツール&モジュール
[Beautiful Soup]
[python]
[pandas]
[requests]
◼︎環境
[jupyter notebook]
実装コード解説
notebookのインストール方法から立ち上げ方までは省略します!
また、通常関数化させますが解説のため関数化せずに記載します!
【初心者向け】Jupyter Notebookの使い方!インストール方法から解説
実装フロー
ざっくりとした内容はこちらです。
URLから情報を抽出→内容を加工→追記
・URLから情報を抽出
from bs4 import BeautifulSoup
import requests
import pandas as pd
from datetime import datetime
url = 'https://~'
read = requests.get(url)
# 読み取ったテキスト情報を解析します。
ex = BeautifulSoup(read.text, 'html.parser')
print(ex)
全体のHTMLが取得できたことを確認できましたか?
それでは上記内容から必要事項のテキストを抽出しますが
方法はテキストの前にあるclass名を記載すれば可能です!
class名の取得には「Chrome」の検索エンジンで対象ページを開いた状態で「デベロッパーツール」を使うのがオススメです。
「Mac:Command + Option + I」
「Windows:Ctrl + Shift + J」
# 読み取った全体のHTMLを格納した変数「ex」から部分抽出する
title = ex.select('.title')[0].string
print(title)
# 読み取るテキスト情報に高橋の点数:50という内容があればsplitで分割して50の数字だけを抽出することも可能です!
second = ex.select('.subscribers')[0].string
t_second = int(second.split(':')[1])
・内容を加工
上記内容でそれぞれ取得したい情報を抽出して変数に格納して行きます。
次にそれぞれ取ってきた情報をJSON形式に整形します!
# 変数「ap」に格納します。
ap = {
'タイトル' : title,
'点数' : t_second,
}
・ファイルの読み取りから追記
では今度は最初にimportした「pandas」を使用した後ファイルに追記します。
まず、先ほどの情報を追記するためのcsvが必要なので同じディレクトリに
[appendファイル]を配置します。
そのあと追記して保存という流れになります。
# csvを読み取りdfに格納します。
df = pd.read_csv('append.csv')
# 本日の日付を取得
date = datetime.today().strftime('%Y/%-m/%-d')
# 格納した変数より情報を抽出して追記する為の形式に合わせるために「datefarame」に格納します。
ap_tt = ap['title']
ap_se = ap['t_second']
last = pd.DataFrame([[date, ap_tt, ap_se]],columns=['date', 'title', 'score'])
# csvと格納した変数lastを結合させることで情報を追記します。
dg = pd.concat([df, last])
# 保存して完了
df.to_csv('data.csv', index=False)
上記保存の最終行に抽出したデータが追記されたら成功です!!
まとめ
今回、関数を使用せずなるべく簡略化せずに基礎としてコードを記載しましたが
もっと複雑な内容を抽出/加工して追記する方法やコードを1行にまとめたり
抽出を定期実行させたり、クラウド上で読み書きさせたりと発展版が様々あります。
一連の流れをマスターして、自分なりのアレンジを組み合わせて作ったものを当方にも教えていただけると幸いです!
最高なクリエイティブLIFEであれ!
追記/関数
from bs4 import BeautifulSoup
import requests
import pandas as pd
from datetime import datetime
# サイトから必要項目を抽出する関数
def get_info():
url = ''
read = requests.get(url)
s = BeautifulSoup(read.text, 'html.parser')
name = s.select('.abc')[0].string
second = ex.select('.subscribers')[0].string
t_second = int(second.split(':')[1])
results = {
'name' : name,
't_second' : t_second,
}
return results
# 必要項目をファイルに追記する
def get_data():
df = pd.read_csv('file.csv')
#新規のデータ
results = get_info()
#書き込みデータ
date = datetime.today().strtime('%Y/%-m/%-d')
reviews = results['t_second']
last = pd.DataFrame([[date, reviews]],columns=['date', 'score'])
df = pd.concat([df, last])
df.to_csv('data.csv', index=False)
if __name__ == '__main__':
write_data()
参照
[Python入門]Beautiful Soup 4によるスクレイピングの基礎
図解!Python BeautifulSoupの使い方を徹底解説!(select、find、find_all、インストール、スクレイピングなど)