CoderCastrov logo
CoderCastrov
Glassdoor

Парсинг Glassdoor с помощью Python

Парсинг Glassdoor с помощью Python
просмотров
8 мин чтение
#Glassdoor

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

В этой статье мы собираемся использовать Python для парсинга вакансий с Glassdoor. В конце этого руководства вы сможете извлекать данные с Glassdoor и сохранять их в файл CSV.

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

Для этой статьи нам понадобится python 3.x, и я предполагаю, что вы уже установили его на своем компьютере. Вместе с этим нам нужно загрузить сторонние библиотеки, такие как BeautifulSoup, Selenium и драйвер chromium.

  • BeautifulSoup — Это поможет нам разбирать сырой HTML и извлекать нужные данные. Он также известен как BS4.
  • Selenium — Это поможет нам отображать веб-сайты с помощью JavaScript.
  • Chromium - это веб-драйвер, используемый Selenium для управления браузером Chrome.

Вот как их установить

pip install selenium
pip install beautifulsoup4

Вместе с этим вам нужно создать отдельную папку, где вы будете хранить файл скрипта. Также создайте файл на языке Python внутри этой папки. Я назову его glassdoor.py

mkdir glass

Что мы будем парсить с Glassdoor?

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

Сначала мы извлечем сырой HTML с помощью Selenium с веб-сайта, а затем будем использовать методы .find() и .find_all() из BS4 для извлечения этих данных из сырого HTML.

Для загрузки веб-сайта будет использоваться Chromium в сотрудничестве с Selenium.

Парсинг Glassdoor

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

from bs4 import BeautifulSoup
from selenium import webdriver
import time

PATH = 'C:\Program Files (x86)\chromedriver.exe'


l=list()
o={}

target_url = "https://www.glassdoor.com/Job/new-york-python-jobs-SRCH_IL.0,8_IC1132348_KO9,15.htm?clickSource=searchBox"

driver=webdriver.Chrome(PATH)

driver.get(target_url)

driver.maximize_window()
time.sleep(2)

resp = driver.page_source

driver.close()

Теперь давайте пошагово разберем, что мы сделали здесь.

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

Одна вещь, которую вы заметите, это то, что все эти вакансии находятся внутри тега ul с классом hover p-0 my-0 css-7ry9k1 exy0tjh5. Итак, сначала мы должны найти этот класс. Мы будем использовать метод .find() из BS4, чтобы найти этот тег внутри нашего DOM.

allJobsContainer = soup.find("ul",{"class":"css-7ry9k1"})

allJobs = allJobsContainer.find_all("li")

С помощью метода .find() мы ищем тег ul, а затем с помощью метода .find_all() мы ищем все теги li внутри тега ul.

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

Одна вещь, которую вы можете заметить, это то, что иногда Glassdoor покажет вам страницу без вакансий. Вам просто нужно очистить куки и попробовать снова.

Теперь давайте найдем местоположение каждого целевого элемента по очереди.

Как вы можете видеть, название компании можно найти внутри тега div с классом d-flex justify-content-between align-items-start. Давайте извлечем его из исходного HTML с помощью BS4.

for job in allJobs:
    try:
        o["название-компании"]=job.find("div",{"class":"d-flex justify-content-between align-items-start"}).text
    except:
        o["название-компании"]=None

    l.append(o)

    o={}

Теперь давайте найдем название вакансии.

Вы можете найти этот тег внутри тега a с классом jobLink css-1rd3saf eigr9kq2. Давайте используем ту же технику, чтобы найти его.

try:
    o["название-вакансии"]=job.find("a",{"class":"jobLink css-1rd3saf eigr9kq2"}).text
except:
    o["название-вакансии"]=None

На приведенном выше изображении вы можете видеть, что местоположение хранится внутри тега div с классом d-flex flex-wrap css-11d3uq0 e1rrn5ka2.

try:
    o["местоположение"]=job.find("div",{"class":"d-flex flex-wrap css-11d3uq0 e1rrn5ka2"}).text
except:
    o["местоположение"]=None

Осталась последняя вещь - зарплата, и это самая важная часть по очевидным причинам😜.

Вы можете видеть на приведенном выше изображении, что информацию о зарплате можно найти внутри тега div с классом css-3g3psg pr-xxsm.

