2019/7/31~2019/8/9の期間で、弊社で勝手に始める真夏のアドベントカレンダーとして「Tech Connet! Summer」なるイベントをやりました。
(自分もクマさんチームの4日目として記事書いてます。)
一通り投稿も終わったので、各記事についたいいね数とか集計してみたいと思います。
集計に関しては対象記事をトップページからBeautifulSoupでスクレイピングし、取得した記事IDでQiita APIを発行してコメント数、いいね数、ストック数を取得したいと思います。
(覚えたばかりのBeautifulSoupを使いたいだけ)
コードは以下
import os
import json
import requests
import time
from bs4 import BeautifulSoup
from selenium import webdriver
import chromedriver_binary
from urllib.parse import urljoin
def read():
api_endpoint = 'https://qiita.com/api/v2/'
headers = {'Authorization': 'Bearer ' + os.environ['QIITA_AUTH']}
try:
options = webdriver.chrome.options.Options()
options.add_argument("--headless")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("start-maximized")
options.add_argument("disable-infobars")
options.add_argument("--disable-extensions")
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")
driver = webdriver.Chrome(options=options)
url = 'https://qiita.com/dgkz/items/2862d5e6b77203a126b3'
driver.get(url)
soup = BeautifulSoup(driver.page_source, 'html.parser')
item = soup.find('div', id='item-2862d5e6b77203a126b3')
tables = item.find_all('tbody')
print('|タイトル|コメント数|いいね数|ストック数|')
print('|:---|---:|---:|---:|')
for table in tables:
rows = table.find_all('tr')
for row in rows:
tmp = row.find_all('td')[2].find('a')['href'].split('#')[0]
item_id = tmp[tmp.find('items/'):]
item_url = urljoin(api_endpoint, item_id)
item_detail = requests.get(item_url, headers=headers).json()
title = item_detail['title']
url = item_detail['url']
comments = item_detail['comments_count']
likes = item_detail['likes_count']
stockers_url = urljoin(api_endpoint, item_id + '/stockers?per_page=100')
stockers = len(requests.get(stockers_url, headers=headers).json())
print('|[%s](%s)|%d|%d|%d|' % (title, url, comments, likes, stockers))
except Exception as e:
print(e)
finally:
driver.quit()
if __name__ == '__main__':
read()
トップページの読み込み部分はSelenium使って処理しないと本文部分がうまく取れません。
ついでなので出力をQiitaのMarkdownでテーブル表示できるようにしてます。
実際に出力された内容をそのままコピペしたのが下の表です。
タイトル | コメント数 | いいね数 | ストック数 |
---|---|---|---|
ハムスターの写真を撮りたい | 0 | 143 | 58 |
PHP+Watson Assistant+楽天書籍検索APIでChatBotを作る! | 1 | 49 | 35 |
WebVRに入門する | 0 | 35 | 12 |
楽天APIとLINE Messaging APIによるレシピ検索ボット ~Elasticsearchを添えて~ | 0 | 52 | 41 |
ラズパイ電子工作~PWM制御を用いた簡易扇風機~ | 0 | 43 | 31 |
小難しいコーディングは一切不要!!!たったの15分でLINE Clovaにクソアプリを解き放ってTシャツをゲットする方法を発明したよ。 | 0 | 102 | 62 |
字幕オペレーター的タイピング効率化のススメ その2~IME辞書編~ | 0 | 36 | 19 |
【Dialogflow】コード無しで会話型チャットボットの作成 | 0 | 33 | 17 |
自分のポモドーロを作りましょう | 2 | 46 | 34 |
この暑さを何とかしてくれるBotを作る!!! | 1 | 31 | 14 |
俺は静的"コード"解析がしたい。 | 0 | 94 | 34 |
電気の流れ方も忘れたおじさんによる電子工作 序 | 1 | 55 | 20 |
THETA SCで自分を監視。追い込まれた状態で英語学習。[対談][360camera画像あり] | 0 | 17 | 0 |
生産性向上へのショートカット | 1 | 115 | 84 |
近くで予約可能なホテルを探すチャットボットを作ってみた | 0 | 49 | 38 |
Arduino工作を見据えて | 0 | 16 | 3 |
discordで簡単な受け応え(とGoogle検索)ができるbotを作ろう | 2 | 54 | 53 |
JavaでNumer0nみたいなゲームを作ってみた | 4 | 31 | 18 |
チャレンジ!クロスプラットフォーム開発(Xamarin.Forms編) | 0 | 16 | 7 |
M5StackのNeoPixelユニットで空中に絵を描く | 0 | 15 | 3 |
いい感じに取れました。スクレイピング楽しいです。
いいね数は各記事見ればわかりますが、ストック数はAPI叩かないと見えない?ので、こうやって出してみると新鮮でよいです。
やっぱがっつり技術系の記事だとストック数伸びるみたいですね。(ポエム系だといいねはつくけどストックはつかない感じ)