gpt4 book ai didi

python-3.x - 使用 Asyncio 的 Run_In_Executor 包装 Selenium 驱动程序(和其他阻塞调用)

转载 作者:行者123 更新时间:2023-12-01 00:52:40 26 4
gpt4 key购买 nike

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

有几个代码片段演示了 BaseEventLoop.run_in_executor 的使用 - such as here - 但是文档很少,而且我的复制和粘贴功能不够强大。

如果有人愿意扩展使用 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, ''))

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

最佳答案

这不是 asyncio 或 run_in_executor 问题。 selenium api 根本无法以这种方式使用。第一个 driver.get 不返回任何内容。见 Docs for selenium .其次,不能直接用selenium获取状态码,见this stack overflow question

这段代码对我有用:

@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, ''))

关于python-3.x - 使用 Asyncio 的 Run_In_Executor 包装 Selenium 驱动程序(和其他阻塞调用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30170989/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com