×Закрыть

jParser — сайт для пошуку роботи Java-програміста в Києві, написаний Java-програмістом

Я певний час шукаю роботу Java-програміста в Києві. Для цього я раніше багато разів на день заходив на декілька сайтів, щоб перевірити, чи не з’явилися нові вакансії. Це забирало досить багато часу, тому я вирішив написати програму, яка парситиме вакансії і представлятиме їх в зручному вигляді.

Так з’явився jParser — www.jparser.info

Парсинг відбувається на основних сайтах працевлаштування — rabota.ua, work.ua, hh.ua, jobs.ua, а також на dou.ua (сподіваюся, адміністрація останнього не матиме до мене через це претензій, для перегляду повної вакансії відвідувач все рівно переходить на оригінальний сайт).

Всі знайдені вакансії автоматично публікуються в твіттер twitter.com/jParser_info

Якщо ви також шукаєте роботу Java-програміста в Києві, можливо, мій сайт буде вам цікавий.

Код на Github: github.com/olegshan/JobParser

До речі, я досі в пошуках роботи. Якщо ви представник компанії, яка шукає програміста, буду радий поспілкуватися :)

LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Зробив fork і скинув pull request з деякимим правками і рекомендаціями. Сподіваюся допоможе

Тарас, дякую! Саме читаю їх. Частину, такі як constructor DI і додання інтерфейсів я теж планував додати, та все не було часу. Розбираюся з рештою.

Ох, тобі варто було б хоча б запустити в себе. Дуже багато чого посипалося. Основна причина — ти передав у всі методи один doc, хоча на деяких сайтах багато даних (дата, компанія) витягуються з внутрішньої сторінки і потребують створення свого доку з url, який зараз взагалі не передається в методи.

Відкотив поки. Там було багато хороших ідей і змін, я їх обов’язково втілю, але парсинг у такому вигляді не працює. Причина — за деякими даними (дата, компанія) на деяких сайтах треба заходити всередину вакансії, зі сторінки пошуку ця інформація недоступна. Для цього методи getDate i getCompany мають отримати лінк на вакансію і за ним згенерувати новий док методом getDoc, який знову ж таки має бути доступним.

Якщо маєш бажання продовжити, буду радий.

Довелося відкотити, пояснив нижче.

Замерджив, підправив баги, все працює. Дякую ще раз за допомогу!

Непогано! Думаю скоро знайдеш роботу)
А ось сайт де давно реалізована така ідея ua.jooble.org

Дякую. Джублом користувався, досі отримую від них розсилку, але там далеко не всі вакансії релевантні і не всі присутні.

Тести я ще не комітив. Маю декілька робочих, які використовував для роботи з базою, але остаточних ще немає. Планую написати хороші тести незабаром. І таки вивчити TDD)

Досить непогано, але є один недолік :) У вас попадаються JavaScript вакансії, постарайтеся їх позбутися :) Також, було б дуже класно, якщо б ви, в майбутньому, добавили можливість вибору міста і фільтр по роках досвіду роботи, якщо захочете розширювати проект.

Про JavaScript я вже писав нижче. Щодо розширення переліку міст — можливо у майбутньому зроблю, думав про це.

Точно не знаю существуют ли у нас уже подобные ресурсы, которые собирают данные с топовых сайтов по трудоустройству — но я не встречал.
Возможно имеет смысл увеличить функционал сайта?
Добавить основные фильтры, к примеру по технологиям (не только java ведь нужна :)), опыт работы, город и т.д.
Посмотреть в сторону, такого себе, стартапа? :)
Авось что-то выгорит и можно будет поднять деньжат

о, круто, спасибо
а чем не устроил этот сайт для поиска Java вакансий?

Сомневаюсь, что на этом можно деньжат поднять.
Вот если бы парсило резюмехи/профили кандидатов хорошо — то да.

Не оновив сторінку перед тим як написати. Ви можете просто фільтрувати заголовки на наявність якихось ключових фраз і, відповідно, не парсити далі і не відображати вакансію, якщо заголовок містить одну з таких фраз.

Таким чином ми значно більше втратимо, ніж виграємо. Загаловок далеко не завжди містить ключове слово. Зайвих вакансій насправді дуже мало і вони значного впливу не мають.

В чому, на вашу думку, полягатимуть втрати?

Багато корисних вакансій втрачатимуться.

Ми, напевне, невірно один одного зрозуміли. Я вам пропоную не шукати по ключових фразах, а фільтрувати, тобто, не відображати вакансії, які містять в заголовку певні ключові фрази. Наприклад, якщо в заголовку вакансії буде «Java Script», незалежно від регістру, ви її просто далі не парсите і не відображаєте.

Часто вакансія стосується фул-стек програмістів, тобто одночасно може стояти вимога знати Java i JavaScript. Це нюанс, який краще показати програмістові, щоб він приймав рішення сам.

В заголовку вакансії навряд чи так напишуть. Але, нехай буде, в заголовку будуть і Java і JavaScript одночасно. В такому випадку, можна написати regexp, з допомогою якого робити виняток саме для таких заголовків і пропускати їх далі :)

В списку пара Javascript вакансій присутні, треба поправити

Парсинг відбувається за пошуком за словом Java. Іноді слово JavaScript помилково пишуть окремо, тому вакансія також парситься. Або у переліку необхідних навиків також присутня Java.

З 1 сторінки:
Senior JavaScript Developer
REQUIREMENTS: — 4+ years of JavaScript / Front-end development experience; — Experience with HTML, CSS and JS frameworks for building complex applications; — English language skills: Intermediate (higher level is a strong advantage). COMPANY OFFERS: — High salary; — Long-term employment; — Medical
14 November IT Recruitment Solutions (ITRS.ua) ® Jobs.ua
Java ні в темі, ні в описі не написана окремо

А ніяк не можна удосконалити пошук, щоб уникати принаймні “Java Script”?

Пошук здійснює не моя програма, а сайт працевлаштування. У даному випадку jobs.ua. Моя програма лише парсить отриманий результат. Тобто невірна видача на jobs.ua. Але такі випадки насправді нечасті, тому не думаю, що варто ускладнювати код і ризикувати втратити корисні вакансії.

Не дуже популярний сайт, судячи з, наприклад
www.similarweb.com/...bs.ua?competitors=work.ua

Щодо Jobs.ua згоден, він і HeadHunter найслабші з усіх. Але мають свої 2% кожен і займають 3 і 4 місце в загальному рейтингу, тому вирішив включити їх також у парсинг top.bigmir.net/show/work

Хм, тоді може на етапі виводу результатів на сайт(це вже ж вашої програми робота?) фільтрувати, відсікати все що java script/javascript?

Чувак, мой тебе совет: 1) учи ангулар, 2) иди на фриланс. В оутсорсинге тебе делать уже нечего — ты его перерос

Дякую, але мене цікавить фул-тайм) Щод ангулару — я люблю бекенд.

В першу чергу для досвіду і систематизації знань.

У тебя уже знаний и опыта больше, чем у большинства на фуллтайме. Большая часть сидит на попе ровно и ковыряет баги. Ты умеешь доводить работу до конца, они — нет

с чего Вы взяли? Нет, я ничего не хочу сказать по поводу знаний и опыта автора, я его вообще не знаю, но если судить по этому парсеру — то уровень сложности сравним с тестовым заданием для джуниора :)

если учесть, что он не смог прикрутить проверку результата на /java\s*script/i, то да.

тобишь если я могу набросать подобное на шарпах, то я могу смело претендовать на вакансию c# junior?)

Блін :) Я написав сайт, бо сам мав у ньому потребу. Може, ще комусь знадобиться. Я ж нікому не пропоную робити висновки про мій рівень знань лише по ньому.

а у меня никаких претензий к вашему уровню знаний, я просто попутно выясняю на что могу претендовать :)

А почему бы и нет?) Разве джун должен знать больше?

ну там фреймворки, всякие wpf, wcf, wf я хз, какой-то набор технологий под конкретный стек, linq? или это уже повыше джуна идет?

Всё сугубо зависит от компании и от проекта (его технологий)
Например WF и Linq можно выучить за неделю другую :)
Лично моё мнение — считаю, что да, такого уровня для джуна достаточно

спасибо, вы меня вдохновили

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

вот так почитаю людей на доу, так я сразу миддл в js, сеньор в php, джун-мидл в c#, и за пару недель могу претендовать на джуна в жабе.

а 5к почему-то никто платить не хочет, дак еще и эйчары упорно игнорируют мои резюме :D

скорее даже хуже, чем вы себе представляете)

Та я вовсе не хочу сказать, что человек сделал ерунду или сделал плохо (я не смотрел код). Я просто ответил, что только по этому мини-проекту нельзя судить о высоком уровне ТС как специалиста. Может ТС вообще высококлассный специалист, я хз. Кроме того, автор сам написал, что сделал этот проект, т.к. у него была в нём необходимость и никому не предлагал делать какие-либо выводы о его проф. уровне по этому сайту и я с ним полностью согласен. Почему ему на основе этого начали петь хвалебные оды — я не знаю

