opium
@opium
Просто люблю качественно работать

Кто хочет написать скрипт для сбора статистики с первого Хабракампа?

Хабракамп здесь
habrahabr.ru/post/148795/
Собственно будет интересна любая статистика:
топ по плюсам
топ по количеству вопросов
топ по количеству ответом
топ по минусам
топ по самым активным почемучкам
и любая другая статистика которую вы придумаете.
  • Вопрос задан
  • 3082 просмотра
Пригласить эксперта
Ответы на вопрос 8
sledopit
@sledopit
Дешево Быстро и сердито:

 $ ./parse.sh http://habrahabr.ru/post/148795/ | column -t
Now_is:                Wed_Aug_1_00:28:55_MSK_2012
The_url_is:            http://habrahabr.ru/post/148795/
Max_"+"_is:            13                                RxB
Max_"-"_is:            30                                Gangsta
Total_comments:        721
Top_commentor_is:      49                                opium
Total_questions:       342
Total_links:           57
Most_popular_site_is:  4                                 http://twower.livejournal.com
Total_commentators:    189
Total_"+":             495
Total_"-":             101
Total_Sign:            394


Собственно сам код:
#!/bin/sh
v_temp=`mktemp`
echo -n "Now_is: "
        date | sed 's/\s\+/_/g'
echo "The_url_is: $1"
wget -q --referer="http://www.google.com" --user-agent="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6" -O $v_temp "$1"
sed -i '/comments_list/,/for_users_only_msg/!d' $v_temp
echo -n 'Max_"+"_is: '
        sed -n "/class=\"\(score\|username\)\"/p" $v_temp | sed 'N;s/<[^>]*>//g;s/\n//;s/^\s\++//;/^\s\+–/d' | sort -n | tail -1
echo -n 'Max_"-"_is: '
        sed -n "/class=\"\(score\|username\)\"/p" $v_temp | sed 'N;s/<[^>]*>//g;s/\n//;s/^\s\+–//;/^\s\++/d' | sort -n | tail -1
echo -n 'Total_comments: '
        sed -n '/class="score"/p' $v_temp | wc -l
echo -n 'Top_commentor_is: '
        grep username $v_temp | sort | uniq -c | sort -n | tail -1 | sed 's/<[^>]*>//g;'
echo -n 'Total_questions: '
        sed -n 's)<[^>]*>))g;/\?/p' $v_temp | wc -l
echo -n 'Total_links: '
        sed -n '/message html_format/,/^\s\+<\/div>/{s><a href>\n&>;/a href/p}' $v_temp | grep "a href" | wc -l
echo -n 'Most_popular_site_is: '
    sed -n '/message html_format/,/^\s\+<\/div>/{s><a href>\n&>;/a href/p}' mktemp | egrep -o 'https?://[^/"]*' | sort | uniq -c | sort -n | grep -v habr | tail -1
echo -n 'Total_commentators: '
        sed -n '/class="username"/p' $v_temp | sort -u | wc -l
echo -n 'Total_"+": '
        sed -n '/class="score"/{s/.*uarr;\([0-9]\+\).*/\1/;p}' $v_temp | awk '{sum+=$1}END{print sum}'
echo -n 'Total_"-": '
        sed -n '/class="score"/{s/.*darr;\([0-9]\+\).*/\1/;p}' $v_temp | awk '{sum+=$1}END{print sum}'
echo -n 'Total_Sign: '
        sed -n '/class="score"/{s/.*uarr;\([0-9]\+\).*darr;\([0-9]\+\)/\1 \2/;p}' $v_temp | awk '{plus+=$1;minus+=$2}END{print plus-minus}'
rm $v_temp

Можно применять не только к вышеназванному топику. (:
Ответ написан
miraage
@miraage
Старый прогер
Как раз займусь. Думаю до конца дня успею :)
Ответ написан
barmaley_exe
@barmaley_exe
Немного статистики на момент 11:00 — 12:00 (MSK)

Топ 10 по плюсам
  1. habrahabr.ru/post/148795/#comment_5025474 (22 плюсов, рейтинг 14)
  2. habrahabr.ru/post/148795/#comment_5024257 (14 плюсов, рейтинг 13)
  3. habrahabr.ru/post/148795/#comment_5024263 (12 плюсов, рейтинг 12)
  4. habrahabr.ru/post/148795/#comment_5024242 (11 плюсов, рейтинг 11)
  5. habrahabr.ru/post/148795/#comment_5024274 (11 плюсов, рейтинг 11)
  6. habrahabr.ru/post/148795/#comment_5024459 (9 плюсов, рейтинг 9)
  7. habrahabr.ru/post/148795/#comment_5024265 (8 плюсов, рейтинг 8)
  8. habrahabr.ru/post/148795/#comment_5025140 (8 плюсов, рейтинг 8)
  9. habrahabr.ru/post/148795/#comment_5024436 (8 плюсов, рейтинг 8)
  10. habrahabr.ru/post/148795/#comment_5024302 (8 плюсов, рейтинг 8)
Топ 10 по минусам
  1. habrahabr.ru/post/148795/#comment_5024378 (35 минусов, рейтинг -30)
  2. habrahabr.ru/post/148795/#comment_5025474 (8 минусов, рейтинг 14)
  3. habrahabr.ru/post/148795/#comment_5024367 (4 минусов, рейтинг 2)
  4. habrahabr.ru/post/148795/#comment_5026416 (2 минусов, рейтинг 3)
  5. habrahabr.ru/post/148795/#comment_5024299 (2 минусов, рейтинг 1)
  6. habrahabr.ru/post/148795/#comment_5025415 (2 минусов, рейтинг 1)
  7. habrahabr.ru/post/148795/#comment_5024257 (1 минусов, рейтинг 13)
  8. habrahabr.ru/post/148795/#comment_5026377 (1 минусов, рейтинг 1)
  9. habrahabr.ru/post/148795/#comment_5024942 (1 минусов, рейтинг 2)
  10. habrahabr.ru/post/148795/#comment_5026364 (1 минусов, рейтинг 0)

Топ 10 хабраюзеров по количеству комментариев
  1. opium оставил 68 комментариев
  2. z0rg оставил 30 комментариев
  3. multik оставил 20 комментариев
  4. aNDREIQA оставил 19 комментариев
  5. yul оставил 16 комментариев
  6. inossidabile оставил 16 комментариев
  7. RxB оставил 16 комментариев
  8. u_story оставил 15 комментариев
  9. pasdn оставил 15 комментариев
  10. DAiMor оставил 14 комментариев
Ответ написан
Voenniy
@Voenniy
Не знаю, относится это к статистике или нет, но мои ответы про армию дали +5 плюсов к карме. Честно говоря, не ожидал, думал будет наоборот (армия на хабре довольно опасная тема, меня уже один раз сливали)

Скрытый текст
Надеюсь, я не совершил ошибку, что написал об этом
Ответ написан
barmaley_exe
@barmaley_exe
Немного статистики на момент 11:00 — 12:00 (MSK)

Топ 10 по плюсам
  1. habrahabr.ru/post/148795/#comment_5025474 (22 плюсов, рейтинг 14)
  2. habrahabr.ru/post/148795/#comment_5024257 (14 плюсов, рейтинг 13)
  3. habrahabr.ru/post/148795/#comment_5024263 (12 плюсов, рейтинг 12)
  4. habrahabr.ru/post/148795/#comment_5024242 (11 плюсов, рейтинг 11)
  5. habrahabr.ru/post/148795/#comment_5024274 (11 плюсов, рейтинг 11)
  6. habrahabr.ru/post/148795/#comment_5024459 (9 плюсов, рейтинг 9)
  7. habrahabr.ru/post/148795/#comment_5024265 (8 плюсов, рейтинг 8)
  8. habrahabr.ru/post/148795/#comment_5025140 (8 плюсов, рейтинг 8)
  9. habrahabr.ru/post/148795/#comment_5024436 (8 плюсов, рейтинг 8)
  10. habrahabr.ru/post/148795/#comment_5024302 (8 плюсов, рейтинг 8)
Топ 10 по минусам
  1. habrahabr.ru/post/148795/#comment_5024378 (35 минусов, рейтинг -30)
  2. habrahabr.ru/post/148795/#comment_5025474 (8 минусов, рейтинг 14)
  3. habrahabr.ru/post/148795/#comment_5024367 (4 минусов, рейтинг 2)
  4. habrahabr.ru/post/148795/#comment_5026416 (2 минусов, рейтинг 3)
  5. habrahabr.ru/post/148795/#comment_5024299 (2 минусов, рейтинг 1)
  6. habrahabr.ru/post/148795/#comment_5025415 (2 минусов, рейтинг 1)
  7. habrahabr.ru/post/148795/#comment_5024257 (1 минусов, рейтинг 13)
  8. habrahabr.ru/post/148795/#comment_5026377 (1 минусов, рейтинг 1)
  9. habrahabr.ru/post/148795/#comment_5024942 (1 минусов, рейтинг 2)
  10. habrahabr.ru/post/148795/#comment_5026364 (1 минусов, рейтинг 0)

