如何同时运行解析器和电报机器人?

问题描述 投票:0回答:1

让解析器不断地收集数据库中的数据,然后机器人通过命令访问这个数据库?

有一个与数据库完美配合的机器人,并且有一个解析器将数据收集到该数据库中。解析器有必要在机器人启动时启动,但同时它们仅同时与数据库交互,并且独立工作。

机器人:

from aiogram import Dispatcher, Bot, F
import asyncio
import os
from dotenv import load_dotenv
from aiogram.client.bot import DefaultBotProperties
from aiogram.enums.parse_mode import ParseMode

# Подключаем роутеры
from gis.gis import gis_pars
from handlers.profile.profile import profile_router, process_pre_checkout_query, success_payment
from handlers.search_org.search_org import search_router
from handlers.add_organization.add_organization import create_route
from handlers.history_search.history_search import history_router
from handlers.mailing.mailing import mailing_route
from handlers.start.start import start_router
from handlers.view_user.view_user import view_router

load_dotenv()
token = os.getenv('TOKEN_ID')
bot = Bot(token=token, default=DefaultBotProperties(parse_mode=ParseMode.HTML))
dp = Dispatcher()


async def start_bot(bot: Bot):
    await bot.send_message(chat_id=*****, text='****')
    await gis_pars()

# Регистрируем роутеры
dp.startup.register(start_bot)
dp.include_router(start_router)
dp.include_router(profile_router)
dp.include_router(search_router)
dp.include_router(create_route)
dp.include_router(history_router)
dp.include_router(mailing_route)
dp.include_router(view_router)

dp.pre_checkout_query.register(process_pre_checkout_query)
dp.message.register(success_payment, F.successful_payment)


async def start():
    try:
        await dp.start_polling(bot, skip_updates=True)
    finally:
        await bot.session.close()


if __name__ == '__main__':
    asyncio.run(start())


帕斯

`import asyncio
from selenium.common import StaleElementReferenceException, NoSuchElementException
from selenium import webdriver
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.common.by import By
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium import webdriver
from time import sleep
from database.Database import DataBase
from gis.pathes import *

chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument("--disable-extensions")
chrome_options.add_argument("--start-maximized")

async def gis_pars():
    global main_block, main_banner, cookie_banner, items_count, phone_btn, next_page_btn, address, title, description, phone, link_org, category, link
    db = DataBase()
    
(next comes the code the working code of the parser)

 def main():
        asyncio.run(gis_pars())

 if __name__ == '__main__':
        main()
`

我尝试了很多选择,其中之一有效,但不是同时且独立的。

python selenium-webdriver aiogram
1个回答
0
投票

实现此目的的一种方法是使用多线程。多线程允许您同时运行两段单独的代码。 在这种情况下,您可以创建一个线程来运行机器人,并创建另一个线程来刷新信息(数据库)。 这样,两个任务看起来就会同时运行。

重要的是要知道,如果机器人修改数据或以某种方式与数据库交互,那么使用多线程可能会导致潜在的冲突,而数据库可能不是最新的。为了避免这些问题,您需要正确同步两个线程之间对共享资源的访问。

Python 提供了一个

threading
模块来创建和管理线程。 示例:

import threading

# Dummy Test Function
def bot_start_function(dummy_arg):
    print(dummy_arg)

# Creating the different Threads
bot = threading.Thread(target=bot_start_function, args=(5,))
database = threading.Thread(target=database_start_function)

# Starting the Threads
bot.start()
database.start()

更多信息可以查看文档:Threading-Documentation

© www.soinside.com 2019 - 2024. All rights reserved.