Как стать автором
Обновить

Комментарии 67

А почему wget, а не curl?
Тут вообще много почему, начиная с perl`а.
Странные у вас почему, а почему curl а не wget?
Чем перл не нравится, на чем предложите писать?
на python?
а как же LWP::Simple?
зачем все так сложно wget, curl?
вот именно.
На sms.ru можно себе отправлять смску простым гет-запросом, где одним из параметров будет тупо текст смски, если правильно помню — там больше 20 смс в день можно на свой номер слать. бесплатно.
Спасибо за ссылку, но увы, не 20…
На собственный номер — для программистов, которые отправляют себе оповещения из своих программ *

*Сообщения на собственный номер бесплатны до 5 СМС в день при условии, что каждое сообщение помещается в 1 СМС (до 70 русских / 160 латинских символов). При превышении этих лимитов, сообщения оплачиваются согласно тарифу.
Раньше было больше (
С Mojolicious (perl framework) не знакомы? Можно гораздо проще сделать на нем, регулярные выражения и внешний wget не потребуется. А еще есть телеграмм бот готовый под ваши нужды, ссылку оставлять не буду, отвечу в личке.
НЛО прилетело и опубликовало эту надпись здесь
В моджо вникать дольше и сложнее, чем в регулярки и вызов system :)
Но почему wget, а не LWP мне всё равно не понятно.
LWP я не использовал по единственной причине: ничего о нем не знал до сего момента…
А wget успешно пользуюсь уже лет 15, еще с диалап-времен.

На самом деле согласен, LWP гораздо удобнее для того чтобы просто прочитать страничку в переменную. Если соберусь переделывать свой скрипт — перепишу на LWP.

Еще вопросы в ту же тему: а почему system(«mutt...») вместо какой-нибудь перловской библиотечки, почему даже system(«cp ...»), разве перл не умеет копировать файлы?.. Ответ тот же: мое не очень хорошее знание перл…
Конечно, не в ущерб читаемости и объему кода: чтобы не получилась замена одной строки с system на страницу кода инициализации какого-нибудь фреймворка.
Я ни в коем случае не в претензию :) Просто по запросу perl http get в первых пяти результатах речь как раз про LWP, с примерами :), т.е. довольно распространённая и простая библиотека.
«Поэтому возникла у меня идея: а не поискать ли сервис, который раз в несколько минут проверяет объявления, и если появилось что-то интересное для меня — оповещает об этом? При этом оповещать лучше всего по смс, а то почту я не всегда проверяю оперативно.»
PushAll дает бесплатные push-уведомления на смартфон и компьютер.
Спасибо, глянул, интересная альтернатива, а то как раз вчера не пришла пара смсок от sms.ru, это периодически случается…
Пользовались sms.ru пару лет, потом пришлось отказаться — техподдержка никакая (не отвечает), СМС тупо не приходят. Перешли на одного из многих операторов. Хотя сейчас думаем отказаться от «понтового» FIRMNAME в имени отправителя. Сотовые операторы «просекли фишку» и планомерно повышают ценник. Отправлять можно через 3G/4G-модем или смарт на Android, благо есть операторы с безлимитными/адекватными СМС-тарифами.
Мы пользуемся обычным GSM-модемом для мониторинга оборудования. Он надежнее для тех случаев, когда например сеть упала, соответственно, ни на какую почту ничего не придет.
А sms.ru — бесплатная альтернатива, которая дублирует GSM-модем, и заодно используется для всяких не сильно критичных уведомлений, за которые не хочется платить.
Было бы хорошо, дополнительно возможность отправлять в мессенджеры или например бота для телеграм)
НЛО прилетело и опубликовало эту надпись здесь
А автора похоже олдскульный админский подход, т.е. накидать на перле по быстрому, используя стандартные средства, так чтобы работало.
В нем нет ничего плохого, всякие изыски из серии LWP::Simple::get или монструозного фреймворка для разбора html — оно как бы необязательные изыски, ведь задачу написанный код решает, при этом он даже понятен.
НЛО прилетело и опубликовало эту надпись здесь
>корявенько, но работает…
Ну кстати тут даже не корявенько, а довольно добротно написано )
Так то на практике обычно бывает, что админы обмениваются и передают по наследству ацкие однострочники, как-то даже приходилось это дело расшифровывать.
НЛО прилетело и опубликовало эту надпись здесь
Это верно, сейчас все-таки скрипт получился уровня «сейчас отмониторить пару объявлений».
Когда речь идет о сопровождении программного продукта с гибко меняющимися входными условиями, несколькими разными сайтами объявлений, все это эволюционирует по запросам клиентов, то этот код скорее всего придется переписать под ноль. И скорее всего уже не на перле. Я бы выбрал ПХП.
Пока я правда парсеры «с парой сотен наборов правил извлечений» еще не делал :)
Именно, это я еще этот скрипт писал, планируя выложить его на хабр, поэтому старался сделать более-менее красиво, обычно терпения на это не хватает. Правда потом за это сам же и расплачиваюсь, когда спустя полгода надо его чуть переделать.

Но 1 строчка старого доброго system(«шелловская команда») зачастую понятнее многим, чем инициализация хитрого фреймворка, который еще не у всех установлен, либо не той версии, из-за чего сперва провозишься с полчаса, пытаясь его установить, плюнешь, да и перепишешь скрипт сам.

Кстати, я честно пытался вместо регекспа применить HTML::Parser. Разбирался с ним, разбирался, потом понял, что мне в данном случае важнее не содержимое полей в тегах, которые он вытаскивает, а именно определенная подстрока в виде шаблона. Ну и считаю, что регексп, который у меня занял ровно 1 строчку — оптимальное решение среди доступных инструментов.
Конечно, эту строчку придется периодически переписывать по мере смены верстки авито.
НЛО прилетело и опубликовало эту надпись здесь
Может быть, для новичков? Показать некоторые типовые решения, которые мне пришлось применить. Ну и как я справился с некоторыми трудностями, в данном случае тоже типовыми.
Сам давно читаю хабр, и в подобных решениях нахожу для себя иногда что-нибудь интересное.
Ну и я не говорю что писал скрипт специально для хабра, я его писал для себя, просто стараясь сделать его более-менее читаемым для других.
НЛО прилетело и опубликовало эту надпись здесь
А что в ней плохого?
Как мне еще одной командой читать весь файл в переменную?
Я даже искал какие-нибудь «правила хорошего тона» для перла — не нашел, может, плохо искал?

Во всех книжках/доках по перлу написано про подобные конструкции $/ — нигде не упоминается о том что они плохи.
НЛО прилетело и опубликовало эту надпись здесь
Следующим этапом будет борьба с блокировками по ip.
Авито не будет блокировать. если он будет раз в 10 минут сканировать.
Идея интересная. Я только не совсем понял, какой смысл присылать оповещения обо вообще всех новых поступлениях? Хотя бы минимальную фильрацию по имени/содержимому бы.
Я себе похожим образом искал Haswell-процессор, только без оповещений, просто вывел на отдельный монитор и раз в полчасика просматривал.

Парсить регэкспом, это, конечно, приемлемо, но не особо удобно-то.

gist.github.com/ValdikSS/5801c0c8a0e279d33466
Да, Питон — мощная штука, если он так умеет 1 строкой вытаскивать «div.description».
Ну и остальное тоже достойно.
Знал бы питон — писал бы на нем
Не в питоне дело, это обычный dom-parser, их и для perl предостаточно.
А почему sms, а не telegram-бот какой?
По поводу конкретики запроса — много резиновых слонов вам встретилось в результатах?
Скрытый текст
Понимаю, что вы в качестве примера использовали не ту фразу, по которой действительно ищете для себя товары, но ведь по какой-то причине вы выбрали именно её, а не другие.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Кстати, а для Perl нет чего-то вроде Scrapy? Как-то игрался, оставил очень положительные впечатления.
Великий и могучий Perl. Когда-то он был основным языком веб-разработки, уступив затем место PHP. Ностальгия…
* … уступив затем зачем-то место … :)
Просто людей которые писали программы руководствуюсь правилу:«Напиши первые 40 символов программы, затем нажми ввод и остальную программу напиши в следующей строчке» надо было заменить на других. А с ними у ушел Перл.
:)
Не, на perl'е можно писать просто чтобы писать на perl'е, можно писать неподдерживаемый код, можно писать просто странный код, а можно писать хорошо читаемый и поддерживаемый код. Он многое позволяет, нужно просто правильно использовать и по ситуации. Вон, python вполне не плох, порог вхождения не высокий, есть рекомендации как писать правильно, но он так же позволяет написать откровенно странный и сложно поддерживаемый код.
Почему-то именно перл меня все время провоцирует писать как можно более неподдерживаемый код.
Можно написать программу в стиле ПХП, но гораздо проще нарисовать крючочков-закорючек, и все это будет будет быстро и будет работать. Правда потом при попытке переделать — часто проще написать заново.
Хотя, я очень стараюсь писать понятно, как минимум для себя, а по возможности и для других.
)) Ну это уже не должно быть проблемой языка ;)
Из наблюдений того времени

perl прогеры строгие и немногословные, на все вопросы отвечали, если отвечали: «man {непонятное слово}»
если учесть, что даже вывод hello world сопровождался приколами с разницей в переводах строк на window и linux, до джуниора доживали немногие. Если ты доживал до джуниора ты скорее всего умел собирать из исходников чего угодно что угодно, походу познакомившись с разработчиком этого чего угодно и прислав ему пару патчей.

php прогеры, по большей части даже не прогеры, а так, желающие запилить что-нибудь. Любой вопрос, даже банальный, вызывал флейм на неделю, обязательные советы убить себя и заканчивался предложениями «а давай те уже чего-нить запилим нормальное, например cms, ведь cms это круто». Пара месяцев разработки на пхп в то время давали понимание, как что угодно собрать из говна и палок.

А вот ведь даже не верится, что было время, когда было совершенно неясно что же выбрать, пхп или perl.
можно было бы сделать проще — есть же подписка на результаты поиска и когда в подписке появляется что-то новое, у нее слева (на странице подписок) появляется синий кружок.
s — позволяет внутри одного регекспа проводить поиск в нескольких строчках

Немного не так. Модификатор просто позволяет точке («.» — любой символ) соответствовать вообще любым символам, переносу строки в том числе. ;) Используется обычно вместе с m. А без этого модификатора регулярка всё равно работает со всем содержимым переданной переменной, просто переносы строки придётся указывать явно… Т.е. при указании этого модификатора все \n можно/лучше заменить на «точки», иначе пропадет смысл использование модификатора.

У Вас регулярка указана не строкой в кавычках, поэтому внутри кавычки экранировать не нужно.
Ленивые квантификаторы, это правильно, ну чуть быстрее будет обрабатываться если их заменить на что-то вроде [^"]+, например (в нужном месте). В данном конкретном случае это почти ничего не изменит, но вырабатывать правильные привычки — правильно :)
Спасибо, ценные замечания.
Действительно, я сначала пытался использовать модификатор m для многострочного поиска, удивлялся почему не работает поиск по точке.

В данном случае, подумал что явно указывать переносы — напрасно загромождать регексп, ведь меня не волновало количество строк, а только появление конкретного тега.

Про [^"]+ вместо .?* — не подумал, действительно, должно быть быстрее, стараюсь писать правильно по возможности, чего и всем желаю. :)
Немного не по теме. Сервис по уведомлению о интересующем товаре на аукционах.
Писал в основном для себя (с надеждой на развитие) — сервис по уведомлениям за появлением интересующих товаров на аукционах (правда только по email на данный момент): auctia.net
Правда сейчас проект в небольшой заморозке (и не актуален для России из-за закрытия Молотка), а так-же в ожидании переезда на новый сервер.
Но возможно кого-то заинтересует.
Нашел еще глюк, кстати вызванный подходом с моими system-костылями:
Если урл и соотв. $text содержит знак &, то угадайте, что происходит по команде:
system(«echo '$text' | $mailer -s 79xxxxxxxxx xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\@sms.ru»);

Правильно, & срабатывает как спецсимвол, echo перенаправляется туда не знаю куда, и письмо приходит пустое, а смс вообще не приходит.
Сейчас вылечил костылем в виде $text=~s/&/%26/g;
Ну и урлы типа sometext>/etc/passwd оно «еще лучше» обработает.
В общем, сейчас я сам задаю урлы, но такой подход применять нельзя — надо как-то по-другому организовать вывод.
НЛО прилетело и опубликовало эту надпись здесь
Да, теперь соглашусь, получился очень наглядный пример, как не надо писать скрипты.
Исправил:
use MIME::Lite;
и
sub sendsms {
    my $text=shift;
    $text=~s/_/%5F/g;
    my $msg = MIME::Lite->new(  From    => 'foo@test.com',
                                To      => 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx@sms.ru',
                                Subject => '79xxxxxxxxx',
                                Type    => 'text/plain; charset=UTF-8',
                                Data    => "$text" );
    $msg->send();
}

Ну и, как водится, CentOS ругнулся на MIME::Lite, поэтому:
yum install perl-MIME-Lite
как быстро вас забанило авито с таким парсингом?
Не забанит. В cron выставил 20 мин или ещё реже и всё.
тогда вы пропустите объявления =)
Если вам нужно что-то типа высокочастотного трейдинга, то рекомендую подкупить модератора авито — тогда самые вкусные объявления даже не появятся на доске ))
да не, я как бы намекаю, что вгетом с 20 минутными паузами вы много пропустите — либо второй вариант — парсить 4-5 страниц за раз
Почему много? Запрос-то конкретный + фильтры.
Авито внедрил «сохранённый поиск»…
Никто не попросил список (или фото) покупок в студию. И впечатления (стоило ли ради этого) все это затевать?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории