Python 3.x 使用Asyncio'包装Selenium驱动程序(和其他阻塞调用);让我们来运行执行器
我正在试用Python中的第一个小型刮板,我想使用asyncio同时获取多个网站。我已经编写了一个与aiohttp一起使用的函数,但是由于aiohttp.request()不执行javascript,因此这对于抓取一些动态网页来说并不理想。因此,这促使人们尝试将Selenium与PhantomJS一起用作无头浏览器 有几个代码片段演示了BaseEventLoop.run_in_executor的使用——但是文档很少,而且我的复制粘贴mojo不够强大 如果有人愿意扩展使用asyncio来包装阻塞调用,或者解释在这种特定情况下发生了什么,我将不胜感激!以下是我到目前为止完成的工作: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来包装阻塞调
@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())
,即在循环中运行。你在这么做吗?