CoderCastrov logo
CoderCastrov
Парсер

Парсинг веб-страниц с помощью Python: Руководство для начинающих по извлечению вакансий

Парсинг веб-страниц с помощью Python: Руководство для начинающих по извлечению вакансий
просмотров
5 мин чтение
#Парсер
Table Of Content

Вы устали от ручного прокручивания бесконечных объявлений о вакансиях в поисках идеальной возможности? Тогда этот учебник именно для вас! В этом руководстве я расскажу вам о шагах парсинга объявлений о вакансиях с JobInventory.com с использованием Python.

Сначала мы будем использовать библиотеку requests для отправки GET-запроса на веб-сайт и получения HTML-контента. Затем мы будем использовать BeautifulSoup для разбора HTML и извлечения соответствующей информации о вакансиях, такой как название вакансии, название компании и описание вакансии.

Далее мы изучим, как использовать модуль регулярных выражений Python для очистки извлеченных данных и их подготовки для дальнейшего анализа. Мы также рассмотрим, как сохранить данные в CSV-файл для последующего использования.

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

Итак, возьмите чашку кофе и готовьтесь погрузиться в мир парсинга веб-страниц с помощью Python. По окончании этого учебника у вас будут навыки парсинга объявлений о вакансиях на JobInventory.com и не только!


Реализация доступна на GitHub:

Парсинг вакансий с сайта jobinventory.com

Установка

Для начала парсинга вакансий нам понадобятся некоторые пакеты Python. Откройте терминал или командную строку и выполните следующую команду:

pip install requests beautifulsoup4 pandas

Эти пакеты позволят нам отправлять HTTP-запросы, парсить HTML и сохранять полученные данные в CSV-файле.

Парсинг одной страницы

Теперь, когда у нас установлены необходимые зависимости, давайте перейдем к коду.

import requests
from bs4 import BeautifulSoup
import re
import pandas as pd

# Определение поискового запроса и местоположения
search_query = "data scientist"
location = "New York City, NY"

# Формирование URL
url = f"http://www.jobinventory.com/search?q={search_query}&l={location}"

# Отправка GET-запроса по URL
response = requests.get(url)

# Парсинг HTML-контента с помощью BeautifulSoup
soup = BeautifulSoup(response.content, "html.parser")

# Поиск всех вакансий на странице
job_listings = soup.find_all("li", class_="resultBlock")

# Определение пустых списков для хранения деталей вакансий
titles = []
companies = []
locations = []
descriptions = []

# Перебор каждой вакансии и извлечение соответствующих деталей
for job in job_listings:
    title = job.find("div", class_="title").text.strip()
    company = job.find("span", class_="company").text.strip()
    location = (
        job.find("div", class_="state").text.split("\xa0-\xa0")[-1].strip()
    )
    description = job.find("div", class_="description").text.strip()

    titles.append(title)
    companies.append(company)
    locations.append(location)
    descriptions.append(description)

# Очистка описаний вакансий с использованием регулярных выражений
regex = re.compile(r"\s+")
clean_descriptions = [regex.sub(" ", d).split(" - ")[1] for d in descriptions]

# Создание объекта DataFrame для хранения деталей вакансий
df = pd.DataFrame(
    {
        "Название": titles,
        "Компания": companies,
        "Местоположение": locations,
        "Описание": clean_descriptions,
    }
)

# Экспорт DataFrame в CSV-файл
df.to_csv("job_listings.csv", index=False)

print("Парсинг завершен! Результаты сохранены в файле \"job_listings.csv\".")

df

В этом коде мы сначала определяем переменные search_query и location. Затем мы формируем URL, объединяя эти переменные с базовым URL JobInventory.com.

Затем мы отправляем GET-запрос по URL с использованием библиотеки requests и парсим HTML-контент с помощью BeautifulSoup. Мы находим все вакансии на странице, ища элементы li с классом resultBlock.

Далее мы определяем пустые списки для хранения деталей вакансий и перебираем каждую вакансию, извлекая соответствующие детали с помощью метода find. Мы добавляем извлеченные детали в соответствующие списки.

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

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

И вот! Всего несколькими строками кода на Python вы можете выполнить парсинг вакансий с JobInventory.com и сохранить их в CSV-файл для дальнейшего анализа.

Но что, если на сайте есть несколько страниц с вакансиями?

Парсинг нескольких страниц

Мы можем обработать пагинацию, изменив наш код следующим образом:

import requests
from bs4 import BeautifulSoup
import re
import pandas as pd

# Определите поисковый запрос и местоположение
search_query = "data scientist"
location = "Нью-Йорк, США"

# Составьте базовый URL
base_url = "http://www.jobinventory.com"

# Определите пустые списки для хранения информации о вакансиях
titles = []
companies = []
locations = []
descriptions = []

# Проходите по каждой странице списка вакансий
max_pages = 5
page_num = 1

while page_num <= max_pages:
    # Составьте URL для текущей страницы
    url = f"{base_url}/search?q={search_query}&l={location}&start={page_num}"

    # Отправьте GET-запрос на URL
    response = requests.get(url)

    # Разберите HTML-контент с помощью BeautifulSoup
    soup = BeautifulSoup(response.content, "html.parser")

    # Найдите все вакансии на странице
    job_listings = soup.find_all("li", class_="resultBlock")

    # Если на текущей странице нет вакансий, значит мы достигли конца списка
    if not job_listings:
        break

    # Проходите по каждой вакансии и извлекайте соответствующую информацию
    for job in job_listings:
        title = job.find("div", class_="title").text.strip()
        company = job.find("span", class_="company").text.strip()
        location = (
            job.find("div", class_="state").text.split("\xa0-\xa0")[-1].strip()
        )
        description = job.find("div", class_="description").text.strip()

        titles.append(title)
        companies.append(company)
        locations.append(location)
        descriptions.append(description)

    # Увеличивайте номер страницы
    page_num += 1

# Очистите описания вакансий с использованием регулярных выражений
regex = re.compile(r"\s+")
clean_descriptions = [regex.sub(" ", d).split(" - ")[1] for d in descriptions]

# Создайте объект DataFrame Pandas для хранения информации о вакансиях
df = pd.DataFrame(
    {
        "Название": titles,
        "Компания": companies,
        "Местоположение": locations,
        "Описание": clean_descriptions,
    }
)

# Экспортируйте объект DataFrame в CSV-файл
df.to_csv("job_listings_multiple.csv", index=False)

print("Парсинг завершен! Проверьте файл 'job_listings_multiple.csv' для результатов.")

df

В этом измененном коде мы сначала определяем переменные поискового запроса и местоположения, а также базовый URL JobInventory.com. Мы также определяем пустые списки для хранения информации о вакансиях.

Затем мы проходим по каждой странице списка вакансий, до, например, 5 страниц, увеличивая параметр start в URL. Мы проверяем, есть ли вакансии на текущей странице, и если нет, мы выходим из цикла.

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

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

И вот! С помощью этих изменений мы можем парсить список вакансий с JobInventory.com на нескольких страницах.

Удачного парсинга!

Ваша вики, документы и проекты. Вместе.

Новый инструмент, который объединяет ваши повседневные рабочие приложения в одно. Это все-в-одном рабочее пространство для вас и вашей команды.

affiliate.notion.so


Вы можете найти меня на GitHub или Twitter.