scraping
September 23, 2023

Парсинг данных с avito.ru: Введение и Первые шаги

Avito.ru - один из крупнейших рекламных сайтов в России, и извлечение информации с него может быть полезным для многих задач: от изучения рынка до анализа конкурентов.

Основные понятия

  • Selenium - инструмент для автоматизации браузерных действий, часто используется для тестирования веб-приложений или парсинга данных.
  • Python - высокоуровневый язык программирования, который из-за своей универсальности и доступности стал стандартом в анализе данных и веб-парсинге.
  • Базы данных - это структурированные наборы данных, которые могут легко быть доступны, управляемы и обновляемы.

Подготовка к работе
Прежде всего, вам потребуется установить необходимое программное обеспечение:

  • Убедитесь, что у вас установлен Python. Если нет, его можно скачать здесь.
  • Установите библиотеку Selenium. Это можно сделать с помощью pip:
pip install selenium

Также рекомендуется установить браузерный драйвер для Selenium, например, для Chrome - chromedriver.

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

from selenium import webdriver

driver = webdriver.Chrome(executable_path='path_to_chromedriver')
driver.get('https://www.avito.ru')

Поиск и взаимодействие с элементами сайта

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

Далее, для каждой страницы, мы извлекаем ссылки на все объявления и сохраняем их в csv файл.

Ищу ссылки на все объявления на странице

ads_elements = driver.find_elements(by=By.XPATH, 
                                    value='//a[@data-marker="item-title"]')

Ищу количество объявлений

ads_count = driver.find_element(by=By.XPATH, value="//span[@data-marker='page-title/count']").text.replace(' ','')
  1. by=By.XPATH:
    • Здесь используется метод поиска элемента по XPath. XPath (XML Path Language) — это язык, который позволяет определить местоположение элемента на веб-странице.
  2. value="//span[@data-marker='page-title/count']":
    • Это конкретный XPath запрос. Он ищет элемент span с атрибутом data-marker, значение которого равно 'page-title/count'.
  3. .text:
    • Это свойство возвращает текстовое содержимое найденного элемента. То есть после того как вы нашли нужный элемент на странице.
  4. .replace(' ',''):
    • Этот метод строки Python заменяет все пробелы в строке на пустую строку, то есть удаляет их. Это может быть полезно, если в текстовом содержимом элемента есть пробелы, которые вы хотите удалить.

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

Зная, что на каждой странице отображается 50 объявлений, рассчитываю общее количество страниц на сайте.

if ads_count % 50 > 0:
    page_count = (ads_count // 50) + 1
else:
    page_count = ads_count // 50
  • ads_count % 50 определяет остаток от деления количества объявлений на 50.
  • Если остаток больше 0, это значит, что на последней странице будет менее 50 объявлений, поэтому нужно добавить еще одну страницу ((ads_count // 50) + 1).
  • В противном случае (если объявлений ровно 50 или кратно 50), общее количество страниц будет равно ads_count // 50.

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

Пагинация по страницам

for page in range(1, page_count + 1):
    driver.get(f"{url}&p={page}")    
    driver.implicitly_wait(3)    
    ads_elements = driver.find_elements(by=By.XPATH, 
                                        value='//a[@data-marker="item-title"]') 
    
    for ad in ads_elements:
            link = ad.get_attribute("href")        
            #Записываем ссылку на страницу с объявлениями в csv
            with open("info.csv", mode='a', encoding='utf-8-sig') as csv_file:
             writer = csv.writer(csv_file)    
             # Записываем данные    
             writer.writerow((url))

Этот код переходит на следующую страницу сайта. К базовому URL сайта, добавляется параметр p, который указывает на номер страницы. Ищет на странице все объявления, и записывает их в файл csv

Отлично, теперь у нас есть все ссылки на объявления.

Собираем технические характеристики автомобиля

data = []
def open_info_csv():
    # Инициализация драйвера
    with open("info.csv", mode='r', encoding='utf-8-sig') as csv_file:
        reader = csv.reader(csv_file)
        for row in reader:
        data.append(row)
# Вызываем функцию
open_info_csv()
list_of_url = open_info_csv()
for row in list_of_url:
    driver.get(row)
    #ищу название объявления
    title = driver.find_element(By.XPATH, "//h1[@data-marker='item-view/title-info']").text.split(',')[0].strip('"')
    #Цену
    price = driver.find_element(By.XPATH,'//span[@data-marker="item-view/item-price"]').get_attribute('content')
    #Тип продавца
    seller_type = driver.find_element(by=By.XPATH, value='//div[@data-marker="seller-info/label"]').text
    #Адрес
    address = driver.find_element(by=By.XPATH, value="//div[@itemprop='address']/span").text
    
    #cохраняю в файл
    with open("car_info.csv", mode='a', encoding='utf-8-sig') as csv_file:
             writer = csv.writer(csv_file)    
             # Записываем данные    
             writer.writerow((title,price, seller_type,address))
    driver.close()
    driver.quit()

Полный код на код на Boosty