Вы когда-нибудь разочаровывались, узнав, что вас отказали в приеме на работу, потому что вы подали заявление слишком поздно? Они уже наняли кого-то другого!

Сколько раз вы упускали возможности трудоустройства, потому что не знали, что компания нанимает на эту должность? Возможно, это идеальная работа для вас, но вы просто не знали об этом!

Это приложение будет держать вас в курсе объявлений о вакансиях, чтобы вы никогда не упускали подходящую вакансию!

Я научу вас, как создать скрипт, который будет автоматически получать данные о вакансиях с веб-сайта компании. В частности, скрипт автоматически перейдет на сайт «Совхоз» и выполнит поиск конкретных вакансий. Затем он очистит или извлечет данные с веб-страницы и сохранит их в текстовый файл. После этого вы получите электронное письмо со всеми новыми вакансиями, появившимися на StateFarm.com. Вы никогда больше не упустите эту вакансию!

Это будет написано на Node.js и будет использовать следующие внешние API: Puppeteer, File System и Nodemailer.

Чтобы просмотреть код на GitHub, посетите: здесь

Настраивать:

Создайте в своем каталоге папку, в которой будут храниться все файлы проекта.

$ mkdir automated-job-web-scraping
$ cd automated-job-web-scraping

Автоматически создайте файл package.json, который необходим для обработки зависимостей и метаданных.

$ npm init

Чтобы установить Puppeteer и файловую систему:

$ npm i --save puppeteer
$ npm install file-system --save

Создайте основной файл, содержащий код. Большая часть кода парсинга в следующем разделе будет в этом файле. Я сохранил его как scrape-state-farm.js в подпапке каталога проекта, который мы создали ранее automated-job-web-scraping/src. Src - это созданная мной папка, в которую входят основные файлы.

Автоматизация:

Импортируйте внешние зависимости. О том, что такое constants, поговорим позже.

Код написан с учетом асинхронного ввода-вывода. Node.js 8 использует ключевые слова async и await, которые вы будете видеть на протяжении всего скрипта. async означает, что функция возвращает обработанное обещание. await означает дождаться, пока обещание установится, и вернуть результат.

