<MyRusakov.ru />

Создание сайтов на Django

Создание сайтов на Django

Данный курс научит Вас создавать сайты на очень мощном фреймворке – Django. Курс состоит из 9 разделов, в которых Вы с нуля освоите данный фреймворк на примере создания полноценного Интернет-магазина.

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

Помимо самого курса Вас ждёт ещё и бесплатный ценный Бонус: «Unit-тестирование сайта на Django». В этом Бонусе Вы узнаете, как можно написать автоматические тесты для проекта на Django. Это позволит находить оперативно ошибки, а также даст возможность в будущем добавлять новый функционал, не боясь что-то сломать в старом.

Подробнее
Подписка

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

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Зачем Вы изучаете программирование/создание сайтов?

Парсинг сайта вакансии на Python

Парсинг сайта вакансии на Python

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

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

Также учтите, что существуют рекомендации, которых стоит придерживаться, при использовании парсинга:

  • Извлекаемое содержимое не должно быть защищен авторским правом
  • Парсинг не должен замедлять или иным образом мешать работе сайта
  • Парсинг не должен нарушать условия использования сайта
  • Нельзя извлекать персональный данные пользователя

Проект создается в PyCharm Community.

Итак, для получения и извлечения данных мы будем использовать следующие библиотеки, которые Вам нужно будет установить:

Комманда установки


$ pip install -r requirements.txt

Файл requirements.txt


beautifulsoup4==4.10.0
certifi==2021.10.8
charset-normalizer==2.0.12
idna==3.3
lxml==4.8.0
pkg_resources==0.0.0
requests==2.27.1
soupsieve==2.3.1
urllib3==1.26.8

После того как зависимости установятся, перейдем непосредственно к коду:


import json
import time
import requests
from bs4 import BeautifulSoup

# config

URL = 'https://{ВАШ_САЙТ}/vacancies/middle_php_developer'

# заголовки запроса
headers = {
    'User-Agent': 'Firefox/99.0'
}

# возвращает содержимое страницы в виде текста
def get_page_content(url):
    text = ''

    res = requests.get(url, headers=headers)

    if res.status_code != 404:
        return res.text

    return text


# класс представляет одну вакансию
# аттрибуты класса - части вакансии из разметки
class Vacancy:
    url: str
    company: str
    companyAbout: str
    title: str
    salary: str
    requiredSkills: str
    locationAndTypeOfEmployment: str
    description: str

    # преобразование объекта данного класса в строку возвращает отформатированный json
    def __str__(self) -> str:
        return json.dumps(self.__dict__, ensure_ascii=False, indent=4)


# извлечение вакансии из текстового содержимого страницы
def parse_vacancy(url: str) -> Vacancy:
    vacancyObj = Vacancy()

    try:
        text = get_page_content(url)
        bs = BeautifulSoup(text, 'lxml')

        # интересующие нас данные извлекаем с помощью CSS селекторов - возможность библиотеки BeautifulSoup
        company = bs.select_one('.company_name')
        companyAbout = bs.select_one('.company_about')
        title = bs.select_one('.page-title__title')
        salary = bs.select_one(
            'body > div.page-container > div > div > div > div > article > section:nth-child(1) > div '
            '> div > div > div:nth-child(3)')
        description = bs.select_one('.job_show_description__vacancy_description')
        requiredSkills = bs.select_one('body > div.page-container > div > div > div > div > article > '
                                       'section:nth-child(1) > div > div > div > div:nth-child(4)')
        locationAndTypeOfEmployment = bs.select_one('body > div.page-container > div > div > div > div > article > '
                                                    'section:nth-child(1) > div > div > div > div:nth-child(5)')

        # собираем данные в объект
        vacancyObj.url = url
        vacancyObj.company = company.text
        vacancyObj.companyAbout = companyAbout.text if companyAbout is not None else ''
        vacancyObj.title = title.text
        vacancyObj.description = str(description.contents[0])
        vacancyObj.salary = salary.text.replace('Зарплата', '')
        vacancyObj.requiredSkills = requiredSkills.text.replace('Требуемые навыки', '')
        vacancyObj.locationAndTypeOfEmployment = locationAndTypeOfEmployment.text.replace('Местоположение и тип '
                                                                                          'занятости', '')
    # обработка ошибок
    except AttributeError as ae:
        print(url)
        print(ae)

    except requests.RequestException as e:
        print(e)

    return vacancyObj


# извлечение всех ссылок на вакансии со страницы
def get_all_page_links(text):
    bs = BeautifulSoup(text, 'lxml')
    links = bs.select('.vacancy-card__title-link')
    return [link.get('href') for link in links]


# Циклично обходит все страницы собирая данные и записывает их в файл
def process_page():
    vacancies = []
    out_file = open(f'parsed/parsed_vacancies.json', 'a')
    out_file.write('[')
    out_string = ''
    counter = 1

    for page in range(1, 7):

        try:
            url = URL + '?page=' + str(page)
            res = requests.get(url, headers=headers)

            if res.status_code != 404:
                links = get_all_page_links(res.text)
                # print(links)
                # останавливаем запрос на 400 мс, чтобы не нагружать сайт
                time.sleep(0.4)

                for link in links:
                    vacancyUrl = f'https://{ВАШ_САЙТ}{link}'
                    vacancy = parse_vacancy(vacancyUrl)
                    vacancyStr = str(vacancy)

                    out_string += vacancyStr
                    out_string += ',\n'

                    print(f'{counter}: {vacancyUrl}')
                    counter += 1
                    # vacancies.append(str(vacancy))

                    # останавливаем запрос на 500 мс
                    time.sleep(0.5)
                    # print(vacancyUrl)

        except requests.RequestException as e:
            print(e)
            continue

    # print(vacancies)

    out_file.write(out_string)
    out_file.write(']')
    out_file.close()


# запускает скрипт
if __name__ == '__main__':
    process_page()


Таким образом, после окончания работы данного скрипта в папке parsed Вы должны увидеть файл parsed_vacancies.json со структурированными данными о вакансиях.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.