Как будто работать в фулл — тайм это что — то плохое.
Фриланс это:
— проблемы с рабочим местом и самоорганизацией;
— забыть что такое «интересные задачи»;
— бедные и неадекватные клиенты, желающие получить максимум за свои жалкие копейки;
— отсутствие эффективных комункаций;
— спецификации из пяти строчек текста, содержащие 5% необходимой тебе информации;
— неспособность клиента поставить задачу, представить и описать конечный результат.
— кроме программирования заниматься асолютно всем, и получать за это мало и нерегулярно;

Ну вот снова...

проблемы с рабочим местом
Какие?
самоорганизацией
Это уже личное качество, а не проблема фриланса.
забыть что такое «интересные задачи»
Нет.
отсутствие эффективных комункаций
Тут как повезет и кому чего хватает. Но да, иногда даже скайп-кола бывает мало.
бедные и неадекватные клиенты, желающие получить максимум за свои жалкие копейки
спецификации из пяти строчек текста, содержащие 5% необходимой тебе информации
неспособность клиента поставить задачу, представить и описать конечный результат
Не всегда.
кроме программирования заниматься асолютно всем, и получать за это мало и нерегулярно
Никто не мешает получать за это много.

Проблемы с рабочим местом это:
— работать по ночам и отсыпаться днем, потому что так удобнее твоему американскому клиенту и никто не отвлекает;
— совершенно не высыпаться, потому что пришло лето и спать днем невозможно из — за яркого света;
— убедиться, что красивые, удобные и недорогие «коворкинги» существуют только на страницах Фейсбука. Ближайшие к тебе (по меркам твоего «миллионника» конечно) «коворкинги» либо уже закрылись, либо куда — то переехали;
— поработать какое — то время в кафе в вай — фаем, отвлекаясь из — за игроков в мафию и пердящих ртом курителей кальяна;
— совершенно возненавидеть баритса за его дежурную фразу «приятного отдыха»;
— взять с субаренду у знакомых комнатушку в админздании бывшего АТП, потому что хорошие офисы от 50 квадратных метров, тебе такие большие не нужны и дорого;
— вспомнить что такое «эффективный теплообмен», когда сваренный из толстых труб раскаленный кустарный радиатор зимой прогревает офис только до +13;
— заплатить за электричество, накрученное тепловентилятором по промышленным тарифам;
— редко появляться в офисе, потому что при всех недостатках работать из дома всё равно оказалось удобнее;
— нажить задолженность по арендной плате и тайно схехать с офиса;
— поссориться со знакомыми;
— наконец — то погасить задолженность за офис;
— помириться со знакомыми, но не со всеми, потому что они тоже уже перессорились;

работать по ночам и отсыпаться днем, потому что так удобнее твоему американскому клиенту и никто не отвлекает;
Во-первых, не обязательно. Во-вторых, лично для меня, это плюс.
совершенно не высыпаться, потому что пришло лето и спать днем невозможно из — за яркого света;
Неверно. Нормальные шторы и днем так же темно, как и ночью.

Все остальное — просто бред.

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

Сюда ещё нужно добавить:
— часы гугления вместо минутной беседы с опытным коллегой;

Ваш успешный опыт не означает, что фриланс это идеальный вариант для начинающего.
Конечно, фриланс лучше чем вообще ничего.
Но если человек настолько способный, чтобы с нуля успешно заниматься фрилансом, то в хорошем коллективе он добъется большего за меньшее время. И больше заработает с меньшими моральными издержками.

А я и не говорил что фриланс это для начигающих, как рах наоборот. Фриланс хорошо, это когда вы сам, тот более опытный коллега.

Мой комент был о том, что организация раб места не такая уж и проблема

Как определил, что аутсорс перерос?

github.com/...n/parser/Parser.java#L123
Вместо instanceof лучше парсеры разделить на отдельные классы — по каждому на сайт.

github.com/...n/parser/Parser.java#L183
Стремная логика, эксепшин может выпаcть когда угодно.

github.com/...an/parser/Parser.java#L93
WTF

Щодо instanceof —у парсері значно більше спільної логіки ніж окремої. Розділення на окремі класи призведе або до дублювання коду, або до винесення спільних елементів і множення класів. Хоча над цим ще подумаю.
Ексепшн тут випадає, якщо використовується не той формат дати. Це описано в джавадоку.
Щодо «Горячая» — це додається на rabota.ua зазвичай в перших чотирьох вакансіях і прилипає до заголовку при парсингу. Доводиться викидати.

и тут же пытаемся распарсить её по-другому.
этот эксепшин — капля в море. я бы не советовал такой код отправлять потенциальному работадателю.

Вкажіть, які ще косяки ви бачите.

