この記事について
年末、つまりアドベントカレンダーの季節ですね。
へーしゃでもアドベントカレンダーがそこそこ盛り上がっており、賑やかしのために各記事についたいいね数を可視化してslackに貼り付けてるので、それに使っているスクリプトをここに残しておきます。
コード
モジュールのインポートから、qiitaのスクレイピングまで一気にやっていきます。
.py
import pandas as pd
import datetime
import time
import re
import requests
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.style.use('ggplot')
plt.rcParams['font.family'] = 'TakaoPGothic'
def extract_num_like(url):
"""
qiita記事のURL + "/likers"(いいねしたアカウントの数が書いてあるページ)
をスクレイピングし、いいね数を抽出する。
"""
if re.search('https\://qiita\.com',url):
res = requests.get(url + "/likers")
soup = BeautifulSoup(res.content)
num_likers = len(soup.find_all('h4',{'class':'UserInfo__name'}))
time.sleep(5)
return num_likers
else:
print(f'url not like qiita article. please confirm url: {url}')
return 0
# まずはAdvent Calendarのtopページから記事一覧をとってくる
organization = "supership"
url = f"https://qiita.com/advent-calendar/2018/{organization}"
res = requests.get(url)
soup = BeautifulSoup(res.content)
# 担当者と記事のURLを抽出する
authors = [x.text.rstrip() for x in soup.find_all("a", {"class":'adventCalendarItem_author'})]
urls = [x.find('a').get('href') for x in soup.find_all("div", {"class":'adventCalendarItem_entry'})]
# 個別の記事のいいね数辞書
num_like_dic = {author: extract_num_like(url) for author, url in zip(authors, urls)}
続いて、さきほど作った辞書をpandas DataFrameにして、matplotlib(seaborn)に渡して可視化しましょう。
seabornはデフォの設定でグラフが良い感じになるので良いですね。
.py
# 可視化するためにpandas DataFrameにする
df = pd.DataFrame.from_dict(num_like_dic, orient='index').sort_values(0,ascending=False).reset_index()
df.columns = ['担当者','いいね数']
today = datetime.datetime.today().strftime('%Y%m%d')
# 日次でデータをcsvで保存する想定なので、日付でsuffixをつけてcsv保存
df.to_csv(f'data/adcal_data_{today}.csv', index=False)
# いいね数がついているものに絞って可視化する
df = df[df["いいね数"] > 0]
# グラフ描画
plt.figure(figsize=(15,8))
plt.title(f'Advent Calnedar Watcher {today}')
sns.barplot(x='担当者', y='いいね数', data=df)
plt.xticks(rotation=90)
plt.savefig(f"Adcal_Watcher_{today}.png")
plt.show()