Парсинг данных с 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 // 50ads_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