try:
    o["зарплата"]=job.find("div",{"class":"css-3g3psg pr-xxsm"}).text
except:
    o["зарплата"]=None


l.append(o)
o={}

В конце мы поместили объект o в список l. Затем мы объявили объект o пустым.

После запуска и печати списка l вы получите следующие результаты.

Вы получите название компании, название вакансии, местоположение и зарплату в виде списка.

Сохраним эти данные в CSV файл

Для сохранения этих данных в CSV файл нам просто нужно установить pandas. Это всего лишь две строки кода, и мы сможем создать CSV файл и сохранить в нем эти данные.

Сначала установим pandas.

pip install pandas

Затем импортируем его в наш основной скрипт glassdoor.py.

import pandas as pd

Теперь, используя метод DataFrame, мы преобразуем наш список l в формат строк и столбцов. Затем, используя метод .to_csv(), мы преобразуем DataFrame в CSV файл.

df = pd.DataFrame(l)
df.to_csv('jobs.csv', index=False, encoding='utf-8')

Вы можете добавить эти две строки, когда ваш список l будет готов со всеми данными. После выполнения программы вы получите CSV файл с именем jobs.csv в вашей корневой папке.

Не так ли просто? Вы смогли спарсить и сохранить данные в CSV файл за мгновение.

Полный код

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

from bs4 import BeautifulSoup
from selenium import webdriver
import time
import pandas as pd

PATH = 'C:\Program Files (x86)\chromedriver.exe'


l=list()
o={}

target_url = "https://www.glassdoor.com/Job/new-york-python-jobs-SRCH_IL.0,8_IC1132348_KO9,15.htm?clickSource=searchBox"

driver=webdriver.Chrome(PATH)

driver.get(target_url)

driver.maximize_window()
time.sleep(2)

resp = driver.page_source
driver.close()

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

allJobsContainer = soup.find("ul",{"class":"css-7ry9k1"})

allJobs = allJobsContainer.find_all("li")

for job in allJobs:
    try:
        o["название-компании"]=job.find("div",{"class":"d-flex justify-content-between align-items-start"}).text
    except:
        o["название-компании"]=None

    try:
        o["название-вакансии"]=job.find("a",{"class":"jobLink css-1rd3saf eigr9kq2"}).text
    except:
        o["название-вакансии"]=None


    try:
        o["местоположение"]=job.find("div",{"class":"d-flex flex-wrap css-11d3uq0 e1rrn5ka2"}).text
    except:
        o["местоположение"]=None


    try:
        o["зарплата"]=job.find("div",{"class":"css-3g3psg pr-xxsm"}).text
    except:
        o["зарплата"]=None

    l.append(o)

    o={}

print(l)

df = pd.DataFrame(l)
df.to_csv('jobs.csv', index=False, encoding='utf-8')

Код простой, аккуратный и прямолинейный.

Что, если вы хотите спарсить все страницы?

Если вы хотите спарсить все вакансии со всех страниц Glassdoor, то вам нужно будет обратить внимание на шаблоны URL.

Первая страница - https://www.glassdoor.com/Job/new-york-python-jobs-SRCH_IL.0,8_IC1132348_KO9,15.htm?includeNoSalaryJobs=true

Вторая страница - https://www.glassdoor.com/Job/new-york-python-jobs-SRCH_IL.0,8_IC1132348_KO9,15_IP2.htm?includeNoSalaryJobs=true&pgc=AB4AAYEAHgAAAAAAAAAAAAAAAfkQ90AAUgEBAQgW%2Fr3vuIzCm5wwBSiI3WKjWOqbueSQvnI%2BGizAAsjV8NiAL80nAjkvw3vucgztbs4IIrkoqerQ462C14jLJVNRIV0ihlakU7p20hMXIG4AAA%3D%3D

Третья страница - https://www.glassdoor.com/Job/new-york-python-jobs-SRCH_IL.0,8_IC1132348_KO9,15_IP3.htm?includeNoSalaryJobs=true&pgc=AB4AAoEAPAAAAAAAAAAAAAAAAfkQ90AAdwEBAQtEzo8VunEQLF8uBoWr%2BRnCsnMFj0JNOLbRUXIkLkFAzjjZlKDW1axVwiTVV%2BbXo8%2BX471WNF8IEWPMdAwCPhbzQe1T1HHMEVPYFwQLM8h1NnGMDPcEwo7tpQ7XL65R7DMDR26n0NhBU7lFGCODAwxNTsJRAAA%3D