На фултайме делают вещи куда сложнее парсера

А если где-то поменяют разметку?

Тоді треба буде відобразити це в коді. Це ж парсинг, від цього нікуди не дінешся.

Ну это само-собой :( собираетесь его постоянно поддерживать на плаву? Или это просто как пет-проект для собеседования?

Тут насправді нескладна підтримка, тому буду. Плюс я користуюся ним регулярно за призначенням.

private String getDescription(JobSite jobSite, Element job) {
    String[] descriptionData = jobSite.getDescriptionData();
    return job.getElementsByAttributeValue(descriptionData[0], descriptionData[1]).text();
}

для облегчения поддержки вот такое лучше лучше задавать в духе query селекторов, которые лучше вынести в какой-то xml-конфиг, яхз, чтоб не перекомпилировать приложение каждый раз.

у вас же jsoup это прекрасно умеет. ну зачем хардкодить то?
jsoup.org/...ting-data/selector-syntax

например

<root>
    <source>
        <job_site>dou.ua</job_site>
        <vacancies_uri>https://jobs.dou.ua/vacancies/?category=Java</vacancies_uri>
        <title>
            <selector>.title_wrapper h1 a</selector>
            <fallback>.title_wrapper h1</fallback>
        </title>
        <content>
            <selector>.page_inner #vacancy</selector>
        </content>
    </source>
</root>
(селекторы придуманы случайным образом)

Дякую, я вивчу це. Хоча не впевнений, що воно працюватиме для всіх сайтів коректно, там досить сильний різнобій. Наприклад, на dou.ua, jobs.uahh.ua заголовок не обгорнутий в тег <h> взагалі, на work.ua він обгорнутий в <h2>, на rabota.ua — в <h3>.

Плюс є багато інших нестиковок, наприклад, на rabota.ua повний різнобій з представленням дат.

Зараз у мене всі дані тегів виведені в окремі файли з врахуванням особливостей кожного сайту, відслідковувати і підтримувати їх легко.

puu.sh/siaPo/4af266df96.txt
вот вам с рабочими селекторами даже

фишка в том, что вы выносите

    private static final String SITE_NAME = "Rabota.ua";
    private static final String SITE_URL = "http://rabota.ua/zapros/java/%D0%BA%D0%B8%D0%B5%D0%B2";
    private static final String URL_PREFIX = "http://rabota.ua";
    private static final String[] JOB_BOX = {"class", "v f h", "v h", "v"};
    private static final String[] TITLE_BOX = {"class", "t"};
    private static final String[] COMPANY_DATA = {"class", "rua-p-c-default"};
    private static final String[] DESCRIPTION_DATA = {"class", "d"};
    private static final String[] DATE_DATA = {"", ""};
    private static final String SPLIT = "";
вот это из кода в файл конфигурации. можно даже не заморачиваться с jquery-like селекторами, а оставить те, которые у вас есть.
просто при запуске программы вот эти вот «имя», «uri», " контейнер для вакансии и т.д. вы подгружаете с xml (uml, ini или чего еще угодно).

в результате если на сайте меняется дизайн или что-то еще, то вы просто поправляете в xml строку и перезапускаете программу (можно даже просто сделать кнопку или читать STDIN (ждать комманду «reload conf», например, если у вас консольное (в другом потоке/асинхронно)) и перезагружать конфигурацию из файла). и программа работает с новыми селекторами. не нужно ничего перекомпилировать.

хз как в Java, но в c# точно есть готовые решения для чтения xml.
msdn.microsoft.com/...y/fx29c3yd(v=vs.110).aspx

а если это есть в c#, то скорее всего должно быть и в java.

Название как-то не очень... Сразу подумал про что-то типа github.com/vjeux/jParser

Я про цей проект вже пізніше дізнався. Тим не менше, назва відповідає суті сайту.

jobParser было бы ультимативней, но не мне решать)
upd: скинул вам вакансию в пм

Спасибі, отимав. Але я в першу чергу шукаю роботу бекендера, з фронтендом лиш знайомлюся поки.

якщо ти просто так відкидаєш вакансію через наявність там фронт-енду — то дарма і в такому разі бажаю успіху в пошуку роботи, буде жарко

Якщо велика компанія написала, що шукає фулстек-програміста, це означає, що фронтенд тут треба знати на хорошому рівні. Крім того, рівень досвіду там вказаний 3-6 років, з них рік JavaScript на реакті. Поки що це не про мене)

ви не уявляєте навіть, як тяжко знайти 100% метч між описом вакансії і кандидатом
завжди є опції, інакше б усіх на роботу брали без співбесіди, тільки по тому що в сіві написано

Подписаться на комментарии