@tokyodead

Как получать только одну новость в парсере? И как сделать из него телеграмм бота?

Добрый день, подскажите пожалуйста, есть парсер, который берет объявления с сайта в формате json и сохраняет их.
Как его подключить к телеграм боту, и чтобы он отправлял только новые обьявления? Подскажите пожалуйста, код я нашел в интернете, только учусь, и хотелось бы для практики сделать такое.
Пытался написать функицю check_news_update но застопарился)

Вот код
import requests
import json
import os
import unicodedata
from bs4 import BeautifulSoup
import operator

URL = 'https://kolesa.kz/cars/'
HEADERS = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36','accept': '*/*'}
HOST = 'https://kolesa.kz/'
FILE = str(os.path.abspath(os.getcwd())) + '/file.json'

def get_html(url, params=None):
#получение html структуры сайта
	r = requests.get(url, headers=HEADERS, params=params)
	return r

def get_pages_count(html):
# колличество страниц для парсинга
	return int(1)

def get_content(html):
#получение данных объявления
	soup = BeautifulSoup(html, 'html.parser')
	items = soup.find_all('div', class_='a-elem')
	cars = []
	for item in items:
		cars.append({
			'title': item.find('span', class_='a-el-info-title').find_next('a').get_text(strip=True),
			'price': ''.join(filter(str.isdigit, item.find('span', class_='price').get_text())),
			'public_date': item.find('span', class_='date').get_text(strip=True),
			'link': HOST + item.find('a').get('href'),
			'city': item.find('div', class_='list-region').get_text(strip=True),
			})
	return cars

def save_file(items, path):
#сохранение в формате json с поддержкой кириллицы
	with open(path, 'w', encoding ='utf-8', newline='') as file:
		json.dump(items, file, sort_keys=False, indent=3, ensure_ascii=False, separators=(',', ': '))


def check_news_update():
	with open("file.json") as file:
		news_list = json.load(file)
		print(news_list)


def parse():
	html = get_html(URL)
	if html.status_code == 200:
		cars = []
		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 = {'page' : page})
			cars.extend(get_content(html.text))
		save_file(cars, FILE)
		print(f'Получено {len(cars)} автомобилей')
		# os.startfile(FILE)
	else:
		print('Error')

parse()
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 1
@haveacess
На сайте сделайте в консоли listing.items

В парсере просто прогоните регулярку listing.items.push(*) - и тяните json
Пагинация тоже простая https://kolesa.kz/cars/?page=X
а пол кол-ву объявлений на странице и общему числу объявлений можно высчитать сколько страниц всего
Ответ написан
Ваш ответ на вопрос

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

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