Python 3.x 使用Asyncio'包装Selenium驱动程序(和其他阻塞调用);让我们来运行执行器

Python 3.x 使用Asyncio'包装Selenium驱动程序(和其他阻塞调用);让我们来运行执行器,python-3.x,Python 3.x,我正在试用Python中的第一个小型刮板,我想使用asyncio同时获取多个网站。我已经编写了一个与aiohttp一起使用的函数,但是由于aiohttp.request()不执行javascript,因此这对于抓取一些动态网页来说并不理想。因此,这促使人们尝试将Selenium与PhantomJS一起用作无头浏览器 有几个代码片段演示了BaseEventLoop.run_in_executor的使用——但是文档很少,而且我的复制粘贴mojo不够强大 如果有人愿意扩展使用asyncio来包装阻塞调

我正在试用Python中的第一个小型刮板,我想使用asyncio同时获取多个网站。我已经编写了一个与aiohttp一起使用的函数,但是由于aiohttp.request()不执行javascript,因此这对于抓取一些动态网页来说并不理想。因此,这促使人们尝试将Selenium与PhantomJS一起用作无头浏览器

有几个代码片段演示了BaseEventLoop.run_in_executor的使用——但是文档很少,而且我的复制粘贴mojo不够强大

如果有人愿意扩展使用asyncio来包装阻塞调用,或者解释在这种特定情况下发生了什么,我将不胜感激!以下是我到目前为止完成的工作:

@asyncio.coroutine
def fetch_page_pjs(self, url):
    '''
    (self, string, int) -> None
    Performs async website content retrieval
    '''
    loop = asyncio.get_event_loop()
    try:
        future = loop.run_in_executor(None, self.driver.get, url)
        print(url)
        response = yield from future
        print(response)
        if response.status == 200:
            body = BeautifulSoup(self.driver.page_source)
            self.results.append((url, body))
        else:
            self.results.append((url, ''))
    except:
        self.results.append((url, ''))

响应返回“无”-为什么?

这不是异步IO或运行中执行器问题。selenium api根本无法以这种方式使用。第一个driver.get不会返回任何内容。看。其次,无法直接使用selenium获取状态代码,请参阅

这个代码对我有用:

@asyncio.coroutine
def fetch_page_pjs(self, url):
    '''
    (self, string, int) -> None
    Performs async website content retrieval
    '''
    loop = asyncio.get_event_loop()
    try:
        future = loop.run_in_executor(None, self.driver.get, url)
        print(url)
        yield from future
        body = BeautifulSoup(self.driver.page_source)
        self.results.append((url, body))

    except:
        self.results.append((url, ''))

我在搜索run_in_executor时遇到了这个问题。我不确定是否有答案,但您是否希望
fetch\u page\u pjs
函数返回响应?目前它没有返回任何内容,因此python将返回
None
。通过使用
self
也可以看出此函数实际上是类的一部分,并且您从未实际保存对该类的响应。这是有意的吗?最后,您链接的问题中的第一个答案调用与
fetch\u page\u pjs
函数相当的
循环。运行直到完成(main())
,即在循环中运行。你在这么做吗?