Использование «requests_html» с «FastAPI»

Я пытаюсь использовать библиотеку requests_html с рендерингом js вместе с FastAPI:

script.py

from fastapi import FastAPI
from requests_html import HTMLSession

app = FastAPI()

@app.get('/')
def func():
    with HTMLSession() as session:
        r = session.get('https://stackoverflow.com')
        r.html.render()
        return r.text

при запуске с использованием uvicorn script:app --reload и доступе к http://127.0.0.1:8000/ , я получаю следующую ошибку:

...
 r.html.render()
  File "c:\users\a\appdata\local\programs\python\python37\lib\site-packages\requests_html.py", line 586, in render
    self.browser = self.session.browser  # Automatically create a event loop and browser
  File "c:\users\a\appdata\local\programs\python\python37\lib\site-packages\requests_html.py", line 727, in browser
    self.loop = asyncio.get_event_loop()
  File "c:\users\a\appdata\local\programs\python\python37\lib\asyncio\events.py", line 644, in get_event_loop
    % threading.current_thread().name)
RuntimeError: There is no current event loop in thread 'ThreadPoolExecutor-0_0'.

Любая идея, как я могу заставить их работать вместе?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
577
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны использовать AsyncHTMLSession в Uvicorn.

from fastapi import FastAPI
from requests_html import AsyncHTMLSession

app = FastAPI()

@app.get('/')
async def func():
    asession = AsyncHTMLSession()
    r = await asession.get('https://stackoverflow.org/')

    await r.html.arender()

    return r.text

Отлично работает, спасибо. Я также получаю это предупреждение при первом запросе ``` .\scratch.py:13: RuntimeWarning: сопрограмма 'HTML.arender' никогда не ожидалась r.html.arender() RuntimeWarning: включите tracemalloc, чтобы получить трассировку распределения объектов `` ` это проблема?

Mezo 24.12.2020 10:23

пожалуйста, замените "r.html.arender()" на "ожидание r.html.arender()"

Mehmet 24.12.2020 10:48

Другие вопросы по теме