• Страница 1 из 1
  • 1
Форум » ψ Общий раздел » Программирование » Python » Пишем парсер объявлений Subito на Python (Как написать Subito на Python парсер объявлений)
Пишем парсер объявлений Subito на Python

Дата: Ср, 05.05.2021, 08:21 | Сообщение 1
Регистр
04.01.2021
Сообщений
455

Репутация
Содержание

  • Оглавление​
  • Установка библиотек​
  • Создаем новый класс и первая функция​
  • Получение элементов с рандомными символами с помощью регулярок​
  • Экспорт полученных результатов в таблицу Excel​
  • Заключение​

    1. Оглавление

    Всем здарова, в этом гайде мы будем писать парсер объявлений subito.it (итальянский авито) и затем результат помещать в таблицу Excel на Python.
    Я уверен, что после этой статьи появится куча платных парсеров, но зато люди в разделе "Ищу софт" найдут свой заветный парсер

    2. Установка библиотек

    Для начала установим все нужные библиотеки:

    Код
    pip install requestspip install beautifulsoup4pip install lxmlpip install xlsxwriterpip install random-user-agent

    3. Создаем новый класс и первая функция

    Лучшей IDE для кодинга на Python я считаю PyCharm (она бесплатная), поэтому код пишу в ней. Открываем свою IDE и создаем новый проект и затем переходим или создаем главный файл (main.py)

    Затем добавляем импорты в начало файла:

    Код
    import osimport reimport sysimport requestsimport xlsxwriterfrom bs4 import BeautifulSoupfrom random_user_agent.params import SoftwareName, OperatingSystemfrom random_user_agent.user_agent import UserAgent

    Так как парсеров по моему гайду можно написать абсолютно на все сервисы, поэтому для каждого сайта будем делать свой файл и класс (но уже продолжим в этом) Создадим класс SubitoParser и напишем __init__ функцию, где создается наша сессия requests и присваиваются ей заголовки и юзерагент:

    Код
    class SubitoParser(): def __init__(self, url, id): self.url = url
    self.id = id
    self.session = requests.session()
    software_names = [SoftwareName.CHROME.value]
    operating_systems = [OperatingSystem.WINDOWS.value, OperatingSystem.LINUX.value]
    user_agent_rotator = UserAgent(software_names=software_names, operating_systems=operating_systems, limit=100) headers = {
    'User-Agent': user_agent_rotator.get_random_user_agent(), 'Referer': 'https://www.subito.it' }
    self.session.headers = headers

    4. Получение элементов с рандомными символами с помощью регулярок

    Отлично, теперь местные антиботы будут меньше нас детектить и после создаем основную функцию Get, где будет весь функционал парсера и вставляем такой код (я его объясню ниже):

    Код
    def Get(self): all_ads = []
    self.session.get("https://www.subito.it") soup = BeautifulSoup(self.session.get(self.url).content, "lxml") print(soup)
    for ads in soup.findAll('div', {'class': 'items__item'}): try: url = ads.findAll("a")[0]['href'] print(url)
    ad_soup = BeautifulSoup(self.session.get(url).content, "lxml") _all_ads = {}
    _all_ads["title"] = ad_soup.findAll('h1')[0].text _all_ads["price"] = ad_soup.findAll('p', {'class': re.compile('^classes_price.*')})[0].text _all_ads["description"] = ad_soup.findAll('p', {'class': 'description'})[0].text _all_ads["created"] = ad_soup.findAll('span', {'class': re.compile('^classes_insertion-date.*')})[0].text _all_ads["location"] = ad_soup.findAll('div', {'class': re.compile('^AdInfo_ad-info__location.*')})[0].text _all_ads["seller-name"] = ad_soup.findAll('h6', {'class': re.compile('^index-module_name.*')})[0].text #_all_ads["seller-active"] = ad_soup.findAll('button', {'class': re.compile('^index-module_socialization.*')})[0].text _all_ads["url"] = url all_ads.append(_all_ads)
    except Exception as e: print("[~] error: " + str(e) + ". line: " + str(sys.exc_info()[-1].tb_lineno))

    И так, ты спастил кучу непонятного тебе кода, теперь я объясню что делает библиотека BeautifulSoup4. Именно на этой библиотеке мы делаем весь функционал парсера (получение контента из html тегов). Т.к. мой парсер работает по списку товаров, то на вход мы даем ему ссылку со списком товаров. Затем парсер должен обработать каждый товар в списке и получить его URL, по которому он получает все важные значения следующим запросом.

    А как обнаружить этот список товаров? Просто нажимаем ПКМ по одному из товаров и по иерархии элементов поднимаемся выше, пока не найдем что-то типо такого:



    И на этом скриншоте видно, что все товары имеют класс items__item, а ссылка на товар - это самый первый a тег, поэтому объявляем BeautifulSoup на полученный контент по ссылке, в цикле for ищем все div'ы с классом items__item. Делаем обёртку try - except, если товар не так спарсился или сервис выдал ошибку.

    А теперь скорее всего самое сложное для многих, если перейти по товару и просмотреть код элемента названия товара, то там будет куча бесполезного текста:

    Код
    classes_sbt-text-atom__2GBat classes_token-h4__3_Swu size-normal classes_weight-semibold__1RkLc AdInfo_ad-info__title__2fHVs

    Т.е. после каждого класса идет рандомный текст (это борются с парсерами), но для них печально то, что это обходится одной строчкой, а именно - регулярные выражения. Мы просто берем один класс, который УНИКАЛЬНЫЙ именно для этого элемента, убираем все лишнее и получается

    Код
    re.compile('^classes_price.*')

    Теперь какой бы рандом не был вокруг этого класса, мы будем получать именно элемент с ценой на товар.
    Думаю объяснять как работает findAll не нужно, ибо English, my friend!
    И сразу сохраняем в локальный словарь все полученные переменные и добавляем этот словарь в список, который был объявлен ранее.

    5. Экспорт полученных результатов в таблицу Excel

    И теперь переходим в предпоследнюю часть гайда - сохранение полученных товаров в таблицу Excel

    Внимательно вставляем следующий код ПОСЛЕ цикла for (где мы доставали наши товары):

    Код
    if all_ads is not None: table_name = 'ultimate-sorter-subito-' + str(self.id) +'.xlsx' workbook = xlsxwriter.Workbook(table_name)
    worksheet = workbook.add_worksheet()
    for i in range(len(all_ads)): j = all_ads
    [i]worksheet.write(i, 0, i) worksheet.write(i, 1, j["title"]) worksheet.write(i, 2, j["price"]) worksheet.write(i, 3, j["created"]) worksheet.write(i, 4, j["description"]) worksheet.write(i, 5, j["location"]) worksheet.write(i, 6, j["seller-name"]) #worksheet.write(i, 7, j["seller-active"]) worksheet.write(i, 7, j["url"]) workbook.close() return os.path.abspath(table_name) else: return "error"[/i]

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

    Объявляем Workbook, добавляем туда страницу и проходимся по каждому элементу списка (они же наши полученные товары), добавляя построчно значения из словаря. Затем закрываем таблицу (сохраняем) и возвращаем полный путь до файла с результатом.


    6. Заключение

    На этом можно гайд заканчивать, чтобы спарсить товары достаточно написать новую функцию __main__, откуда уже и вызвать SubitoParser(url, uid).Get() (
    url - ссылка страницу с товарами и uid - идентификатор юзера или просто рандомные цифры, буквы)

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



    Всем удачи!
  • Подписывайтесь! Рекомендуйте нашу группу своим знакомым профессионалам в IT WiN-Prog Наша группа ВКонтакте!



    Форум » ψ Общий раздел » Программирование » Python » Пишем парсер объявлений Subito на Python (Как написать Subito на Python парсер объявлений)
    • Страница 1 из 1
    • 1
    Поиск: