Edited at

尊敬するエンジニアのQiita記事をエゴサーする

トキワの森 Advent Calendar 2018の1日目の記事です。


やること

標準入力でタグ名とユーザ名を与え、該当記事情報を取得する。


モチベーション

Qiita記事を見て勝手に尊敬して目標にしている人っていませんか?僕はいます。

RubyならJunichi Itoさん

PHPならmpywさん

などなど勝手に尊敬してる。

尊敬してる人のQiita記事は全て目を通したいですよね。

だからと言って、時間が無限にあるわけではないです。

なので、自分が関心のあるタグに属する記事情報を取得するスクリプトを書きました。


技術

Ruby

nokogiri


コード

require 'nokogiri'

require 'open-uri'

user_name = ARGV[0] || "imaharu"
tag = ARGV[1] || "Ruby"

url = "https://qiita.com/#{user_name}"

def get_page_max(url)
doc = Nokogiri::HTML(open(url))
begin
page_max = doc.css(".pagination li").last.xpath('a')[0][:href]
/page=/ =~ page_max
$'.to_i
rescue
page_max = 1
end
end

page_max = get_page_max(url)

(1..page_max).each do |page_num|
url = "https://qiita.com/#{user_name}?page=#{page_num}"
doc = Nokogiri::HTML(open(url))
doc.css(".media").each do |article|
if article.css(".u-link-unstyled").inner_text.include?(tag)
url = "https://qiita.com/#{article.css(".u-link-no-underline")[0][:href]}"
title = article.css(".u-link-no-underline").text
good = article.css(".ItemLink__status li").text.split()[0] || 0
comment = article.css(".ItemLink__status li").text.split()[1] || 0

puts "URL : #{url}"
puts "Title : #{title}"
puts "いいね : #{good}"
puts "コメント : #{comment}"
puts "---------"
end
end
end


実行

$ruby nokogiri.rb user_name tag


ちょっとおかしいところ

if article.css(".u-link-unstyled").inner_text.include?(tag)

上記コードでタグが一つの文字列となってしまう。

今: RubyNokogiriスクレイピング

やりたい: Ruby Nokogiri スクレイピング


宣伝

超Ruby入門 { 大学を作ろう} というテーマで一人Advent Calendarやってます。