темный логотип proxyscrape

Web Scraping For Job Postings – An Ultimate 2024 Guide

Python, Скрапинг, Январь-04-20235 минут чтения
Веб-скраппинг для поиска вакансий - это альтернативный способ создания базы данных актуальных вакансий для соискателей. Randstad утверждает, что средний поиск работы может длиться от пяти до шести месяцев, с момента подачи заявки до заполнения вакансии. А что, если у вас есть решение, которое может уменьшить вашу нагрузку по просмотру всех порталов вакансий и выбору подходящего для вас? 

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

Что такое веб-скраппинг для размещения вакансий?

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

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

[Отказ от ответственности! Многие веб-сайты могут ограничивать удаление данных со своих страниц. Пользователи могут столкнуться с юридическими проблемами в зависимости от того, где и как они пытаются извлечь информацию. Поэтому нужно быть предельно осторожным при посещении сайтов, на которых хранятся их данные. Например, Facebook, Linked In и Craiglist иногда возражают, если данные соскабливаются с их страниц. Так что если вы хотите скрести, скребите на свой страх и риск].

Это будет очень базовая статья, в которой мы рассмотрим основы веб-скреппинга, извлекая полезную информацию о вакансиях, связанных с "Data Science", с сайта indeed.com. Мы напишем удивительную программу, которая будет обновлять вакансии несколько раз вручную. Некоторые полезные библиотеки, которые будут очень кстати при создании этого скрепера, - это "requests" и "BeautifulSoup".

Понимание URL и структуры страницы

Для начала давайте посмотрим на пример страницы, которую мы собираемся извлечь из действительно

То, как структурирован URL, имеет большое значение:

  • Обратите внимание, что с "q=" начинается строка для поля "что" на странице, разделяя поисковые термины знаком "+" (например, при поиске вакансий "данные+научный сотрудник").
  • При указании зарплаты он будет разбирать запятые в цифре зарплаты, поэтому начало зарплаты будет предваряться %24, затем цифра до первой запятой, затем она будет разбита на %2C и продолжена оставшейся частью цифры (например, %2420%2C000 = $20 000).
  • Примечание: "&l=" начинает строку для интересующего вас города, разделяя поисковые термины с помощью "+", если город состоит из нескольких слов (например, "New+York").
  • Отметьте "&start=" результат поиска, с которого вы хотите начать (например, начните с 10-го результата).

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

В Chrome можно изучить HTML-структуру страницы, щелкнув на ней правой кнопкой мыши и воспользовавшись опцией inspect element. Справа появится меню, в котором также будут показаны теги вложенных элементов, а при наведении курсора на эти элементы будет подсвечиваться эта часть экрана.  

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

Начало работы со скребком

Теперь мы проанализировали структуру страницы. Это поможет нам построить код в соответствии с этой информацией для извлечения нужных нам данных. Начнем с импорта наших библиотек. Обратите внимание, что здесь мы также импортируем "время", что поможет не перегружать сервер сайта при сборе информации.

импорт запросов
импорт bs4
из bs4 import BeautifulSoup
import pandas as pd
импортировать время

Сначала мы нацелимся на отдельную страницу, чтобы вывести все нужные нам данные,

URL = "https://www.indeed.com/jobs?q=data+scientist+%2420%2C000&l=New+York&start=10"
#проведение запроса по указанному выше URL:
page = requests.get(URL)
#определяем желаемый формат "страницы" с помощью парсера html - это позволяет python читать различные компоненты страницы, а не рассматривать ее как одну длинную строку.
soup = BeautifulSoup(page.text, "html.parser")
#печатаем суп в более структурированном древовидном формате, который облегчает чтение
print(soup.prettify())

Использование prettify облегчает обзор HTML-кода страницы и позволяет получить результат, подобный этому,

 Теперь вся информация об интересующей нас странице находится в нашей переменной "soup". Придется еще покопаться в коде, чтобы перебрать различные теги и подтеги для получения нужной информации.

Получение основных элементов данных

Пять ключевых моментов для каждого объявления о работе,

  1. Название вакансии.
  2. Название компании.
  3. Расположение.
  4. Зарплата.
  5. Резюме.

Если мы посмотрим на страницу, то там будет 15 объявлений о работе. Поэтому наш код также должен генерировать 15 различных элементов. Однако если код выдает меньше, чем нужно, мы можем вернуться к странице и посмотреть, что именно не было получено.

Получение названия должности

As can be seen, the entirety of each job posting is under <div> tags, with an attribute “class” = “row result.”

Further, we could also see that job titles are under <a> tags, with the attribute “title = (title)”. One can see the value of the tag’s attribute with tag[“attribute”], so I can use it to find each posting’s job title.