В основном так устроена структура. run () - это асинхронная функция. Когда он закончится, значение будет передано в .then ((value) = ›{}. Затем вы можете сделать некоторые другие вещи, которые будут обсуждаться позже.

async function run() {
   //await
}
run().then((value) => {
   //other things
});

Теперь идет часть веб-автоматизации с использованием Chrome Headless. Это автоматически запустит безголовый браузер. Установите значение false для тестирования и true, когда ваш сценарий будет завершен.

Прежде чем переходить к большему количеству кода, давайте подумаем о том, какой поток должен произойти.

  1. Откройте новую вкладку браузера
  2. Перейти на сайт вакансий в совхозе
  3. Щелкните раскрывающееся меню "Местоположение".
  4. Выберите местоположение "Техас"
  5. Выберите поле поиска
  6. Тип "технология"
  7. Нажмите кнопку «Поиск», чтобы загрузить результаты.
  8. Подождите, пока страница загрузится

Теперь немного кода и пояснений:

  1. browser.newPage() откроет новую вкладку в браузере
  2. page.goto() перейдет на веб-сайт, который мы пытаемся очистить. В этом случае мы идем на сайт вакансий Совхоза искать объявления о вакансиях.
  3. .click() функция щелчка по разделу веб-страницы.
  4. .keyboard.type() для автоматического ввода чего-либо. Мы хотим видеть только «Техасские» вакансии.
  5. .click() функция щелчка по разделу веб-страницы.
  6. .keyboard.type() для автоматического ввода чего-либо. Мы хотим видеть только «технологические» рабочие места.
  7. .click() функция щелчка по разделу веб-страницы.
  8. .waitFor() ждать, пока страница загрузит результаты.

Вам может быть интересно, какие параметры входят в эти функции. Большинство из них - селекторы. Их можно найти с помощью элемента inspect в инструментах разработчика вашего браузера (F12).

Чтобы сделать его более гибким и читаемым, вы можете сохранить эти селекторы как константы в отдельном файле. constant.js - это файл в том же каталоге проекта, который содержит все мои константы. Это используется, потому что я могу легко их изменить, а код легче читать.

Константы находятся в новом файле ./util/constants.js. Не забудьте импортировать их в scrape-state-farm.js.

Чтобы получить доступ к константам, переписав код:

Соскабливание

Нам нужно будет получить результаты работы с нескольких страниц (если есть много вакансий). Для этого узнайте, сколько там страниц вакансий. Вызовите эту функцию, чтобы получить количество страниц.

В этой асинхронной функции нам нужно передать page. Затем определите селектор страниц PAGE_CONTAINTER_SELECTOR, который содержит все номера страниц.

После того, как у нас есть этот селектор, нам нужно передать его в качестве аргумента. Обратите внимание, что pageCount мы впервые увидели awaitkeyword. PAGE_CONTAINTER_SELECTOR будет передан как sel в document.querySelector(sel). Но это был всего лишь элемент контейнера, поэтому для выбора каждой отдельной кнопки страницы используйте pageContainer.getElementsByClassName();. Затем пролистайте каждую страницу и получите количество страниц. Если кнопки страницы нет, верните «1», потому что есть только 1 страница. Данные будут храниться в pageCount, затем мы вернем pageCount.

После вызова getNumPages и возврата количества страниц мы можем теперь просматривать страницы в цикле. Затем на каждой странице пролистайте список объявлений о вакансиях на сайте. Посмотрите, как выглядит сайт Совхоза. Он имеет 1 ИЛИ несколько страниц. Затем список объявлений о вакансиях.

Теперь посмотрите на код, чтобы выполнить фактическое сканирование веб-страниц. Опять же, внешний цикл проходит по страницам, а внутренний цикл просматривает список объявлений о вакансиях.

jobListLength возвращает количество заданий на 1 странице. Для этого найдите селектор контейнеров для всех заданий, получите каждый элемент списка и посчитайте их.

Теперь, когда мы знаем, сколько заданий находится на одной странице, мы можем просмотреть их в цикле. И поместите результаты в массив.

Мы скопировали данные для 1 страницы, но что, если страниц несколько? На самом деле нам нужно нажать кнопку следующей страницы и очистить следующую страницу. Мы используем знакомую .click() функцию, чтобы щелкнуть по переключателю следующей страницы. Подождем немного, пока загрузится следующая страница.

После того, как мы получили данные со всех страниц, нам нужно закрыть безголовый браузер. И вернуть все результаты в массив.

После того, как наши задания будут сохранены в массиве, мы сделаем некоторое форматирование и запишем его в консоль. До сих пор мы не использовали файловую систему, но вот она. .writeFile() возьмет наши данные и распечатает их в текстовый файл. Подумайте о .then(), чтобы сделать это после завершения асинхронной функции.

Эл. адрес:

Пока что наши результаты сохранены в текстовый файл, что довольно круто. Но теперь мы хотим получить уведомление, когда скрипт завершится. Мы добавим код, чтобы отправить нам автоматическое электронное письмо с прикрепленным state-farm-jobs.txt файлом. Создайте новый файл с именем send-email.js и поместите его в папку src.

Выполните команды для установки пакетов узлов:

$ npm install nodemailer
$ npm i nodemailer-smtp-transport

Скопируйте этот код и укажите данные и путь к файлу state-farm-jobs.txt:

Что означают credentials.email и credentials.password? При желании вы можете ввести строку со своим адресом электронной почты и паролем, но для защиты я сохранил их в отдельном файле с именем credentials.js в папке util.

В credentials.js заполните эти значения.

В вашем .gitignore файле добавьте имя файла, который git должен игнорировать / скрывать. Таким образом, вы должны добавить credentials.js в этот файл.

Теперь, вернувшись к send-email.js, вы должны импортировать файл учетных данных вверху следующим образом:

const credentials = require('./credentials.js');

И когда вы хотите получить доступ к этим данным, введите (name_of_file). (Key):

credentials.email
credentials.password

Модули

У нас есть 2 основных файла Node.js (в src), которые содержат наш код scrape-state-farm.js & send-email.js. Чтобы запустить их вместе, нам нужно упаковать каждый из них в отдельные модули и вызвать их в другом файле. В каждом из файлов оберните код в функции и экспортируйте их.

Создайте index.js и импортируйте эти экспортированные функции.

В scrape-state-farm.js, после .then() я вызову модуль электронной почты, чтобы мои результаты были сохранены в текстовом файле, ЗАТЕМ вызывается модуль электронной почты.

Выход:

  1. Как выглядят результаты работы на сайте Совхоза.

2. Как выглядят результаты работы в текстовых файлах state-farm-jobs.txt и console.

3. Проверьте свою электронную почту. Вы должны были получить сообщение с вложением, содержащим все извлеченные задания.

Чтобы просмотреть код в GitHub, посетите: здесь

Спасибо:

Надеюсь, вам понравилось это руководство. Пожалуйста, поставьте лайк и подпишитесь, если вы узнали что-то новое!

Это руководство от @emadehsan было очень полезным и помогло мне, когда я застрял. Посмотреть его исходный код можно здесь.