Qiita Advent CalendarのランキングをPythonでスクレイピングしてみた


QiitのAdvent Calenderには、ランキングが公開されてます。
全体カレンダーランキング

最初は、面白カレンダーを見つけることが目的でちょいちょい見てましたが、よくよく見てみると、弊社もランキングされてました!

ただし、いいね数が1でもランキングされているので、まあ当然なんですけどね。

ランキングされていることを知ってから、「今日のランキングは何位かな?」を初めて3日目。
これは面倒くさい・・・

「QiitaにAPIがあるから、それでランキング取れるやろ」と、ランキング取得を自動化することにしました

APIがないならスクレイピング!

QiitaにはAPIがあります。ここです→Qiita API v2の仕様
しかし、ドキュメント見ても、Advent CalenderのAPIが無い

APIが無いならPythonでスクレイピングしてみることにしました。
Python スクレイピングで検索すると、Beautiful Soupが多くヒットしましたので、Beautiful Soupを使うことにしました。

スクレイピングは簡単だ

目的は明確です。自分の会社のランキングを取得することです。HTMLタグを調べて見ました。

ランキングの数字を取得するには、カレンダーリンクの<a class="adventCalendarRankingListItem_calendarName">から2個上に昇ってテキストを取得すればよさそうです。

BeautifulSoupを使ってコードにしてみました。

from urllib import request
from bs4 import BeautifulSoup

targethref = '/advent-calendar/2019/fork'

def main():

    url = 'https://qiita.com/advent-calendar/2019/ranking/feedbacks/all'
    targetclass = 'adventCalendarRankingListItem_calendarName'

    response = request.urlopen(url)
    soup = BeautifulSoup(response,features="html.parser")
    ranking = soup.find('a',class_=targetclass,href=targethref).parent.parent.contents[0].text
    response.close()

    print(ranking)


if __name__ == "__main__":
    main()

これだけです、とっても簡単です!
BeautifulSoup 素晴らしい!(スクレイピングできる他のライブラリを知らないので、自分の感覚です)

自分の好きなカレンダーのランキングを取得したい場合は、4行目のtargethref=を書き換えてください。

おわりに

このロジックをAWS Lambdaにのっけて、1日1回実行してます。実行した結果は、社内のChatツールに投げて情報を共有するようにしました。

APIが公開されてなくても、スクレイピングでもいけるなと認識した1日でした


FORK Advent Calendar 2019
私が書いたAdvent Calenderの記事はこちらです