Если обобщить, то функция, которую мы увидим, состоит из следующих трех шагов,

  1. Pulling out all the <div> tags with class including “row”.
  2. Identifying <a> tags with attribute “data-tn-element”:”jobTitle”
  3. For each of these <a> tags, find attribute values “title”
def extract_job_title_from_result(soup): 
  jobs = []
  for div in soup.find_all(name="div", attrs={"class":"row"}):
    for a in div.find_all(name="a", attrs={"data-tn-element":"jobTitle"}):
      jobs.append(a["title"])
  return(jobs)
extract_job_title_from_result(soup)

Этот код выдает следующий результат,

Получение названия компании

Getting company names can be a bit tricky because most of them are appearing in <span> tags, with “class”:” company”.  They are also housed in <span> tags with “class”:” result-link-source”.

Мы будем использовать операторы if/else для извлечения информации о компании из каждого из этих мест. Чтобы удалить белые пробелы вокруг названий компаний при выводе, мы используем inputting.strip() в конце.

def extract_company_from_result(soup): 
 companies = []
 for div in soup.find_all(name="div", attrs={"class":"row"}):
   company = div.find_all(name="span", attrs={"class":"company"})
   if len(company) &gt; 0:
    for b in company:
     companies.append(b.text.strip())
   else:
    sec_try = div.find_all(name="span", attrs={"class":"result-link-source"})
    for span in sec_try:
      companies.append(span.text.strip())
 return(companies)
 
extract_company_from_result(soup)

Получение местоположения

Locations are located under the <span> tags. Span tags are sometimes nested within each other, such that the location text may sometimes be within “class”:”location” attributes, or nested in “itemprop”:”addressLocality”. However a simple for loop can examine all span tags for text and retrieve the necessary information.

def extract_location_from_result(soup): 
  locations = []
  spans = soup.findAll('span', attrs={'class': 'location'})
  for span in spans:
    locations.append(span.text)
  return(locations)
extract_location_from_result(soup)

Получение зарплаты

Зарплата - самая сложная часть для извлечения из объявлений о работе. Большинство объявлений вообще не публикуют информацию о зарплате, а в тех, которые публикуют, она может быть найдена в нескольких местах. Поэтому нам нужно написать код, который сможет найти несколько зарплат в разных местах, а если зарплата не найдена, то создать значение "Ничего не найдено" для всех вакансий, в которых нет зарплаты. 

Some salaries are under <nobr> tags, while others are under <div> tags, “class”:”sjcl” and are under separate div tags with no attributes. Try/except statement can be helpful while extracting this information. 

def extract_salary_from_result(soup): 
  salaries = []
  for div in soup.find_all(name="div", attrs={"class":"row"}):
    try:
      salaries.append(div.find('nobr').text)
    except:
      try:
        div_two = div.find(name="div", attrs={"class":"sjcl"})
        div_three = div_two.find("div")
        salaries.append(div_three.text.strip())
      except:
        salaries.append("Nothing_found")
  return(salaries)
extract_salary_from_result(soup)

Получение резюме на работу

Последняя задача - получить резюме вакансии. Однако получить резюме по каждой конкретной вакансии невозможно, поскольку они не включены в HTML-файл данной страницы Indeed. Мы можем получить некоторую информацию о каждой вакансии из того, что нам предоставлено. Для этого мы можем использовать Selenium.

But let’s first try this using python. Summaries are located under <span> tags. Span tags are nested within each other such that the location text is within “class”:” location” tags or nested in “itemprop”:” adressLocality”. However, using a simple for loop can examine all span tags for text to retrieve the necessary information.

Часто задаваемые вопросы

1. Why is it necessary to scrape job details?
Существует достаточно порталов, которые могут уведомить вас о вакансиях, соответствующих вашему профилю. Тем не менее, решение по скраппингу вакансий позволит вам получить полный список вакансий и их описание в виде удобной базы данных. Это позволит вам лучше видеть все вакансии в одном месте.
2. How can a proxy help in scraping job details?
При веб-скрапинге обычно возникают определенные проблемы, такие как блокировка IP-адресов, гео-блокировка и ограниченная скорость. Скраппинг заданий с порталов вакансий также сопряжен с подобными проблемами. Чтобы обойти все эти проблемы, прокси-адреса помогут вам получить IP-адреса в нужном месте и обеспечить анонимность
3. What are the python libraries required to scrape job details?
Requests, BeautifulSoup, and Pandas are quite common python libraries to scrape job-related data from websites. Request library is the most common python library used to send web requests, while BeautifulSoup is responsible for parsing data, and Pandas library will help with the data structure operations.
Похожие статьи

Подведение итогов

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

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

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