CoderCastrov logo
CoderCastrov
Парсер

Парсинг Indeed с использованием Python

Парсинг Indeed с использованием Python
просмотров
6 мин чтение
#Парсер

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

В этой статье мы собираемся парсить Indeed с использованием Python 3.x. Мы будем собирать вакансии по Python в Нью-Йорке. В конце этого руководства у нас будут все вакансии, которые требуют навык Python в Нью-Йорке.

Почему парсить Indeed?

Парсинг Indeed может помочь вам в нескольких аспектах. Некоторые из них:

  • С таким объемом данных вы можете обучить модель искусственного интеллекта для прогнозирования заработной платы в будущем для любых навыков.
  • Компании могут использовать эти данные, чтобы проанализировать, какую заработную плату предлагают их конкуренты для определенного набора навыков. Это поможет им улучшить свою стратегию найма.
  • Вы также можете проанализировать, какие работы в большом спросе и какой набор навыков необходим для получения работы в будущем.

Подготовка предварительных условий

Для этого проекта нам понадобится Python 3.x, а нашей целевой страницей будет эта страница на Indeed.

Я предполагаю, что вы уже установили Python на своем компьютере. Итак, давайте продолжим с остальной установкой.

Нам понадобятся две библиотеки, которые помогут нам извлечь данные. Мы установим их с помощью pip.

Установка

pip install requests 
pip install beautifulsoup4

Вы можете создать отдельную папку для Indeed на вашем компьютере, а затем создать файл на языке Python, в котором мы напишем код.

Давайте решим, что мы собираемся парсить

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

Мы собираемся парсить все выделенные части на приведенном выше изображении.

  • Название вакансии.
  • Название компании.
  • Их рейтинг.
  • Зарплата, которую они предлагают.
  • Детали вакансии.

Давайте проведем парсинг Indeed

Прежде чем написать первую строку кода, найдем точное местоположение элемента в DOM.

Каждый блок работы является тегом list. Вы можете видеть это на приведенном выше изображении. И на каждой странице есть 18 таких блоков, и все они находятся внутри тега div с классом jobsearch-ResultsList. Итак, наша первая задача - найти этот тег div.

Давайте сначала импортируем все необходимые библиотеки.

import requests
from bs4 import BeautifulSoup

Теперь объявим целевой URL и установим HTTP-соединение с этим веб-сайтом.

l=[]
o={}
target_url = "https://www.indeed.com/jobs?q=python&l=New+York%2C+NY&vjk=8bf2e735050604df"
head= {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36",
    "Accept-Encoding": "gzip, deflate, br",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
    "Connection": "keep-alive",
    "Accept-Language": "en-US,en;q=0.9,lt;q=0.8,et;q=0.7,de;q=0.6",
}
resp = requests.get(target_url, headers=head)

Мы объявили пустой список и пустой объект для хранения данных в конце.

Иногда (в большинстве случаев) вы можете получить код состояния 403. Чтобы избежать блокировки, вам понадобится API для парсинга веб-страниц.

Теперь давайте найдем тег ul с помощью BS4.


soup = BeautifulSoup(resp.text, 'html.parser')

allData = soup.find("ul",{"class":"jobsearch-ResultsList css-0"})

Теперь нам нужно перебрать каждый из этих тегов li и извлечь все данные по одному с помощью цикла for.

alllitags = allData.find_all("div",{"class":"cardOutline"})

Теперь мы запустим цикл for для этого списка alllitags.

Как вы можете видеть на приведенном выше изображении, название работы находится внутри тега a. Поэтому мы найдем этот тег a, а затем извлечем текст из него с помощью метода .text() из BS4.

for i in range(0,len(alllitags)):
    try:
        o["название-работы"]=alllitags[i].find("a",{"class":"jcs-JobTitle css-jspxzf eu4oa1w0"}).text
    except:
        o["название-работы"]=None

Давайте найдем название компании с помощью того же метода.

Название компании можно найти внутри тега div с классом heading6 company_location tapItem-gutter companyInfo. Давайте также извлечем его.

try:
        o["название-компании"]=alllitags[i].find("div",{"class":"companyInfo"}).find("span",{"class":"companyName"}).text
except:
        o["название-компании"]=None

Здесь мы сначала нашли тег div, а затем использовали метод .find() для поиска тега span внутри него. Вы можете проверить изображение выше для большей ясности.

Давайте извлечем рейтинг теперь.

Рейтинг можно найти в том же теге div, что и название компании. Только класс тега span изменится. Новый класс будет ratingsDisplay.

try:
        o["рейтинг"]=alllitags[i].find("div",{"class":"companyInfo"}).find("span",{"class":"ratingsDisplay"}).text
except:
        o["рейтинг"]=None

Предложение о зарплате можно найти внутри тега div с классом metadata salary-snippet-container.

try:
     o["зарплата"]=alllitags[i].find("div",{"class":"salary-snippet-container"}).text
except:
     o["зарплата"]=None

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

Это список, который можно найти внутри тега div с классом metadata taxoAttributes-container.

try:
   o["детали-работы"]=alllitags[i].find("div",{"class":"metadata taxoAttributes-container"}).find("ul").text
except:
   o["детали-работы"]=None


l.append(o)
o={}

В конце мы поместили наш объект o в список l и сделали объект o пустым, чтобы при следующей итерации он мог хранить данные новой работы.

Давайте распечатаем результаты и посмотрим, что получилось.

print(l)

Полный код

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

Но пока полный код будет выглядеть так.

import requests
from bs4 import BeautifulSoup

l=[]
o={}


target_url = "https://www.indeed.com/jobs?q=python&l=New+York%2C+NY&vjk=8bf2e735050604df"
head= {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36",
    "Accept-Encoding": "gzip, deflate, br",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
    "Connection": "keep-alive",
    "Accept-Language": "en-US,en;q=0.9,lt;q=0.8,et;q=0.7,de;q=0.6",
}

resp = requests.get(target_url, headers=head)
print(resp.status_code)
soup = BeautifulSoup(resp.text, 'html.parser')

allData = soup.find("ul",{"class":"jobsearch-ResultsList css-0"})

alllitags = allData.find_all("div",{"class":"cardOutline"})
print(len(alllitags))
for i in range(0,len(alllitags)):
    try:
        o["название-вакансии"]=alllitags[i].find("a",{"class":"jcs-JobTitle css-jspxzf eu4oa1w0"}).text
    except:
        o["название-вакансии"]=None

    try:
        o["название-компании"]=alllitags[i].find("div",{"class":"companyInfo"}).find("span",{"class":"companyName"}).text
    except:
        o["название-компании"]=None


    try:
        o["рейтинг"]=alllitags[i].find("div",{"class":"companyInfo"}).find("span",{"class":"ratingsDisplay"}).text
    except:
        o["рейтинг"]=None

    try:
        o["зарплата"]=alllitags[i].find("div",{"class":"salary-snippet-container"}).text
    except:
        o["зарплата"]=None

    try:
        o["детали-вакансии"]=alllitags[i].find("div",{"class":"metadata taxoAttributes-container"}).find("ul").text
    except:
        o["детали-вакансии"]=None

    l.append(o)
    o={}


print(l)

Использование Scrapingdog для парсинга Indeed

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

После регистрации вы будете перенаправлены на свою панель управления. Панель управления будет выглядеть примерно так:

Вам нужно использовать свой собственный API-ключ.

Теперь вы можете вставить ссылку на целевую страницу Indeed слева, а затем выбрать JS Rendering как No. После этого нажмите Copy Code справа. Теперь используйте этот API в своем скрипте для парсинга Indeed.

Вы заметите, что код останется примерно таким же, как выше. Мы должны просто изменить одну вещь, и это наша целевая URL-адрес.

import requests
from bs4 import BeautifulSoup

l=[]
o={}


target_url = "https://api.scrapingdog.com/scrape?api_key=xxxxxxxxxxxxxxxx&url=https://www.indeed.com/jobs?q=python&l=New+York%2C+NY&vjk=8bf2e735050604df&dynamic=false"


resp = requests.get(target_url)
print(resp.status_code)
soup = BeautifulSoup(resp.text, 'html.parser')

allData = soup.find("ul",{"class":"jobsearch-ResultsList css-0"})

alllitags = allData.find_all("div",{"class":"cardOutline"})
print(len(alllitags))
for i in range(0,len(alllitags)):
    try:
        o["название-работы"]=alllitags[i].find("a",{"class":"jcs-JobTitle css-jspxzf eu4oa1w0"}).text
    except:
        o["название-работы"]=None

    try:
        o["название-компании"]=alllitags[i].find("div",{"class":"companyInfo"}).find("span",{"class":"companyName"}).text
    except:
        o["название-компании"]=None


    try:
        o["рейтинг"]=alllitags[i].find("div",{"class":"companyInfo"}).find("span",{"class":"ratingsDisplay"}).text
    except:
        o["рейтинг"]=None

    try:
        o["зарплата"]=alllitags[i].find("div",{"class":"salary-snippet-container"}).text
    except:
        o["зарплата"]=None

    try:
        o["детали-работы"]=alllitags[i].find("div",{"class":"metadata taxoAttributes-container"}).find("ul").text
    except:
        o["детали-работы"]=None

    l.append(o)
    o={}


print(l)

Как вы можете видеть, мы заменили целевой URL-адрес Indeed на URL-адрес API Scrapingdog. Вам нужно использовать свой собственный API-ключ, чтобы успешно запустить этот скрипт.

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

Заключение

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

Вы можете изменить URL страницы, чтобы собирать информацию о вакансиях с следующей страницы. Очевидно, вам нужно найти изменение, которое происходит в URL при переходе на следующую страницу, нажимая на номер внизу страницы. Для сбора информации о миллионах таких вакансий вы всегда можете использовать Scrapingdog😜.

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

Дополнительные ресурсы

Вот несколько дополнительных ресурсов, которые могут быть полезными во время вашего путешествия по парсингу веб-страниц: