qiita를 스크래핑하여 Advent Calendar 기사별로 좋아하는 숫자를 시각화

이 기사에 대하여



연말, 즉 어드벤트 캘린더의 계절이군요.
헤샤에서도 어드벤트 캘린더가 거기 고조되고 있어 활기차기 위해서 각 기사에 붙은 좋아하는 수를 가시화해 slack에 붙여 붙이고 있으므로, 거기에 사용하고 있는 스크립트를 여기에 남겨 둡니다.

코드



모듈 가져오기에서 qiita 스크래핑까지 단번에 진행합니다.
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은 데포의 설정으로 그래프가 좋은 느낌이 되기 때문에 좋네요.
# 可視化するために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()

결과



이런 느낌의 그래프를 쓸 수 있었습니다.

좋은 웹페이지 즐겨찾기