Запись русской кириллицы в csv
При парсинге получаю данные и записываю их в csv
[класс save_file]
Без указания юникода = ошибка
При указании utf8 = Кракозябры вместо русских символов
При указании utf16 = Все как надо, но все столбцы записываются в одну строчку
Как сделать запись как при utf8, но с кириллицей?
Мой код (весь):
import requests
from bs4 import BeautifulSoup
import csv
import os
URL = 'https://www.avito.ru/gelendzhik/kvartiry/sdam/na_dlitelnyy_srok-ASgBAgICAkSSA8gQ8AeQUg' # Cылка что парсим
HEADERS = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36', 'accept': '*/*'}
HOST = 'https://www.avito.ru' # Используем если ссылка на обьявление хитрая и без этого начала
FILE = 'House.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')
pageinate = soup.find_all('span', class_ = 'pagination-item-1WyVp') # Передаем блок со стрелками и нумерацией страниц
if pageinate:
return int(pageinate[-2].get_text()) # Здесь указываем последнюю стр. (должно быть -1, но у нас последний элемент стрелка)
else:
return 1
## Записываем контент ##
def get_content(html):
soup = BeautifulSoup(html, 'html.parser') # Передаем страницу и указываем что работаем с html
items = soup.findAll('div', class_ = 'item-with-contact') # Выбираем контейнер в котором лежит искомы обьект. Одна ячейка списка целиком
hause = [] # Пустой словарь для найденного
for item in items:
hause.append({# Добавляем в наш слорь обьекты
'title' : item.find('a', class_ = 'snippet-link').get_text(strip = True),
'link' : HOST + item.find('a', class_ = 'snippet-link').get('href'),
'price' : item.find('span', class_ = 'snippet-price').get_text(strip = True),
'address' : item.find('span', class_ = 'item-address__string').get_text(strip = True),
})
return hause
# 'link' : HOST + item.find('a', class_ = 'ListingItemTitle-module__link').get('href'), / .find_next('span') Аналогичный поиск дальше
## Сохранение ##
def save_file(items, path): # Что сохраняем , куда
with open(path, 'w', newline='', encoding='utf8') as file:
writer = csv.writer(file, delimiter=';') # Указываем таблицу
writer.writerow(['Обьявление', 'Ссылка', 'Цена', 'Адрес']) # Указываем титульные столбцы
for item in items:
writer.writerow([item['title'], item['link'], item['price'], item['address']])
## Сам парсер ##
def parse():
# URL = input('Введите URL: ')
# URL = URL.strip()
html = get_html(URL)
if html.status_code == 200: # Статус 200 - сайт отвечает
house = []
pages_count = get_pages_count(html.text)
for page in range(1, pages_count + 1):
print(f'Парсинг страницы {page} из {pages_count}')
html = get_html(URL, params={'p' : page}) # Передаем страницу (в ключе указываем то как указывается страница на сайте)
house.extend(get_content(html.text)) # Заносим данные в список
save_file(house, FILE)
print (f'Получено {len(house)} обьявлений')
os.startfile(FILE)
else:
print('Ошибка URL \ Сайт не отвечает')
parse()