Как видно, в этих URL нет общего шаблона, за исключением этой части - https://www.glassdoor.com/Job/new-york-python-jobs-SRCH_IL.0,8_IC1132348_KO9,15. Но это не поможет, если вы хотите спарсить другие страницы. Поэтому единственное решение - использовать метод .click(), предоставляемый API Selenium. Используя метод .click(), мы будем нажимать кнопку "Далее", прокручивая вниз.

Сначала прокрутите, а затем нажмите.

Вот как вы будете прокручивать страницу на любой странице Glassdoor.

scrolling_element= driver.find_element_by_xpath("//*[@id='MainCol']")
driver.execute_script('arguments[0].scrollTop = arguments[0].scrollHeight', scrolling_element)

С помощью .find_element_by_xpath() мы находим столбец, в котором хранятся все вакансии.

После прокрутки этого элемента вам нужно найти кнопку и нажать на нее.

Вы должны найти ее с помощью того же метода selenium .find_element_by_xpath(). И, наконец, вы должны использовать метод .click(), чтобы нажать на нее. Это перенесет вас на следующую страницу.

time.sleep(3)
driver.find_element_by_xpath('//*[@id="MainCol"]/div[2]/div/div[1]/button[7]').click()
time.sleep(3)

Теперь вам нужно использовать это в цикле, чтобы извлечь все вакансии из определенного местоположения. Я знаю, что это немного длинный процесс, но это единственный способ спарсить Glassdoor.

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

Избегайте блокировки с помощью Scrapingdog

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

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

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

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

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

from bs4 import BeautifulSoup
from selenium import webdriver
import time
import pandas as pd

PATH = 'C:\Program Files (x86)\chromedriver.exe'

l=list()
o={}

target_url = "https://api.scrapingdog.com/scrape?api_key=xxxxxxxxxxxxxxxxxxxxxxxx&url=https://www.glassdoor.com/Job/new-york-python-jobs-SRCH_IL.0,8_IC1132348_KO9,15_IP3.htm?includeNoSalaryJobs=true&pgc=AB4AAoEAPAAAAAAAAAAAAAAAAfkQ90AAdwEBAQtEzo8VunEQLF8uBoWr%2BRnCsnMFj0JNOLbRUXIkLkFAzjjZlKDW1axVwiTVV%2BbXo8%2BX471WNF8IEWPMdAwCPhbzQe1T1HHMEVPYFwQLM8h1NnGMDPcEwo7tpQ7XL65R7DMDR26n0NhBU7lFGCODAwxNTsJRAAA%3D&dynamic=false"

driver=webdriver.Chrome(PATH)

driver.get(target_url)

driver.maximize_window()
time.sleep(2)

resp = driver.page_source
driver.close()

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

allJobsContainer = soup.find("ul",{"class":"css-7ry9k1"})

allJobs = allJobsContainer.find_all("li")

for job in allJobs:
    try:
        o["name-of-company"]=job.find("div",{"class":"d-flex justify-content-between align-items-start"}).text
    except:
        o["name-of-company"]=None

    try:
        o["name-of-job"]=job.find("a",{"class":"jobLink css-1rd3saf eigr9kq2"}).text
    except:
        o["name-of-job"]=None

    try:
        o["location"]=job.find("div",{"class":"d-flex flex-wrap css-11d3uq0 e1rrn5ka2"}).text
    except:
        o["location"]=None

    try:
        o["salary"]=job.find("div",{"class":"css-3g3psg pr-xxsm"}).text
    except:
        o["salary"]=None

    l.append(o)

    o={}

print(l)

df = pd.DataFrame(l)
df.to_csv('jobs.csv', index=False, encoding='utf-8')

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

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

Заключение

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

Конечно, я бы рекомендовал использовать Web Scraping API, если вы планируете парсить его в большом масштабе. С обычным скриптом без ротации прокси вы быстро получите блокировку, и ваша конвейерная лента данных остановится. Для парсинга миллионов таких объявлений вы всегда можете использовать Scrapingdog.

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

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

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