Spyder中带有requestshtml和AysnChrous“render”的Python是一场噩梦

2024-10-06 10:22:52 发布

您现在位置:Python中文网/ 问答频道 /正文

起点是Spyder IDE

>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 bug等)。 我只想让它在Spyder工作(主要是因为我喜欢和熊猫一起玩,看看结果)。 我想其中一种方法是作为独立脚本运行,将结果保存到pickle中,然后使用spyder重新加载数据帧并使用它。但是,嘿,为什么这是必要的

主要的问题是html请求不够清晰。这个错误对于任何试图解决…的原始问题的人来说都是非常不透明的

RuntimeError: Cannot use HTMLSession within an existing event loop. Use AsyncHTMLSession instead.

是的,我试着用谷歌搜索这个问题,但他们总是开始谈论“异步”之类的东西。我正在阅读'requests-html'帮助,任何超出此范围的内容都高于我的薪资等级(目前为零)

有什么建议吗? (只有简单的IC设计师能够理解的asyncio中的简单内容)


Tags: runinfromimportnoneasynciourlsession
1条回答
网友
1楼 · 发布于 2024-10-06 10:22:52

谢谢@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

相关问题 更多 >