【问题标题】:why is web scraping with Robobrowser in Python causing "Task was destroyed but it is pending!"为什么在 Python 中使用 Robobrowser 进行网络抓取会导致“任务已被破坏,但它正在等待处理!”
【发布时间】:2019-06-15 19:32:40
【问题描述】:

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

以前,我没有问题。然而,我刚刚为 Google Play 商店添加了一个案例,现在它告诉我“任务已销毁,但它正在等待处理!”当它试图通过 GPS 链接获取这些物品时。

我不知道为什么会这样,也不知道如何解决。我查找了所有其他“任务被破坏...”的案例,但没有一个与我的相似。

这是我的代码:

我已经尝试过线程化并等待它。不能等待 Robobrowser,所以这不起作用。线程也不起作用,因为我需要函数返回一个字符串。我知道在使用不同的线程时可以返回一些东西,但是对于我要修复的问题来说它过于复杂。

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>()]>>

它似乎可以很好地运行该过程,但是当它完成时,它会崩溃。

【问题讨论】:

    标签: python bots discord robobrowser


    【解决方案1】:

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

    解决方法是使用 Python 的 play-scraper 库,它的速度提高了 20 倍,收集信息不到半秒。

    【讨论】:

      猜你喜欢
      • 2016-02-29
      • 2017-01-08
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 2019-08-09
      • 2016-08-06
      • 2021-07-25
      相关资源
      最近更新 更多