Pull to refresh

Comments 67

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

*Сообщения на собственный номер бесплатны до 5 СМС в день при условии, что каждое сообщение помещается в 1 СМС (до 70 русских / 160 латинских символов). При превышении этих лимитов, сообщения оплачиваются согласно тарифу.
Раньше было больше (
С Mojolicious (perl framework) не знакомы? Можно гораздо проще сделать на нем, регулярные выражения и внешний wget не потребуется. А еще есть телеграмм бот готовый под ваши нужды, ссылку оставлять не буду, отвечу в личке.
UFO just landed and posted this here
В моджо вникать дольше и сложнее, чем в регулярки и вызов 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-модем, и заодно используется для всяких не сильно критичных уведомлений, за которые не хочется платить.
Было бы хорошо, дополнительно возможность отправлять в мессенджеры или например бота для телеграм)
UFO just landed and posted this here
А автора похоже олдскульный админский подход, т.е. накидать на перле по быстрому, используя стандартные средства, так чтобы работало.
В нем нет ничего плохого, всякие изыски из серии LWP::Simple::get или монструозного фреймворка для разбора html — оно как бы необязательные изыски, ведь задачу написанный код решает, при этом он даже понятен.
UFO just landed and posted this here
>корявенько, но работает…
Ну кстати тут даже не корявенько, а довольно добротно написано )
Так то на практике обычно бывает, что админы обмениваются и передают по наследству ацкие однострочники, как-то даже приходилось это дело расшифровывать.
UFO just landed and posted this here
Это верно, сейчас все-таки скрипт получился уровня «сейчас отмониторить пару объявлений».
Когда речь идет о сопровождении программного продукта с гибко меняющимися входными условиями, несколькими разными сайтами объявлений, все это эволюционирует по запросам клиентов, то этот код скорее всего придется переписать под ноль. И скорее всего уже не на перле. Я бы выбрал ПХП.
Пока я правда парсеры «с парой сотен наборов правил извлечений» еще не делал :)
Именно, это я еще этот скрипт писал, планируя выложить его на хабр, поэтому старался сделать более-менее красиво, обычно терпения на это не хватает. Правда потом за это сам же и расплачиваюсь, когда спустя полгода надо его чуть переделать.

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

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

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

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

gist.github.com/ValdikSS/5801c0c8a0e279d33466
Да, Питон — мощная штука, если он так умеет 1 строкой вытаскивать «div.description».
Ну и остальное тоже достойно.
Знал бы питон — писал бы на нем
Не в питоне дело, это обычный dom-parser, их и для perl предостаточно.
По поводу конкретики запроса — много резиновых слонов вам встретилось в результатах?
Скрытый текст
Понимаю, что вы в качестве примера использовали не ту фразу, по которой действительно ищете для себя товары, но ведь по какой-то причине вы выбрали именно её, а не другие.
UFO just landed and posted this here
UFO just landed and posted this here
Кстати, а для 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 оно «еще лучше» обработает.
В общем, сейчас я сам задаю урлы, но такой подход применять нельзя — надо как-то по-другому организовать вывод.
UFO just landed and posted this here
Да, теперь соглашусь, получился очень наглядный пример, как не надо писать скрипты.
Исправил:
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 страниц за раз
Почему много? Запрос-то конкретный + фильтры.
Авито внедрил «сохранённый поиск»…
Никто не попросил список (или фото) покупок в студию. И впечатления (стоило ли ради этого) все это затевать?
Sign up to leave a comment.

Articles