Комментарии 67
А почему wget, а не curl?
На sms.ru можно себе отправлять смску простым гет-запросом, где одним из параметров будет тупо текст смски, если правильно помню — там больше 20 смс в день можно на свой номер слать. бесплатно.
Спасибо за ссылку, но увы, не 20…
На собственный номер — для программистов, которые отправляют себе оповещения из своих программ *
*Сообщения на собственный номер бесплатны до 5 СМС в день при условии, что каждое сообщение помещается в 1 СМС (до 70 русских / 160 латинских символов). При превышении этих лимитов, сообщения оплачиваются согласно тарифу.
С Mojolicious (perl framework) не знакомы? Можно гораздо проще сделать на нем, регулярные выражения и внешний wget не потребуется. А еще есть телеграмм бот готовый под ваши нужды, ссылку оставлять не буду, отвечу в личке.
В моджо вникать дольше и сложнее, чем в регулярки и вызов system :)
Но почему wget, а не LWP мне всё равно не понятно.
Но почему wget, а не LWP мне всё равно не понятно.
LWP я не использовал по единственной причине: ничего о нем не знал до сего момента…
А wget успешно пользуюсь уже лет 15, еще с диалап-времен.
На самом деле согласен, LWP гораздо удобнее для того чтобы просто прочитать страничку в переменную. Если соберусь переделывать свой скрипт — перепишу на LWP.
Еще вопросы в ту же тему: а почему system(«mutt...») вместо какой-нибудь перловской библиотечки, почему даже system(«cp ...»), разве перл не умеет копировать файлы?.. Ответ тот же: мое не очень хорошее знание перл…
Конечно, не в ущерб читаемости и объему кода: чтобы не получилась замена одной строки с system на страницу кода инициализации какого-нибудь фреймворка.
А wget успешно пользуюсь уже лет 15, еще с диалап-времен.
На самом деле согласен, LWP гораздо удобнее для того чтобы просто прочитать страничку в переменную. Если соберусь переделывать свой скрипт — перепишу на LWP.
Еще вопросы в ту же тему: а почему system(«mutt...») вместо какой-нибудь перловской библиотечки, почему даже system(«cp ...»), разве перл не умеет копировать файлы?.. Ответ тот же: мое не очень хорошее знание перл…
Конечно, не в ущерб читаемости и объему кода: чтобы не получилась замена одной строки с system на страницу кода инициализации какого-нибудь фреймворка.
Я ни в коем случае не в претензию :) Просто по запросу perl http get в первых пяти результатах речь как раз про LWP, с примерами :), т.е. довольно распространённая и простая библиотека.
«Поэтому возникла у меня идея: а не поискать ли сервис, который раз в несколько минут проверяет объявления, и если появилось что-то интересное для меня — оповещает об этом? При этом оповещать лучше всего по смс, а то почту я не всегда проверяю оперативно.»
PushAll дает бесплатные push-уведомления на смартфон и компьютер.
PushAll дает бесплатные push-уведомления на смартфон и компьютер.
Пользовались sms.ru пару лет, потом пришлось отказаться — техподдержка никакая (не отвечает), СМС тупо не приходят. Перешли на одного из многих операторов. Хотя сейчас думаем отказаться от «понтового» FIRMNAME в имени отправителя. Сотовые операторы «просекли фишку» и планомерно повышают ценник. Отправлять можно через 3G/4G-модем или смарт на Android, благо есть операторы с безлимитными/адекватными СМС-тарифами.
Мы пользуемся обычным GSM-модемом для мониторинга оборудования. Он надежнее для тех случаев, когда например сеть упала, соответственно, ни на какую почту ничего не придет.
А sms.ru — бесплатная альтернатива, которая дублирует GSM-модем, и заодно используется для всяких не сильно критичных уведомлений, за которые не хочется платить.
А sms.ru — бесплатная альтернатива, которая дублирует GSM-модем, и заодно используется для всяких не сильно критичных уведомлений, за которые не хочется платить.
Было бы хорошо, дополнительно возможность отправлять в мессенджеры или например бота для телеграм)
А автора похоже олдскульный админский подход, т.е. накидать на перле по быстрому, используя стандартные средства, так чтобы работало.
В нем нет ничего плохого, всякие изыски из серии LWP::Simple::get или монструозного фреймворка для разбора html — оно как бы необязательные изыски, ведь задачу написанный код решает, при этом он даже понятен.
В нем нет ничего плохого, всякие изыски из серии LWP::Simple::get или монструозного фреймворка для разбора html — оно как бы необязательные изыски, ведь задачу написанный код решает, при этом он даже понятен.
>корявенько, но работает…
Ну кстати тут даже не корявенько, а довольно добротно написано )
Так то на практике обычно бывает, что админы обмениваются и передают по наследству ацкие однострочники, как-то даже приходилось это дело расшифровывать.
Ну кстати тут даже не корявенько, а довольно добротно написано )
Так то на практике обычно бывает, что админы обмениваются и передают по наследству ацкие однострочники, как-то даже приходилось это дело расшифровывать.
Это верно, сейчас все-таки скрипт получился уровня «сейчас отмониторить пару объявлений».
Когда речь идет о сопровождении программного продукта с гибко меняющимися входными условиями, несколькими разными сайтами объявлений, все это эволюционирует по запросам клиентов, то этот код скорее всего придется переписать под ноль. И скорее всего уже не на перле. Я бы выбрал ПХП.
Пока я правда парсеры «с парой сотен наборов правил извлечений» еще не делал :)
Когда речь идет о сопровождении программного продукта с гибко меняющимися входными условиями, несколькими разными сайтами объявлений, все это эволюционирует по запросам клиентов, то этот код скорее всего придется переписать под ноль. И скорее всего уже не на перле. Я бы выбрал ПХП.
Пока я правда парсеры «с парой сотен наборов правил извлечений» еще не делал :)
Именно, это я еще этот скрипт писал, планируя выложить его на хабр, поэтому старался сделать более-менее красиво, обычно терпения на это не хватает. Правда потом за это сам же и расплачиваюсь, когда спустя полгода надо его чуть переделать.
Но 1 строчка старого доброго system(«шелловская команда») зачастую понятнее многим, чем инициализация хитрого фреймворка, который еще не у всех установлен, либо не той версии, из-за чего сперва провозишься с полчаса, пытаясь его установить, плюнешь, да и перепишешь скрипт сам.
Кстати, я честно пытался вместо регекспа применить HTML::Parser. Разбирался с ним, разбирался, потом понял, что мне в данном случае важнее не содержимое полей в тегах, которые он вытаскивает, а именно определенная подстрока в виде шаблона. Ну и считаю, что регексп, который у меня занял ровно 1 строчку — оптимальное решение среди доступных инструментов.
Конечно, эту строчку придется периодически переписывать по мере смены верстки авито.
Но 1 строчка старого доброго system(«шелловская команда») зачастую понятнее многим, чем инициализация хитрого фреймворка, который еще не у всех установлен, либо не той версии, из-за чего сперва провозишься с полчаса, пытаясь его установить, плюнешь, да и перепишешь скрипт сам.
Кстати, я честно пытался вместо регекспа применить HTML::Parser. Разбирался с ним, разбирался, потом понял, что мне в данном случае важнее не содержимое полей в тегах, которые он вытаскивает, а именно определенная подстрока в виде шаблона. Ну и считаю, что регексп, который у меня занял ровно 1 строчку — оптимальное решение среди доступных инструментов.
Конечно, эту строчку придется периодически переписывать по мере смены верстки авито.
Может быть, для новичков? Показать некоторые типовые решения, которые мне пришлось применить. Ну и как я справился с некоторыми трудностями, в данном случае тоже типовыми.
Сам давно читаю хабр, и в подобных решениях нахожу для себя иногда что-нибудь интересное.
Ну и я не говорю что писал скрипт специально для хабра, я его писал для себя, просто стараясь сделать его более-менее читаемым для других.
Сам давно читаю хабр, и в подобных решениях нахожу для себя иногда что-нибудь интересное.
Ну и я не говорю что писал скрипт специально для хабра, я его писал для себя, просто стараясь сделать его более-менее читаемым для других.
Следующим этапом будет борьба с блокировками по ip.
Идея интересная. Я только не совсем понял, какой смысл присылать оповещения обо вообще всех новых поступлениях? Хотя бы минимальную фильрацию по имени/содержимому бы.
Я себе похожим образом искал Haswell-процессор, только без оповещений, просто вывел на отдельный монитор и раз в полчасика просматривал.
Парсить регэкспом, это, конечно, приемлемо, но не особо удобно-то.
gist.github.com/ValdikSS/5801c0c8a0e279d33466
Парсить регэкспом, это, конечно, приемлемо, но не особо удобно-то.
gist.github.com/ValdikSS/5801c0c8a0e279d33466
А почему sms, а не telegram-бот какой?
По поводу конкретики запроса — много резиновых слонов вам встретилось в результатах?
Скрытый текст
Понимаю, что вы в качестве примера использовали не ту фразу, по которой действительно ищете для себя товары, но ведь по какой-то причине вы выбрали именно её, а не другие.
Кстати, а для Perl нет чего-то вроде Scrapy? Как-то игрался, оставил очень положительные впечатления.
Великий и могучий Perl. Когда-то он был основным языком веб-разработки, уступив затем место PHP. Ностальгия…
* … уступив затем зачем-то место … :)
Просто людей которые писали программы руководствуюсь правилу:«Напиши первые 40 символов программы, затем нажми ввод и остальную программу напиши в следующей строчке» надо было заменить на других. А с ними у ушел Перл.
:)
Не, на perl'е можно писать просто чтобы писать на perl'е, можно писать неподдерживаемый код, можно писать просто странный код, а можно писать хорошо читаемый и поддерживаемый код. Он многое позволяет, нужно просто правильно использовать и по ситуации. Вон, python вполне не плох, порог вхождения не высокий, есть рекомендации как писать правильно, но он так же позволяет написать откровенно странный и сложно поддерживаемый код.
Не, на perl'е можно писать просто чтобы писать на perl'е, можно писать неподдерживаемый код, можно писать просто странный код, а можно писать хорошо читаемый и поддерживаемый код. Он многое позволяет, нужно просто правильно использовать и по ситуации. Вон, python вполне не плох, порог вхождения не высокий, есть рекомендации как писать правильно, но он так же позволяет написать откровенно странный и сложно поддерживаемый код.
Почему-то именно перл меня все время провоцирует писать как можно более неподдерживаемый код.
Можно написать программу в стиле ПХП, но гораздо проще нарисовать крючочков-закорючек, и все это будет будет быстро и будет работать. Правда потом при попытке переделать — часто проще написать заново.
Хотя, я очень стараюсь писать понятно, как минимум для себя, а по возможности и для других.
Можно написать программу в стиле ПХП, но гораздо проще нарисовать крючочков-закорючек, и все это будет будет быстро и будет работать. Правда потом при попытке переделать — часто проще написать заново.
Хотя, я очень стараюсь писать понятно, как минимум для себя, а по возможности и для других.
Из наблюдений того времени
perl прогеры строгие и немногословные, на все вопросы отвечали, если отвечали: «man {непонятное слово}»
если учесть, что даже вывод hello world сопровождался приколами с разницей в переводах строк на window и linux, до джуниора доживали немногие. Если ты доживал до джуниора ты скорее всего умел собирать из исходников чего угодно что угодно, походу познакомившись с разработчиком этого чего угодно и прислав ему пару патчей.
php прогеры, по большей части даже не прогеры, а так, желающие запилить что-нибудь. Любой вопрос, даже банальный, вызывал флейм на неделю, обязательные советы убить себя и заканчивался предложениями «а давай те уже чего-нить запилим нормальное, например cms, ведь cms это круто». Пара месяцев разработки на пхп в то время давали понимание, как что угодно собрать из говна и палок.
А вот ведь даже не верится, что было время, когда было совершенно неясно что же выбрать, пхп или perl.
perl прогеры строгие и немногословные, на все вопросы отвечали, если отвечали: «man {непонятное слово}»
если учесть, что даже вывод hello world сопровождался приколами с разницей в переводах строк на window и linux, до джуниора доживали немногие. Если ты доживал до джуниора ты скорее всего умел собирать из исходников чего угодно что угодно, походу познакомившись с разработчиком этого чего угодно и прислав ему пару патчей.
php прогеры, по большей части даже не прогеры, а так, желающие запилить что-нибудь. Любой вопрос, даже банальный, вызывал флейм на неделю, обязательные советы убить себя и заканчивался предложениями «а давай те уже чего-нить запилим нормальное, например cms, ведь cms это круто». Пара месяцев разработки на пхп в то время давали понимание, как что угодно собрать из говна и палок.
А вот ведь даже не верится, что было время, когда было совершенно неясно что же выбрать, пхп или perl.
можно было бы сделать проще — есть же подписка на результаты поиска и когда в подписке появляется что-то новое, у нее слева (на странице подписок) появляется синий кружок.
s — позволяет внутри одного регекспа проводить поиск в нескольких строчках
Немного не так. Модификатор просто позволяет точке («.» — любой символ) соответствовать вообще любым символам, переносу строки в том числе. ;) Используется обычно вместе с m. А без этого модификатора регулярка всё равно работает со всем содержимым переданной переменной, просто переносы строки придётся указывать явно… Т.е. при указании этого модификатора все \n можно/лучше заменить на «точки», иначе пропадет смысл использование модификатора.
У Вас регулярка указана не строкой в кавычках, поэтому внутри кавычки экранировать не нужно.
Ленивые квантификаторы, это правильно, ну чуть быстрее будет обрабатываться если их заменить на что-то вроде [^"]+, например (в нужном месте). В данном конкретном случае это почти ничего не изменит, но вырабатывать правильные привычки — правильно :)
Спасибо, ценные замечания.
Действительно, я сначала пытался использовать модификатор m для многострочного поиска, удивлялся почему не работает поиск по точке.
В данном случае, подумал что явно указывать переносы — напрасно загромождать регексп, ведь меня не волновало количество строк, а только появление конкретного тега.
Про [^"]+ вместо .?* — не подумал, действительно, должно быть быстрее, стараюсь писать правильно по возможности, чего и всем желаю. :)
Действительно, я сначала пытался использовать модификатор 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 оно «еще лучше» обработает.
В общем, сейчас я сам задаю урлы, но такой подход применять нельзя — надо как-то по-другому организовать вывод.
Если урл и соотв. $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;
и
Ну и, как водится, CentOS ругнулся на MIME::Lite, поэтому:
yum install perl-MIME-Lite
Исправил:
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 мин или ещё реже и всё.
тогда вы пропустите объявления =)
Если вам нужно что-то типа высокочастотного трейдинга, то рекомендую подкупить модератора авито — тогда самые вкусные объявления даже не появятся на доске ))
Авито внедрил «сохранённый поиск»…
Никто не попросил список (или фото) покупок в студию. И впечатления (стоило ли ради этого) все это затевать?
Пользуюсь https://urlooker.com есть и смс и проверки каждые 30 минут.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Как я мониторил Avito по SMS