Пытаюсь спарсить данные о машинах на авито, но парсер выводит информацию только с 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. Да это долго, но зато это самый простой вариант.