S_Voll_94
@S_Voll_94
Начинающий Python разработчик

Есть ли решение проблемы смены количества объявлений на странице при парсинге?

import requests
from bs4 import BeautifulSoup
import csv

URL = 'https://auto.ria.com/uk/car/lancia/'
HEADERS = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36',
    'accept': '*/*'}
FILE = 'cars.csv'


def get_html(url, params=None):
    r = requests.get(url, headers=HEADERS, params=params)
    return r


def get_pages_count(html):
    soup = BeautifulSoup(html, 'html.parser')
    pagination = soup.find_all('span', class_='mhide')
    if pagination:
        return int(pagination[-1].get_text())
    else:
        return 1


def get_content(html):
    soup = BeautifulSoup(html, 'html.parser')
    items = soup.find_all('div', class_='content-bar')

    cars = []
    for item in items:
        uah_price = item.find('span', class_='i-block')
        cars.append({
            'title': item.find('a', class_='address').get_text(strip=True),
            'link': item.find('a', class_='address').get('href'),
            'usd_price': item.find('span', class_='bold green '
                                                  'size22').get_text() + ' $',
            'uah_price': uah_price.get_text().replace('\xa0', ' '),
            'city': item.find('li', class_='item-char view-location '
                                           'js-location').get_text(
                strip=True).replace('(від)', '')
        })
    return cars


def save_file(items, path):
    with open(path, 'w', newline='') as file:
        writer = csv.writer(file, delimiter=';')
        writer.writerow(['Заглавие', 'ссылка', 'Цена в USD', 'Цена в UAH',
                         'Город'])
        for item in items:
            writer.writerow([item['title'], item['link'],
                             item['usd_price'],
                             item['uah_price'], item['city']])


def parse():
    html = get_html(URL)
    if html.status_code == 200:
        cars = []
        pages_count = get_pages_count(html.text)
        print(pages_count)
        for page in range(1, pages_count + 1):
            print(f'Парсинг страницы {page} из {pages_count}...')
            html = get_html(URL, params={'page': page})
            cars.extend(get_content(html.text))
            save_file(cars, FILE,)
            print(len(cars))
        print(f'Получено {len(cars)} автомобилей')
    else:
        print('Error')


parse()


1. Создает файл csv с нечитаемым(иероглифы) русским языком. Пробовал указать encoding='utf8' в функции save_file, но это не помогло, у меня IOS и предпросмотр через пробел по файлу csv показывает русский текст, а когда открываю файл в Exel в место русского иероглифы. Пробовал еще через настройки Exel поменять на utf8 формат текста но тоже самое вышло только с другими иероглифами. Есть ли решение этой проблемы, может кто подсказать?
2. Неправильно определяет количество страниц из за того что количество объявлений на одной странице можно поменять и не всю информацию берет со страницы из 10 объявлений 9. Количество объявлений 53 а у меня 28 всего по 9 на стр. первая 10. Что это может ли кто то обьяснить , есть ли решение ?
  • Вопрос задан
  • 105 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы