Skip to content

Instantly share code, notes, and snippets.

@bolshakov
Last active December 11, 2015 11:58
Show Gist options
  • Save bolshakov/4597680 to your computer and use it in GitHub Desktop.
Save bolshakov/4597680 to your computer and use it in GitHub Desktop.

Скрипт сохраняет все статьи с сайта notproud.ru и считает частоту употребления слов.

Использование:

  1. gem install bundler
  2. bundle install
  3. rake setup_db # Создаст базу данных и необходимые таблицы
  4. rake fetch_pages # Созранит все признания сайта в базу данных
  5. rake build_statistics # Построит статистику слов и сохранит в БД
  6. rake show_statistics # Покажет топ слов
source 'https://rubygems.org'
gem 'mechanize'
gem 'ruby-stemmer'
gem 'sequel'
gem 'sqlite3'
gem 'active_support'
gem 'i18n'
gem 'rake'
gem 'hirb-unicode'
# encoding: utf-8
require 'mechanize'
class NotProudParser
def initialize
@base_url = 'http://notproud.ru'
@agent = Mechanize.new
@pages = DB[:pages]
@categories = ['greed', 'envy', 'anger', 'lust', 'sloth', 'cruelty', 'treachery', 'other']
do_the_job
end
def do_the_job
@categories.each do |category|
@agent.get("#{@base_url}/#{category}/") do |page|
parse_link page.link_with(text: /читать дальше/)
end
end
end
private
def next_page(page)
link = page.link_with(text: /читать дальше/)
parse_link link
end
def parse_link(link)
if link.present?
page = @agent.click(link)
if @pages.where(url: link.uri.to_s).limit(1).count == 0
text = page.root.css('td.font2[align=left][valign=top]').first.content
@pages.insert(url: link.uri.to_s, text: text)
puts "Получение страницы: #{link.uri.to_s}"
end
next_page(page)
end
end
end
# encoding: utf-8
require 'sequel'
require 'lingua/stemmer'
require 'active_support/core_ext'
require 'hirb-unicode'
require File.expand_path('../not_proud_parser', __FILE__)
DB = Sequel.sqlite('pages.db')
BANNED_WORDS = %w(ним чтоб ест ем нет раз до одн со из ни есл нег теб и эт мен мне на но а у был за то уж от бы к по ещ тольк даж о же не в с все так очен я что он как этот он мы ве котор он так сво вы ты так ег себ е когд вот друг наш сам мо кто сам там как их пот ничт кажд пот тогд зде какой-т что-т всегд ваш никт поч поэт сво никогд никак некотор тво куд кто-т как-т зач се туд какой-нибуд всег откуд сюд стол где-т что-нибуд почему-т нек когда-т чег отсюд че нечт кто-нибуд вон оттуд какой-либ так куда-т никуд как таков ко отт некогд отч нигд кое-чт когда-нибуд чей-т где-нибуд такой-т что-либ всюд как-нибуд откуда-т ничут куда-нибуд скол тут-т этак тот-т так-т кое-как кое-как кое-кт зачем-т кое-гд кто-либ ихн нект отчего-т каков эдак нибуд тогда-т чего-т когда-либ поч отовсюд нич досел он ниоткуд эк чей-нибуд сям ник).uniq
desc 'Создать базу данных'
task :setup_db do
DB.create_table :pages do
primary_key :id
String :url, unique: true, null: false
Text :text, unique: true, null: false
end
DB.create_table :words do
primary_key :word
String :word, unique: true, null: false
Integer :count
end
end
desc 'Скачать все старницы с http://notproud.ru'
task :fetch_pages do
NotProudParser.new
end
desc 'Проанализировать скачанные страницы и выделить из них слова'
task :build_statistics do
stemmer= Lingua::Stemmer.new(language: "ru")
pages = DB[:pages]
words = DB[:words]
pages.each do |page|
puts "Обработка страницы: #{page[:url]}..."
page[:text].mb_chars.downcase.gsub('ё', 'е').gsub(/[?!"',.-]/, ' ').split.uniq.each do |word|
stemmed_word = stemmer.stem(word)
unless BANNED_WORDS.include?(stemmed_word)
if words.where(word: stemmed_word).limit(1).count == 0
words.insert(word: stemmed_word, count: 1)
else
words.where(word: stemmed_word).limit(1).update(count: :count + 1)
end
end
end
end
end
desc 'Показать статистику слов'
task :show_statistics, [:limit] do |t, args|
limit = args.limit || 10
words = DB[:words]
puts Hirb::Helpers::AutoTable.render words.reverse_order(:count).limit(limit)
puts "Всего слов: #{words.count}"
end
desc 'Удалить запрещенные слова из базы'
task 'remove_banned_words' do
words = DB[:words]
words.where(word: BANNED_WORDS).delete
end
desc 'Очистить таблицу со словами'
task 'remove_all_words' do
DB[:words].delete
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment