Я пытаюсь создать простого бота в flask и ускорить его с помощью asyncio. Ниже я попытался упростить мой код, но вот общая цель того, чего я пытаюсь достичь:
Пользователь может отправить до 50 URL-адресов, которые следует проанализировать
Бот разделяет URL-адреса между 5 работниками
Бот открывает в основном 5 веб-сайтов одновременно
бот извлекает весь текст и добавляет его в список
Шаги 3 и 4 повторяются до тех пор, пока все веб-сайты, предоставленные пользователем, не будут просканированы
список со всеми текстами до 50 URL-адресов передается в Rapid Automati c Извлечение ключевого слова (RAKE: https://github.com/csurfer/rake-nltk)
RAKE извлекает ключевые слова ранжирует их и помещает в словарь
Словарь передается обратно пользователю
Мой текущий код возвращает эту ошибку:
RuntimeError: There is no current event loop in thread 'Thread-2'.
Буду очень благодарен за каждое предложение. Я до сих пор не очень понимаю, как работает asyncio, но попытался сделать его аналогом некоторых других кодов, которые я нашел. По сути, я просто хочу запросить несколько URL-адресов параллельно, и это кажется таким простым, но я не могу его реализовать. Заранее спасибо за помощь.
Вот мой код:
from flask import Flask
from bs4 import BeautifulSoup
from rake_nltk import Rake
import asyncio
import aiohttp
app =
Flask(__name__)
r = Rake()
# To simplify I just added 5 URLs instead of 50 in this list
urls = [ "https://www.washingtonpost.com", "https://en.wikipedia.org/wiki/Severe_acute_respiratory_syndrome_coronavirus_2", "https://www.welt.de", "https://www.faz.net/aktuell/", "https://www.sueddeutsche.de" ]
async def fetch(url, session):
async with session.get(url) as response:
html = await response.read()
return html
@app.route("/")
def fetch_things():
text = []
session = aiohttp.ClientSession()
tasks = [asyncio.ensure_future(fetch(url, session)) for url in urls]
loop = asyncio.get_event_loop()
responses = loop.run_until_complete(asyncio.gather(*tasks, return_exceptions=True))
for i in responses:
soup = BeautifulSoup(i.content, 'lxml')
souptxt = soup.text()
# I will remove all stopwords with this function
souptxt = remove_stopwords(souptxt)
text.append(souptxt)
keywords = r.extract_keywords_from_text(text)
ranked = r.get_ranked_phrases_with_scores()
loop.close()
return ranked
if __name__ == '__main__':
app.run(debug=True)