#python #python-requests #spyder #dynamic-html
Вопрос:
Отправной точкой является IDE Spyder.
>Spyder IDE (5.1.0)
>
>The Scientific Python Development Environment | Spyder-IDE.org
>
>Python 3.8.5 64-bit | Qt 5.12.9 | PyQt5 5.12.3 | Linux 5.4.0-81-generic
Что я хочу сделать?
Соскоблите сложный блог, кажется, что blogspot запутывает намного больше, но в Spyder я иногда обнаруживаю, что не могу даже очистить свою собственную домашнюю страницу…
import asyncio
from requests_html import AsyncHTMLSession, HTML, HTMLSession
from bs4 import BeautifulSoup as bs
import re
import os, os.path
from pathlib2 import Path
from collections import OrderedDict as Odict
from datetime import datetime, date, timedelta
import pytz
import unicodedata
import sys
# asession = AsyncHTMLSession()
ass = AsyncHTMLSession()
sss = HTMLSession()
url='http://localhost/index.html'
def syncurl(session=None, url=None):
r = session.get(url)
return r
async def asyncurl(session=None, url=None):
r = await session.get(url)
#if r.status_code == 200:
#await r.html.arender()
return r
def gurl(ass, url):
fiz = lambda : asyncurl(ass, url)
foz = ass.run(fiz)
return foz
Так что, если я запущу это в Spyder, а затем выполню, я получу ожидаемое дерьмо «цикл уже запущен».
gurl(ass,url)
Traceback (most recent call last):
File "<ipython-input-2-ebc91fe79d44>", line 1, in <module>
gurl(ass,url)
File "/home/user/PycharmProjects/blogscrape/BlogScraping/asynctest.py", line 38, in gurl
foz = ass.run(fiz)
File "/opt/anaconda3/lib/python3.8/site-packages/requests_html.py", line 774, in run
done, _ = self.loop.run_until_complete(asyncio.wait(tasks))
File "/opt/anaconda3/lib/python3.8/asyncio/base_events.py", line 592, in run_until_complete
self._check_running()
File "/opt/anaconda3/lib/python3.8/asyncio/base_events.py", line 552, in _check_running
raise RuntimeError(f'This event loop is already running : {self._thread_id}')
RuntimeError: This event loop is already running : 139750638774080
Я не пытаюсь изобретать велосипед здесь, и я уверен, что у многих других есть эта проблема, но до сих пор я не видел краткого ответа (кроме ошибки Spyder и т. Д.).
Я просто хочу, чтобы это работало в Spyder (главным образом потому, что мне нравится играть с пандами, чтобы посмотреть на результаты).
Я полагаю, что одним из способов было бы запустить эту штуку как отдельный скрипт, сохраняющий результаты в рассоле, а ЗАТЕМ использовать spyder для перезагрузки фрейма данных и использовать его. Но, эй, зачем это нужно?
Основная проблема заключается в отсутствии ясности в запросах-html. Ошибка очень непрозрачна для любого, кто просто пытается обойти первоначальную проблему ..
Ошибка времени выполнения: Не удается использовать HTMLSession в существующем цикле событий. Вместо этого используйте AsyncHTMLSession.
И да, я пытался погуглить эту проблему, но они всегда начинают говорить об «асинхронности». Я читаю справку «запросы-html», все, что выходит за рамки этого, выше моего уровня оплаты (в настоящее время ноль).
Так что, пожалуйста, какой-нибудь совет? (только простые вещи из asyncio, которые мог понять простой дизайнер IC).
Комментарии:
1. Работает ли синхронная версия? Есть ли какая-то причина, по которой вы считаете, что вам нужна асинхронная версия?
2. Синхронная версия была опробована в первую очередь, как наиболее простая, но ( поскольку я не был достаточно ясен в посте) ошибка времени выполнения, показанная выше, была вызвана попыткой запуска с помощью HTMLSession (синхронная версия). Таким образом, само сообщение об ошибке направляет пользователя к асинхронному варианту.
3. Возможно, этот комментарий мог бы помочь: github.com/spyder-ide/spyder/issues/7096#issuecomment-449655308
Ответ №1:
Спасибо @Daniel, Да, это, похоже, работает, чтобы устранить проблему, показанную выше. Это не на 100% идеально, хотя, так как иногда я получаю ошибку тайм-аута, я не уверен, почему, но я больше не получаю ошибку тайм-аута.
Просто чтобы собрать все это в одном месте.. После установки с,
pip install nest_asyncio
Просто добавьте следующее в код python.
import nest_asyncio
nest_asyncio.apply()
Этого достаточно, чтобы запустить код в Spyder (поскольку это была первоначальная проблема).
Добавление дополнительного времени ожидания / ожидания в код для «asyncurl» позволяет сценарию запускаться, хотя и медленно, поэтому не пытайтесь запускать слишком много вызовов в сценарии. Приведенная выше функция изменяется следующим образом.
async def asyncurl(session=None, url=None):
r = await session.get(url)
await asyncio.sleep(5.0)
# if r.status_code == 200:
await r.html.arender(timeout=20000)
return r