Топ 10 хабраюзеров по количеству комментариев
  1. opium оставил 68 комментариев
  2. z0rg оставил 30 комментариев
  3. multik оставил 20 комментариев
  4. aNDREIQA оставил 19 комментариев
  5. yul оставил 16 комментариев
  6. inossidabile оставил 16 комментариев
  7. RxB оставил 16 комментариев
  8. u_story оставил 15 комментариев
  9. pasdn оставил 15 комментариев
  10. DAiMor оставил 14 комментариев
Ответ написан
@humblegenius
Вот можно выполнить такой js. И сообщения сгрупируются по вопросам и ответам, а так же появится «Топ Плюсов» и «Топ Вопросов». Но правда жутко тормозит при выполнении его в консоли firebug. И с внешним видом я не сильно заморачивался.
{
var plusArr={},questArr={};
$('#comments > div.comment_item').each(function(i,el){
    
	el=$(el);
	var r=el.children('div.reply_comments'),
		rb=el.children('div.reply'),
		m=el.children('div.message'),
		info=el.children('div.info'),
		qs=r.children('div.comment_item'),
		show=$('<a>Вопросы</a>').insertAfter(m),
		user=$('a.username',info).text(),
		score=parseInt($('span.score',info).text());

	
	el.css('border','1px solid green');
	r.hide();
	rb.hide();
	show.toggle(function(){
			r.show();rb.show();
		},function(){
			r.hide();rb.hide();
	});
	$('a.reply',rb).text('Спросить');
	qs.each(function(i,el){
		el=$(el);
		var r=el.children('div.reply_comments'),
			rb=el.children('div.reply'),
			m=el.children('div.message'),
			info=el.children('div.info'),
			user=$('a.username',info).text(),
			show=$('<a>Ответы</a>').insertAfter(m),
			localscore=0;
		el.css('border','1px solid blue');
		r.hide();
		rb.hide();
		show.toggle(function(){
				r.show();rb.show();
			},function(){
				r.hide();rb.hide();
		});

		$('div.info:has(a.username:[text="'+user+'"]) span.score',r).each(function(i,el){
			localscore+=parseInt($(el).text());
		});
		score+=localscore;
		
		show.text('Ответы ('+r.children('div.comment_item').length+')');
		var stat='';
		stat+='<span> За ответы:'+((localscore>0)?'+':'')+localscore+'</span>';
		$(stat).appendTo(info);
		
		if(!questArr[user]) questArr[user]=1;
		else questArr[user]++;

	});
	
	show.text('Вопросы ('+qs.length+')');
	var stat='';
	stat+='<span> За ответы:'+((score>0)?'+':'')+score+'</span>';
	$(stat).appendTo(info);
	
});


var getTop =function(obj,n){
	var a=[];
	for(var i in obj)
		a.push({n:i,v:obj[i]});
	a.sort(function(a,b){return b.v-a.v;});
	return a.slice(0,n);
}
var makeTopHtml=function(a){
	for(var i=0,n=a.length;i<n;i++){
		var o=a[i];
		a[i]=o.n+': '+o.v;
	}
	return a.join(', ');
}


$('#comments div.info').each(function(i,el){
	var info=$(el),
		score=parseInt($('span.score',info).text());
	if(score!=0){
		var user=$('a.username',info).text();
		if(!plusArr[user]) plusArr[user]=0;
		plusArr[user]+=score;
	}
});
var stat='';
stat+='<div> Топ Плюсов:'+makeTopHtml(getTop(plusArr,10))+'</div>';
stat+='<div> Топ Вопросов:'+makeTopHtml(getTop(questArr,10))+'</div>';
$(stat).insertBefore($('#comments'));
}
Ответ написан
@humblegenius
А вообще по текушему html сложно определить, где вопрос, а где ответ. Это понятно только на первых двух уровнях, а потом уже кто-то может спрашивать, а кто-то отвечать. Мне кажется для Хабракампа нужна новая структура сообщений, чтоб когда пишешь сообщение, то явно указывать вопрос это или ответ.
Ответ написан
miraage
@miraage
Старый прогер
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы