Парсинг данных с 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(' ','')
- by=By.XPATH:
- Здесь используется метод поиска элемента по XPath. XPath (XML Path Language) — это язык, который позволяет определить местоположение элемента на веб-странице.
- value="//span[@data-marker='page-title/count']":
- Это конкретный XPath запрос. Он ищет элемент
span
с атрибутомdata-marker
, значение которого равно 'page-title/count'. - .text:
- Это свойство возвращает текстовое содержимое найденного элемента. То есть после того как вы нашли нужный элемент на странице.
- .replace(' ',''):
В итоге, переменная 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