@Oleg_Charkov

Парсер не считывает все страницы и не все записывает в json, что делать?

Написал код для парсинга сайта по аренде автомобилей (rentride). Проблема в том, что парсер не считывает все страницы, либо идет какой-то бесконечный цикл + не все записывается в json (max 3 строки). Также не могу спарсить цену, тк у цены нет класса.
Ниже прикладываю мой код, HTML-разметку цены и скрины результата парсинга.

Вот код парсера:
import requests
from bs4 import BeautifulSoup
import json

url = 'https://rentride.ru/arendovat/moskva/'
params = {'page': 1}
pages = 25
n = 1

while params['page'] <= pages:
    response = requests.get(url, params=params)
    soup = BeautifulSoup(response.text, 'lxml')
    infos = soup.find_all('div', class_='main-info')

    for n, i in enumerate(infos, start=n):
        data_dict = []
        name = i.find('h4', class_='title-car').text.strip()
        stars = i.find('div', class_='rating-value').text
        comments = i.find('div', class_='car-review-count').text.strip()
        price = i.find('div', class_='car-price-info')
        print(f'{n}: {name} за {price} с оценкой {stars} и количеством отзывов:{comments}')

        last_page_num = int(soup.find_all('a', class_='no-decoration pagination-number-item')[-1].text)
        pages = last_page_num if pages < last_page_num else pages
        params['page'] +=1

    data = {
        'car': name,
        'price': price,
        'stars': stars,
        'comments': comments,
        }

    data_dict.append(data)

    with open('data_2.json', 'w') as json_file:
        json.dump(data_dict, json_file, indent=5)


HTML-разметка цены:
<div class="car-price-info"><div class="price-per-day"><span>от 
            1900&nbsp;₽ <span class="period">/ сутки</span></span> <!----></div> <!----></div>


Результат парсинга:
62e2e040a25d5623268449.png
  • Вопрос задан
  • 170 просмотров
Пригласить эксперта
Ответы на вопрос 1
bravebug
@bravebug
Проблема во внимательности:
div с атрибутом class="vehicle-card-vertical-body car-info-body" на одном уровне содержит два div'а:
- div с атрибутом class="main-info"
- div с атрибутом class="car-price-info"

в переменную 'infos" изначально кладёте не те данные, в которых не возможно найти цену.

Счётчик страниц нужно увеличивать в цикле while после выхода из цикла for, иначе вы скачиваете сначала первую страницу, потом 21ую, а 41ой уже не существует (в точных цифрах могу ошибаться)

Настоятельно рекомендую поставить задержку на скачивание каждой последующей страницы:
from time import sleep
и в начале цикла while:
sleep(1)

По JSON нужно смотреть, что за ошибка.
Если:
...
TypeError: Object of type Tag is not JSON serializable

Значит Вы скорее всего пытаетесь сохранить в JSON какой-то объект bs4, который JSON не поддерживает.
Надо предварительно конвертировать его в поддерживаемый тип данных.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы