jParser — сайт для пошуку роботи Java-програміста в Києві, написаний Java-програмістом
Я певний час шукаю роботу Java-програміста в Києві. Для цього я раніше багато разів на день заходив на декілька сайтів, щоб перевірити, чи не з’явилися нові вакансії. Це забирало досить багато часу, тому я вирішив написати програму, яка парситиме вакансії і представлятиме їх в зручному вигляді.
Так з’явився jParser — http://www.jparser.info
Парсинг відбувається на основних сайтах працевлаштування — rabota.ua, work.ua, hh.ua, jobs.ua, а також на dou.ua (сподіваюся, адміністрація останнього не матиме до мене через це претензій, для перегляду повної вакансії відвідувач все рівно переходить на оригінальний сайт).
Всі знайдені вакансії автоматично публікуються в твіттер twitter.com/jParser_info
Якщо ви також шукаєте роботу Java-програміста в Києві, можливо, мій сайт буде вам цікавий.
Код на Github: github.com/olegshan/JobParser
До речі, я досі в пошуках роботи. Якщо ви представник компанії, яка шукає програміста, буду радий поспілкуватися :)
86 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарівЗробив fork і скинув pull request з деякимим правками і рекомендаціями. Сподіваюся допоможе
Тарас, дякую! Саме читаю їх. Частину, такі як constructor DI і додання інтерфейсів я теж планував додати, та все не було часу. Розбираюся з рештою.
Ох, тобі варто було б хоча б запустити в себе. Дуже багато чого посипалося. Основна причина — ти передав у всі методи один doc, хоча на деяких сайтах багато даних (дата, компанія) витягуються з внутрішньої сторінки і потребують створення свого доку з url, який зараз взагалі не передається в методи.
Відкотив поки. Там було багато хороших ідей і змін, я їх обов’язково втілю, але парсинг у такому вигляді не працює. Причина — за деякими даними (дата, компанія) на деяких сайтах треба заходити всередину вакансії, зі сторінки пошуку ця інформація недоступна. Для цього методи getDate i getCompany мають отримати лінк на вакансію і за ним згенерувати новий док методом getDoc, який знову ж таки має бути доступним.
Якщо маєш бажання продовжити, буду радий.
Довелося відкотити, пояснив нижче.
Замерджив, підправив баги, все працює. Дякую ще раз за допомогу!
Непогано! Думаю скоро знайдеш роботу)
А ось сайт де давно реалізована така ідея ua.jooble.org
Дякую. Джублом користувався, досі отримую від них розсилку, але там далеко не всі вакансії релевантні і не всі присутні.
This rserApplicationTests.java
github.com/...
Тести я ще не комітив. Маю декілька робочих, які використовував для роботи з базою, але остаточних ще немає. Планую написати хороші тести незабаром. І таки вивчити TDD)
Досить непогано, але є один недолік :) У вас попадаються JavaScript вакансії, постарайтеся їх позбутися :) Також, було б дуже класно, якщо б ви, в майбутньому, добавили можливість вибору міста і фільтр по роках досвіду роботи, якщо захочете розширювати проект.
Про JavaScript я вже писав нижче. Щодо розширення переліку міст — можливо у майбутньому зроблю, думав про це.
Точно не знаю существуют ли у нас уже подобные ресурсы, которые собирают данные с топовых сайтов по трудоустройству — но я не встречал.
Возможно имеет смысл увеличить функционал сайта?
Добавить основные фильтры, к примеру по технологиям (не только java ведь нужна :)), опыт работы, город и т.д.
Посмотреть в сторону, такого себе, стартапа? :)
Авось что-то выгорит и можно будет поднять деньжат
Є ua.jooble.org
о, круто, спасибо
а чем не устроил этот сайт для поиска Java вакансий?
Там далеко не всі вакансії.
rabota.yandex.ua
Сомневаюсь, что на этом можно деньжат поднять.
Вот если бы парсило резюмехи/профили кандидатов хорошо — то да.
Не оновив сторінку перед тим як написати. Ви можете просто фільтрувати заголовки на наявність якихось ключових фраз і, відповідно, не парсити далі і не відображати вакансію, якщо заголовок містить одну з таких фраз.
Таким чином ми значно більше втратимо, ніж виграємо. Загаловок далеко не завжди містить ключове слово. Зайвих вакансій насправді дуже мало і вони значного впливу не мають.
В чому, на вашу думку, полягатимуть втрати?
Багато корисних вакансій втрачатимуться.
Ми, напевне, невірно один одного зрозуміли. Я вам пропоную не шукати по ключових фразах, а фільтрувати, тобто, не відображати вакансії, які містять в заголовку певні ключові фрази. Наприклад, якщо в заголовку вакансії буде «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. Але такі випадки насправді нечасті, тому не думаю, що варто ускладнювати код і ризикувати втратити корисні вакансії.
Не дуже популярний сайт, судячи з, наприклад bs.ua?competitors=work.ua
www.similarweb.com/...
Щодо 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% необходимой тебе информации;
— неспособность клиента поставить задачу, представить и описать конечный результат.
— кроме программирования заниматься асолютно всем, и получать за это мало и нерегулярно;
Ну вот снова...
Какие? Это уже личное качество, а не проблема фриланса. Нет. Тут как повезет и кому чего хватает. Но да, иногда даже скайп-кола бывает мало. Не всегда. Никто не мешает получать за это много.Проблемы с рабочим местом это:
— работать по ночам и отсыпаться днем, потому что так удобнее твоему американскому клиенту и никто не отвлекает;
— совершенно не высыпаться, потому что пришло лето и спать днем невозможно из — за яркого света;
— убедиться, что красивые, удобные и недорогие «коворкинги» существуют только на страницах Фейсбука. Ближайшие к тебе (по меркам твоего «миллионника» конечно) «коворкинги» либо уже закрылись, либо куда — то переехали;
— поработать какое — то время в кафе в вай — фаем, отвлекаясь из — за игроков в мафию и пердящих ртом курителей кальяна;
— совершенно возненавидеть баритса за его дежурную фразу «приятного отдыха»;
— взять с субаренду у знакомых комнатушку в админздании бывшего АТП, потому что хорошие офисы от 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 это прекрасно умеет. ну зачем хардкодить то? ting-data/selector-syntax
jsoup.org/...
например
<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.ua i hh.ua заголовок не обгорнутий в тег взагалі, на work.ua він обгорнутий в
, на rabota.ua — в
.
Плюс є багато інших нестиковок, наприклад, на 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. y/fx29c3yd(v=vs.110).aspx
msdn.microsoft.com/...
а если это есть в c#, то скорее всего должно быть и в java.
Дякую, буду розбиратися
Название как-то не очень... Сразу подумал про что-то типа github.com/vjeux/jParser
Я про цей проект вже пізніше дізнався. Тим не менше, назва відповідає суті сайту.
jobParser было бы ультимативней, но не мне решать)
upd: скинул вам вакансию в пм
Спасибі, отимав. Але я в першу чергу шукаю роботу бекендера, з фронтендом лиш знайомлюся поки.
якщо ти просто так відкидаєш вакансію через наявність там фронт-енду — то дарма і в такому разі бажаю успіху в пошуку роботи, буде жарко
Якщо велика компанія написала, що шукає фулстек-програміста, це означає, що фронтенд тут треба знати на хорошому рівні. Крім того, рівень досвіду там вказаний3-6 років, з них рік JavaScript на реакті. Поки що це не про мене)
jasno
ви не уявляєте навіть, як тяжко знайти 100% метч між описом вакансії і кандидатом
завжди є опції, інакше б усіх на роботу брали без співбесіди, тільки по тому що в сіві написано
Написав вам у приват