Добавить парсер в телеграмм бот
То что делает парсер должно происходить в тг боте, запросы делаем например: 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))
Ответы (1 шт):
Автор решения: gord1402
→ Ссылка
Вы можете отправлять данные ссылки в 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)