Добавить парсер в телеграмм бот

Рейтинг: -4Ответов: 1Опубликовано: 14.05.2023

То что делает парсер должно происходить в тг боте, запросы делаем например: volvo s80 d5 2013, полученные разделы нужно отобразить как отдельная кнопка внутри которой располагается масло или антифриз или то что выбрал пользователь

код бота:

import telebot
from config import keyForbot
from telebot import types
from bs4 import BeautifulSoup as BS
import requests

bot = telebot.TeleBot(keyForbot)

@bot.message_handler(commands=['start'])
def start(message):
    bot.send_message(message.chat.id, 'Привет, {0.first_name}! , меня звоут PROVOLVик, я бот который тебе поможет тебе с подбором тех.жидкостей!'.format(message.from_user))
    bot.send_message(message.chat.id,'🚘Введите марку и модель авто: ')


@bot.message_handler(content_types= ['text'])
def parser_oil(message):
    query = input('Введите марку и модель авто: ')
    api_url = 'https://www.kroon-oil.com/api/carlist.json'
    car_models = requests.post(api_url, json={"query": query}).json()

    try:
        car = car_models['response'][0]
    except:
        car = car_models['response'][1]
    base_url = 'https://www.kroon-oil.com/ru/product-recommendation/cars/{}/{}/{}/{}'
    url = base_url.format(car['make_url_name'],
                          car['model_url_name'],
                          car['type_url_name'],
                          car['type_id'])
    soup = BS(requests.get(url).content, 'lxml')
    sections = soup.find_all('h2')
    for section in sections:
        print(section.text.strip('\n'))
        section_url = url + '/' + section.parent['data-componentid']
        soup = BS(requests.get(section_url).content, 'lxml')
        try:
            products = soup.find('ul', class_='recommended-products').find_all('h3')
        except:
            print('\t Не найдено')
        for product in products:
            print('\t{}'.format(product.text))




bot.polling(non_stop=True)

код парсера:

import requests
from bs4 import BeautifulSoup as BS
query = input('Введите марку и модель авто: ')
api_url = 'https://www.kroon-oil.com/api/carlist.json'
car_models = requests.post(api_url, json={"query":query}).json()

try:
    car = car_models['response'][0]
except:
    car = car_models['response'][1]
base_url = 'https://www.kroon-oil.com/ru/product-recommendation/cars/{}/{}/{}/{}'
url = base_url.format(car['make_url_name'],
                      car['model_url_name'],
                      car['type_url_name'],
                      car['type_id'])
soup = BS(requests.get(url).content, 'lxml')
sections = soup.find_all('h2')
for section in sections:
    print(section.text.strip('\n'))
    section_url = url+'/'+section.parent['data-componentid']
    soup = BS(requests.get(section_url).content, 'lxml')
    try:
        products = soup.find('ul', class_='recommended-products').find_all('h3')
    except:
        print('\t Не найдено')
    for product in products:
        print('\t{}'.format(product.text))

Ответы

▲ 0

Вы можете отправлять данные ссылки в callback вот так:

import requests
import telebot
from bs4 import BeautifulSoup as BS
from telebot import types

bot = telebot.TeleBot('xxx')


@bot.message_handler(content_types=['text'])
def parser_oil(message):
    query = message.text
    api_url = 'https://www.kroon-oil.com/api/carlist.json'
    car_models = requests.post(api_url, json={"query": query}).json()

    try:
        car = car_models['response'][0]
    except:
        car = car_models['response'][1]
    base_url = 'https://www.kroon-oil.com/ru/product-recommendation/cars/{}/{}/{}/{}'
    url = base_url.format(car['make_url_name'],
                          car['model_url_name'],
                          car['type_url_name'],
                          car['type_id'])
    soup = BS(requests.get(url).content, 'lxml')
    sections = soup.find_all('h2')
    markup_inline = types.InlineKeyboardMarkup(row_width=1)
    for section in sections:
        print(url + '/' + section.parent['data-componentid'])
        call_data = (f"get:{car['make_url_name']};{car['model_url_name']};" 
                     f"{car['type_url_name']};{car['type_id']};"
                     f"{section.parent['data-componentid']}")
        item = types.InlineKeyboardButton(text=section.text.strip('\n'),
                                          callback_data=call_data)
        markup_inline.add(item)
        print(section.text.strip('\n'))

    bot.send_message(message.chat.id, "Выберите продукт:", reply_markup=markup_inline)


@bot.callback_query_handler(func=lambda call: call.data.startswith('get:'))
def get_item(callback):
    params = callback.data.replace('get:', '').split(';')
    base_url = 'https://www.kroon-oil.com/ru/product-recommendation/cars/{}/{}/{}/{}/{}'
    section_url = base_url.format(params[0],
                                  params[1],
                                  params[2],
                                  params[3],
                                  params[4])
    soup = BS(requests.get(section_url).content, 'lxml')
    try:
        products = soup.find('ul', class_='recommended-products').find_all('h3')
        mes = ''
        for product in products:
            mes += product.text + '\n'
        bot.edit_message_text(mes, callback.message.chat.id, callback.message.id)
    except Exception as e:
        print(e)
        bot.edit_message_text('Не найдено', callback.message.chat.id, callback.message.id)


bot.polling(non_stop=True)