Skip to content

Instantly share code, notes, and snippets.

@xlab
Created September 17, 2012 10:47
Show Gist options
  • Save xlab/3736657 to your computer and use it in GitHub Desktop.
Save xlab/3736657 to your computer and use it in GitHub Desktop.
Habrahabr comments analyzer
#!/usr/bin/env ruby
# encoding: utf-8
require 'nokogiri'
require 'open-uri'
require 'yaml'
###################################################
# ♥ http://habrahabr.ru/users/bupycnet/comments/
NICK = unless ARGV.empty? then "#{ARGV.pop}" else
puts "Использование: ./parser.rb nick"
exit
end
CACHE = "cache-#{NICK}.yaml"
###################################################
class Parser
attr_reader :nick
def initialize nick
@nick = nick
end
def get_document relative
Nokogiri::HTML(open("http://habrahabr.ru/#{relative}",
"User-Agent" => "Mozilla/5.0"))
end
def get_pages
get_document("users/#{@nick}/comments/page999/").css('#nav-pages li').max.content
end
def get_comments page
get_document("users/#{@nick}/comments/page#{page}/").css('.comment_item .message').map{|html| html.content.strip}
end
def get_all_comments
comments = []
1.upto(get_pages.to_i).each { |page|
comments << get_comments(page)
}
comments.flatten
end
end
def run
comments = []
# check for cache
unless File.exist? CACHE
File.open(CACHE, "w") do |file|
# do cache
comments = Parser.new(NICK).get_all_comments
file.puts YAML::dump(comments)
end
else
comments = YAML::load(open(CACHE, "r"))
end
puts "Пользователь: #{NICK}"
puts "Всего комментариев: #{comments.size}"
overall = comments.inject{ |sum, e| sum = e.length + sum.to_i}
puts "Общая длина: #{overall}"
puts "Средняя длина комментария: #{overall / comments.size}"
puts "Длины первых 10 самых длинных:"
p comments.map{|comment| comment.length }.sort.reverse[0..10]
end
run
@xlab
Copy link
Author

xlab commented Sep 17, 2012

Примеры использования:

$ ./parser.rb
Использование: ./parser.rb nick

$ ./parser.rb Xlab
Пользователь: Xlab
Всего комментариев: 1285
Общая длина: 134914
Средняя длина комментария: 104
Длины первых 10 самых длинных:
[1156, 1097, 1049, 992, 908, 883, 862, 822, 795, 755, 743]

$ ./parser.rb bupycnet
Пользователь: bupycnet
Всего комментариев: 1636
Общая длина: 576316
Средняя длина комментария: 352
Длины первых 10 самых длинных:
[5996, 3835, 3308, 3303, 2910, 2611, 2425, 2405, 2339, 2333, 2260]

$ ./parser.rb amarao
Пользователь: amarao
Всего комментариев: 7926
Общая длина: 1861888
Средняя длина комментария: 234
Длины первых 10 самых длинных:
[4968, 3218, 3188, 2605, 2514, 2189, 2110, 2109, 2104, 2081, 2046]

$ ./parser.rb mithgol
Пользователь: mithgol
Всего комментариев: 6704
Общая длина: 1544168
Средняя длина комментария: 230
Длины первых 10 самых длинных:
[13661, 13148, 11569, 5454, 5235, 4409, 4333, 4270, 4124, 3935, 3835]

@xlab
Copy link
Author

xlab commented Sep 17, 2012

Не забудьте поставить nokogiri!

gem install nokogiri

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment