LoginSignup
7
1

More than 3 years have passed since last update.

2019 Tech Connect! Summer 勝手に振り返り

Last updated at Posted at 2019-08-13

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叩かないと見えない?ので、こうやって出してみると新鮮でよいです。
やっぱがっつり技術系の記事だとストック数伸びるみたいですね。(ポエム系だといいねはつくけどストックはつかない感じ)


7
1
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
7
1