CoderCastrov logo
CoderCastrov
Программирование

Как создать инструмент для парсинга Linkedin за 7 минут

Как создать инструмент для парсинга Linkedin за 7 минут
просмотров
7 мин чтение
#Программирование
Table Of Content

Используя Python и Selenium.

Self-made image.

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

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

Таким образом, у меня возникла идея: Почему бы мне не попробовать парсить списки вакансий на Linkedin, чтобы получить всю ключевую информацию напрямую в базе данных?

⚠️ Отказ от ответственности: многие веб-сайты запрещают или ограничивают парсинг данных с их страниц. Обязательно прочитайте их условия и ограничения перед парсингом их веб-сайта.

Давайте вместе научимся создавать такой инструмент! 👇🏻


#1. Настройка нашей среды.

Для разработки такого проекта требуется одна основная библиотека:

  • Selenium** **используется для автоматизации веб-приложений. Она позволяет открывать браузер и выполнять задачи, как это делал бы человек, например, нажимать кнопки и искать определенную информацию на веб-сайтах.

Кроме того, нам нужен драйвер для взаимодействия с нашим браузером. Чтобы настроить нашу среду, нам сначала нужно:

⚠️ _Поскольку я являюсь обычным пользователем Google Chrome, я буду использовать его в качестве моего браузера по умолчанию. ️_Но вы можете использовать любой другой браузер.

_Чтобы понять основы Selenium и HTML, рекомендую следующую статью! _:D

Понимание искусства парсинга веб-страниц с помощью Selenium и BeautifulSoup

Основы структуры HTML для извлечения данных с использованием Python

medium.com

#2. Загрузка библиотек

После установки всех необходимых библиотек в нашей среде мы начинаем наш код с загрузки всех них. Кроме Selenium, нам понадобятся Pandas и Time, среди других.

#3. Понимание URL-адресов Linkedin и определение интересующей нас должности и местоположения.

В моем случае я хочу начать искать работу в качестве аналитика данных в США. Если я перейду прямо на Linkedin, это так же просто, как написать оба ключевых слова в каждом поле ввода.

Самостоятельно созданное изображение. Показаны поля ввода ключевых слов для работы и местоположения на Linkedin.

Если мы ищем такую работу и местоположение, мы можем заметить, что оба ключевых слова отражены в соответствующем URL-адресе.

У нас будет keywords=Data%20Analyst&location=United%20States.

Поэтому, мы можем просто изменить URL-адрес напрямую, чтобы выбрать любую работу и местоположение, которые мы хотим - что делает нашу жизнь намного проще! ;)

Единственное, о чем нам нужно быть осторожными, это когда мы используем более одного слова, URL-адрес будет разделять каждое из слов с помощью “%20”. Таким образом, мы легко можем сгенерировать желаемый URL-адрес с помощью следующего кода:


#4. Загрузка драйвера и создание экземпляра

Основная идея здесь - управлять веб-браузером с помощью нашего кода на Python. Для этого нам нужно создать мост между Python и нашим браузером. Вот почему мы создаем экземпляр нашего веб-драйвера, используя файл, который мы загрузили на шаге 1 - Запомните путь!

После создания экземпляра достаточно просто открыть URL списка вакансий с помощью команды driver.get(). Предыдущий код откроет окно Chrome с нашей веб-страницей Linkedin.

Self-made gif. Shows how using Python we can open up a Linkedin window in our broswer.

#5. Обнаружение количества доступных вакансий.

Если вы не знакомы с парсингом веб-страниц, вы можете щелкнуть правой кнопкой мыши и выбрать Инспектировать, или нажать F12. Должно появиться следующее всплывающее окно:

Self-made image. Screenshot of Linkedin inspecting elements pop-up.

Результаты поиска на Linkedin обычно содержат 25 результатов на странице, отображаемых слева. Каждая вакансия содержит метаданные, отображаемые на карточке вакансии.

Хотя на карточке вакансии содержится большая часть данных, которые нас интересуют - название вакансии, компания и местоположение - она содержит только сокращенную версию описания вакансии.

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

#6. Просмотр всех вакансий

Далее нам нужно узнать, сколько вакансий мы нашли в результате этого поиска. Для этого мы используем библиотеку selenium, чтобы получить число, которое появляется в верхнем левом углу.

Скриншот, показывающий количество доступных вакансий для нашего конкретного поиска.

