为什么在 Python 中使用 Robobrowser 进行网络抓取会导致 "Task was destroyed but it is pending!"

why is web scraping with Robobrowser in Python causing "Task was destroyed but it is pending!"

我正在为搜索不同游戏托管站点的 Discord 机器人编写代码。它使用 Robobrowser 在页面的 html 中搜索图像和描述。

以前,我没有任何问题。然而,我刚刚为 Google Play Store 添加了一个案例,现在它告诉我 "Task was destroyed but it is pending!" 当它试图通过 GPS link.

获取这些项目时

我不知道为什么会这样,也不知道如何解决。我查看了所有其他 "Task was destroyed..." 个案例,但 none 与我的相似。

这是我的代码:

我试过穿线并等待它。不能等待 Robobrowser,所以那没有用。线程也不起作用,因为我需要 return 字符串的函数。我知道在使用不同的线程时可以 return 一些东西,但是对于我要修复的东西来说它太复杂了。

def get_embed_caption(url):
    print("Getting caption")
    desc = None
    if url != "No Link":
        try:
            browser.open(url)
            desc = "something"
        except:
            print("Caption ERROR with url")
            desc = None
        if desc != None:
            if "itch.io" in url and " " not in url:
                parse = browser.parsed
                parse = str(parse)

                pos2 = parse.find("og:description")
                pos1 = parse.rfind('content=', 0, pos2)

                desc_type = parse[pos1+8:pos1+9]

                pos2 = parse.rfind(desc_type, 0, pos2-2)
                pos1 = parse.find(desc_type, pos1)
                desc = parse[pos1+1:pos2]

                if len(desc) > 1000:
                    desc = desc[:1000]
                if "/><" in desc:
                    pos = parse.find("formatted_description user_formatted")
                    pos = parse.find("<p>", pos)
                    desc = parse[pos+3:parse.find('</p>', pos)]
            elif "steam" in url and " " not in url:
                parse = browser.parsed
                parse = str(parse)
                pos = parse.find("game_description_snippet")
                pos = parse.find('"', pos)
                pos = parse.find('>', pos)
                desc = parse[pos+1:parse.find('<', pos+1)]
            elif "play.google" in url and " " not in url:
                parse = browser.parsed
                parse = str(parse)
                pos = parse.find('aria-label="Description"')
                print(parse[pos:pos+20])
                pos = parse.rfind("content", 0, pos)
                print(parse[pos:pos+20])
                pos = parse.find('"', pos)
                print(parse[pos:pos+20])
                desc = parse[pos+1:parse.find('"', pos+1)]
            else:
                print("No caption")
                desc = None

            if desc != None:
                desc = desc.replace("<p>", "")
                desc = desc.replace("</p>", "")
                desc = desc.replace("<em>", "`")
                desc = desc.replace("</em>", "`")
                desc = desc.replace("<br>", "")
                desc = desc.replace("<br/>", "")

    return desc
Task was destroyed but it is pending!
task: <Task pending coro=<Client._run_event() running at C:\Users\Gman\AppData\Local\Programs\Python\Python36\lib\site-packages\discord\client.py:307> wait_for=<Future pending cb=[BaseSelectorEventLoop._sock_connect_done(696)(), <TaskWakeupMethWrapper object at 0x0000000005DEAA98>()]>>

似乎运行 顺利完成了这个过程,但是当它完成时,它崩溃了。

Google Play 商店有很多乱码 HTML,可能是故意让网页抓取变得困难。这导致它需要超过 10 秒来解析页面。但是,我不知道是什么导致任务自行销毁。

修复方法是使用 Python 的播放抓取程序库,速度提高了 20 倍,收集信息的时间不到半秒。