Вот, очередной кусочек гомнокода из себя выдавил. Нет бы по делу, всё какой-то фигнёй занимаюсь. История, как обычно, начинается издалека. А именно — всё с тех же замечательных Ответов@mail.ru. Кто там бывает — наверняка видел там в каждом разделе по замечательному чятику. Кое-где эти чятики унылы и пустынны, а кое-где прямо кипят жизнью. Периодически там такие дискуссии образуются — закачаишсо (ну, эт вообще-то везде так, но речь не об этом). А самое печальное что? То, что в чятике видно только 25 последних сообщений, а все предыдущие отправляются к Евгении Марковне на веки вечные, и назад не возвращаются. А ведь так хочется иногда почитать на досуге, вспомнить всю эту фигню… Ну, копипастить — это, конечно, вариант, но утомительно и вообще, не будешь же круглосуточно сидеть и F5 жмакать. В общем, сочинил я гадость, слегка облегчающую эту задачу. Первая часть гадости, и самая важная — это кагбе паучок. Получает страничку с репликами, разбирает ее hpricot‘ом и кладет в БД (sqlite). Поскольку разработчики чятика не позаботились об удобстве автоматизированного разбора (о, сколько там косяков: штампы времени с точностью до минуты, каждая реплика разбита на 2 части — имя с таймстампом и собственно текст, причем вся эта бодяга лежит кучей в общем div’е, красотища…), приходится извращаться. Против div’ной свалки помогает each_slice(2), с отсутствием идентификации реплик при сохранении борется хитрый constraint в базе, следящий за уникальностью пары время + текст сообщения (сначала думал добавить еще и имя автора, но решил, что это будет косяк: имя можно поменять, и тогда появятся лишние записи, да еще и кучей). Вот такой паучок:
#! /usr/local/bin/ruby require 'rubygems' require 'hpricot' require 'open-uri' require 'sqlite3' db = SQLite3::Database.new(File.dirname(__FILE__) + "/chat.db") # или тут лучше File.join()? doc = open("http://otvet.mail.ru/doit?action=chatmessages&cid=4") { |f| Hpricot(f) } divs = doc.search("body/.Dialog/div") unless divs.empty? File.new("last", "w").puts Time.now.to_s chat = [] divs.each_slice(2) do |line| chat < < [line[0].inner_text.split("\n"), line[1].inner_text].flatten # всё через жо end chat.uniq! chat.reverse! # странно, почему цепочкой не работает? chat.each do |r| db.execute("insert into chat values ( ?, ?, ? )", r[0], r[1], r[2]) end end |
Гомнокод во всей красе, объёмом 20 строчек. Пока умеет парсить только чятик в разделе «Компьютеры и Интернет», но впилить все остальные, в общем-то, не трудно. Займусь как-нибудь на досуге. А пока оно вполне себе успешно дергается сron’ом каждые 3 минуты (интервал подбирать надо бы, да) и делает своё чёрное дельце.
Вторая часть (код, уж извините, показывать не буду, ибо это сущий п[ой!]здец, да и не столь принципиальна она) организует к нашей БД замечательную веб-мордочку. Запускается через rack (кстати, у меня не получилось смонтировать приложение в подкаталог вхоста, хотя всё по инструкции. К чему бы это?) и бесхитростно так (с пагинацией даже) в pre всё выводит. Полюбоваться можно (пока что) тут: http://toys.dxfoto.ru/.
[тут была реферальная ссылка на какой-то говночятик] самый классный чаТ!
да ты чо? риальне?