3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

qiitaをスクレイピングしてAdvent Calendarの記事別いいね数を可視化する

Posted at

この記事について

年末、つまりアドベントカレンダーの季節ですね。
へーしゃでもアドベントカレンダーがそこそこ盛り上がっており、賑やかしのために各記事についたいいね数を可視化して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()

結果

こんな感じのグラフが書けました。
adcal_watcher_20181221.png

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?