Не работает парсер и отправка в телеграм бота python aiogram asincio
Парсер собирает данные с авито и отправляет интересные объявления в Тг Собственно по отдельности парсер парсит, а отправка в Тг бота работает исправно. Но вместе никак не работает. Понятно что конфликт между асинхронной функцией и обыкновенной. Но как исправить у меня ума не хватает
import asyncio
import os
import subprocess
#from notifiers.logging import NotificationHandler
from loguru import logger
import pandas as pd
import openpyxl
import time
from datetime import datetime
import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from aiogram import Bot, Dispatcher, types, executor
from aiogram.utils import executor
cd=1&q=%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BD%D0%BE')
now = datetime.now().strftime("%d-%m-%Y %H:%M:%S")
class AvitoParse:
def __init__(self, url:str, items:list, count=100, versiom_main=None):
self.url = url
self.items = items
self.count = count
self.data = []
self.current_date = datetime.now().strftime("%d.%m.%Y") # перенес дату файла в класс
self.file_json = f"data_{self.current_date}{self.items}.json"
self.file_xlsx = f"data_{self.current_date}{self.items}.xlsx"
@property
def __get_chrome_version(self):
if os.name == 'nt':
import winreg
'''Открываем ключ в реестре который содержит версию'''
reg_key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Google\Chrome\BLBeacon")
version = winreg.QueryValueEx(reg_key, "version")[0]
return version.split('.')[0]
else:
output = subprocess.check_output(['google-chrome', '--version'])
try:
version = output.decode('utf-8').split()[-1]
version = version.split('.')[0]
return version
except Exception as error:
raise Exception(f'Chrome Exception: {error}')
def __set_up(self):
options = Options()
options.add_argument('--headless')
self.driver = driver = uc.Chrome(versiom_main = self.__get_chrome_version, options=options)
def __get_url(self):
self.driver.get(self.url)
def __paginator(self):
"""сначала сделаем фильтрацию, а то по умолчанию он херню выдает"""
self.driver.find_element(By.TAG_NAME, "select").click()
self.driver.find_element(By.CSS_SELECTOR, "[value='104']").click()
while self.driver.find_elements(By.CSS_SELECTOR, "[data-marker = 'pagination-button/nextPage']") and self.count>0:
self.__parse_page()
self.driver.find_element(By.CSS_SELECTOR, "[data-marker = 'pagination-button/nextPage']").click()
self.count-=1
def find_key(self, description):
key = ''
description_split = description.lower().split()
for i in description_split:
for word in self.items:
if word in i:
key = word
return key
#for item in self.items:
# if item in description.lower().split():
# return item
async def parse_page(self):
# задержка для загрузки всей страницы
#def document_initialised(driver):
# return driver.execute_script("return initialised")
#WebDriverWait(driver, timeout=10).until(document_initialised)
"""Ограничение количества просмотренных объявлений NEW ADD TEST LATER"""
if os.path.isfile('viewed.txt'):
with open('viewed.txt', 'r') as file:
self.viewed_list = list(map(str.rstrip, file.readlines()))
if len(self.viewed_list) > 5000:
self.viewed_list = self.viewed_list[-900:]
else:
with open('viewed.txt', 'w') as file:
self.viewed_list = []
titles = self.driver.find_elements(By.CSS_SELECTOR, "[data-marker='item']")
for title in titles:
name = title.find_element(By.CSS_SELECTOR, "[itemprop='name']").text
try:
description = title.find_element(By.CSS_SELECTOR, "[class *= 'item-description']").text
except Exception as E:
description = ''
url = title.find_element(By.CSS_SELECTOR, "[data-marker *= 'item-title']").get_attribute('href')
price = int(title.find_element(By.CSS_SELECTOR, "[itemprop='price']").get_attribute('content'))
date = title.find_element(By.CSS_SELECTOR, "[data-marker='item-date']").text + " " + "от "+ str(now)
id = title.get_attribute('data-item-id')
"""TEST NEW"""
if self.is_viewed(id):
continue
self.viewed_list.append(id)
data = {'id': id,
'name': name,
'description': description,
'url': url, 'price': price,
'date': date,
'key': self.find_key(description)}
'''продумать выдирание ключа'''
name_desc=description.lower() + ' ' + name.lower() # чтоб искал не только в описании, но и в наименовании создана переменная
if any([item.lower() in name_desc for item in self.items]) and int(price) < 25000:
self.data.append(data)
print('send_tg')
await bot.send_message(chat_id=chat_id, text=url) # ПРОБЛЕМА ТУТ!!!
self.__save_data()
def is_viewed(self, id: str) -> bool:
"""Проверяет, смотрели мы это или нет"""
if id in self.viewed_list:
return True
return False
def __save_data(self):
# докрутим к имени файла текущую дату
#current_date = datetime.now().strftime("%d.%m.%Y") ''' спрятал для теста переноса в класс'''
#file_name = f"data_{self.current_date}{self.items}.json"
#file_name1 = f"data_{self.current_date}{self.items}.xlsx"
#with open(self.file_json, 'w', encoding='utf-8') as file: '''отключен так как е нужен'''
# json.dump(self.data, file, ensure_ascii=False, indent=4)
# запись в эксельку
workbook = openpyxl.Workbook()
sheet = workbook.active
headers = ['id', 'name', 'description', 'url', 'price', 'date', 'key']
for col_num, header in enumerate(headers, 1):
sheet.cell(row=1, column=col_num).value = header
for row_num, row_data in enumerate(self.data, 2):
for col_num, value in enumerate(row_data.values(), 1):
sheet.cell(row=row_num, column=col_num).value = value
workbook.save(self.file_xlsx)
"""TEST NEW"""
with open('viewed.txt', 'w') as file:
for item in set(self.viewed_list):
file.write("%s\n" % item)
def parse(self):
self.__set_up()
self.__get_url()
self.__paginator()
categories = {'https://www.avito.ru': ['600d'],
'https://www.avito.ru': ['nex']} # Здесь тоже подтер свои ссылки
async def send_tg(link):
#loop = asyncio.get_event_loop()
#loop.create_task(send_tg())
await bot.send_message(chat_id=chat_id, text='self.data')
if __name__=="__main__":
chat_id = 'ИД' # убрал свои данные
token = 'токен' # убрал свои данные
bot = Bot(token)
dp = Dispatcher(bot)
loop = asyncio.get_event_loop()
loop.create_task(send_tg())
executor.start_polling(dp)
while True:
for link, items in categories.items():
AvitoParse(url=link, items=items, count=5).parse()
print('Следущая ссылка')
time.sleep(1200)