Затем нам нужно понять, как Linkedin отображает список вакансий. Работа с объявлениями о вакансиях на LinkedIn осуществляется путем загрузки дополнительных вакансий при прокрутке полосы браузера. Однако, когда вы несколько раз прокручиваете полосу, она не будет загружаться автоматически, и вам придется нажать кнопку "Показать больше вакансий".

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

Чтобы учесть оба сценария, мы добавляем процедуру "try - except".

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

Анимированное изображение, демонстрирующее, как веб-сайт Linkedin прокручивается вниз, отображая больше вакансий.

#7. Обнаружение всех элементов.

Если мы снова проинспектируем веб-сайт, мы легко можем заметить, что каждая карточка работы находится внутри элемента <li>.

Самостоятельно созданное изображение. Вы можете наблюдать все элементы `<li>` для каждой карточки работы, отображенной на странице.

Внутри каждой карточки работы мы можем найти элемент <div> с class=base-search__card-info, который содержит всю сокращенную информацию, которую мы хотим сохранить:

  • Название работы хранится в заголовке <h3> с классом 'base-search-card__title'.
  • Название компании находится в контейнере тега <h4> с классом 'base-search-card__subtitle'.
  • Местоположение компании находится в разделе <span> с классом 'job-search-card__location'.
  • Дата публикации находится в разделе <time> с классом 'job-search-card__listdate'.
Самостоятельно созданное изображение. Вы можете наблюдать все подэлементы, содержащиеся для каждой карточки работы.

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

Для сохранения всех этих данных мы сначала получаем список всех полученных работ на предыдущем шаге. Затем мы перебираем все работы и извлекаем из каждого элемента нужную информацию.

Например, чтобы получить заголовок, нам просто нужно найти элемент h3 с помощью команды driver.find_element(By.CSS_SELECTOR,"element") и получить данные с помощью команды .get_attribute("Inner Text").

Эта же процедура повторяется для каждой целевой информации.


#8. Получение более подробной информации для каждой вакансии

Как я уже упоминал ранее, каждая карточка вакансии содержит только сокращенную информацию. Однако мы хотим получить максимум информации. Поэтому мы будем прокручивать все вакансии, нажимая на них и получая всю информацию из их полного описания.

Self-made picture. Shows the full description of a given job.

Для этого мы снова находим элемент <li> для каждой карточки вакансии и нажимаем на него. После этого мы снова анализируем html-структуру, чтобы получить нужную информацию.

  • Ссылка на вакансию содержится непосредственно в элементе <li> каждой карточки вакансии.
  • Описание вакансии содержится внутри <div> с классом "show-more-less-html".
  • Уровень вакансии содержится в первом элементе <li> под <ul>.
  • Тип вакансии содержится во втором элементе <li> под <ul>.
  • Функция вакансии содержится в третьем элементе <li> под <ul>.
  • Отрасль вакансии содержится в четвертом элементе <li> под <ul>.
Self-made image. Linkedin screenshot that shows the structure of the full description of each job.

Мы повторяем ту же процедуру, что и раньше, перебирая все доступные вакансии и получая данные с помощью driver.find_element(By.CSS_SELECTOR,"element") и .get_attribute("Inner Text").

Теперь наш браузер будет прокручивать все доступные вакансии, нажимая на них.

Self-made gif. Browser scrolling down and clicking every job to get the full description.

#9. Создание нашего pandas dataframe и сохранение его.

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

После этого мы должны получить dataframe, который выглядит следующим образом:

Последним шагом будет сохранение нашего dataframe в виде CSV файла.

Теперь у нас есть все спарсенные данные, сохраненные на нашем компьютере! :)

Вы можете найти мой код здесь. Надеюсь, вам понравится этот материал и вы сможете понять, как парсить информацию с LinkedIn.

Не стесняйтесь задавать мне любые дополнительные вопросы! :D

Данные всегда имеют лучшую идею - доверяйте им.


Вы можете подписаться на мою Medium Newsletter, чтобы быть в курсе и получать мои материалы. Обещаю, они будут уникальными!

Если вы еще не полноценный пользователь Medium, **просто проверьте это здесь, чтобы поддержать меня и многих других авторов. **_Это действительно помогает _:D


Некоторые другие интересные статьи на Medium, которые вам стоит прочитать! :D


Как создать парсер для Indeed за 9 минут

Использование Python и Selenium для сбора данных о вакансиях на Indeed

medium.com

Парсинг веб-страниц в 2023 году — Разбираем на простые элементы

И как собрать данные онлайн в 5 простых шагах

blog.devgenius.io

Создание самого большого набора данных о климате и температуре

Использование данных Berkeley Earth, python и beautifulsoup

medium.com