Пытаюсь спарсить данные о машинах на авито, но парсер выводит информацию только с 1 страницы

items = soup.find_all("div", class_="item__line")
for page in range(1, p_num + 1):
    print(f"Парсинг страницы {page} из {p_num}...")
    html = requests.get(URL, headers=HEADERS, params={"p": page})
    for item in items:
        cars.append({
            "title": item.find("h3", class_="snippet-title").get_text(strip=True),  # Марка
            "link": HOST + item.find("a", class_="snippet-link").get("href"),  # Ссылка
            "price": item.find("div", class_="snippet-price-row").get_text(strip=True).replace('₽', ''), # Цена в руб.
            "address": item.find("div", class_="item-address").get_text(strip=True)})  # Аддресс
    print (cars)

Ответы (1 шт):

Автор решения: Elusha

Вам нужно найти список элементов, которые выводят количество страниц. Это вроде бы теги span с одинаковым классом pagination-item-1WyVp. Находите последний элемент(а точнее предпоследний, потому что последний - что-то вроде "Вперёд ->"). Этот последний элемент будет количеством проходов вашего цикла. Я взял за основу ваш код и немного его модифицировал:

import requests
from bs4 import BeautifulSoup
from time import sleep

r = requests.get('https://www.avito.ru/rossiya/avtomobili?cd=1')
soup = BeautifulSoup(r.content, 'html.parser')

pages = soup.find_all('span', 'pagination-item-1WyVp')[-2].text # Количество страниц
cars = []

for page in range(1, int(pages)+1):
    print(f"Парсинг страницы {page} из {pages}...")
    html = requests.get('https://www.avito.ru/rossiya/avtomobili?cd=1&p=', str(page)).content
    pagesoup = BeautifulSoup(html, 'html.parser') # Страница, которая обрабатывается в данный момент
    items = pagesoup.find_all("div", class_="item__line")
    for item in items:
        cars.append({
            "title": item.find("h3", class_="snippet-title").get_text(strip=True), # Я убрал ссылку. Мне главное показать как оно вообще работает, добавите сами :)
            "price": item.find("div", class_="snippet-price-row").get_text(strip=True).replace('₽', ''), 
            "address": item.find("div", class_="item-address").get_text(strip=True)}) 
    print (cars)
    sleep(15) # Вряд ли поможет

Я добавил в конец что-то похожее на защиту от распознования ботов. Это скорее всего не поможет, особенно если в комментариях пишут, что у Авито хорошая защита. Как миниум туда нужно подставлять рандомное значение. Лучше чтобы это значение было не меньше 10. Да это долго, но зато это самый простой вариант.

→ Ссылка