为什么在Python中使用Robobrowser进行网页抓取会导致“任务已被破坏,但仍在等待中!”

时间:2019-01-22 10:40:39

标签: python bots discord robobrowser

我正在为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>()]>>

似乎可以顺利完成该过程,但是当它完成时,它就会崩溃。

1 个答案:

答案 0 :(得分:0)

Google Play商店中有很多乱码HTML,这可能会导致故意在此进行网页抓取。这导致解析页面花费了超过10秒钟的时间。但是,我不知道是什么原因导致任务自毁。

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