post-title

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

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

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

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

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

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

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

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

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

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

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

Такая структура URL будет очень полезна при дальнейшей работе над скрепером и сборе данных с различных страниц. 

Веб-скрепинг для поиска вакансий - понимание 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) > 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. Для чего необходимо соскабливать данные о работе?

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

2. Как прокси-сервер может помочь в сборе информации о работе? 

При веб-скреппинге обычно возникают определенные проблемы, такие как блокировка по IP-адресу, географические блокировки и ограниченная скорость. Скраппинг заданий с порталов вакансий также сопряжен с подобными проблемами. Чтобы обойти все эти проблемы, прокси-адреса помогут вам получить IP-адреса нужного местоположения и обеспечить анонимность

3. Какие библиотеки python необходимы для поиска информации о работе?

Requests, BeautifulSoup и Pandas - довольно распространенные библиотеки python для сбора данных о работе с веб-сайтов. Библиотека Request является наиболее распространенной библиотекой python, используемой для отправки веб-запросов, BeautifulSoup отвечает за разбор данных, а библиотека Pandas поможет выполнить операции со структурами данных. 

Похожие статьи

Как скреативить Twitter с помощью Python

Как скрапировать Instagram с помощью Python

Как скрести Reddit с помощью Python

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

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

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

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