Selenium和Chromedriver在Lambda上-大规模不一致



我有一个基本的selenium脚本运行/部署在aws lambda上。
Chrome和chromedriver通过serverless作为层安装(并可在/opt上使用)

脚本工作…但只有在某些时候才会这样做,而且很少会大规模地(异步调用5个以上的实例)。

我在一个简单的for循环中调用函数(最多200次迭代)


response = client.invoke(
FunctionName='arn:aws:lambda:us-east-1:12345667:function:selenium-lambda-dev-hello',
InvocationType='Event',  #|'RequestResponse'|'Event' (async)| DryRun'
LogType='Tail',
#ClientContext='string',
Payload=event_payload,
#Qualifier='24'
)

其他运行时,进程在启动这一行的selenium驱动程序时挂起

driver = webdriver.Chrome('/opt/chromedriver_89', chrome_options=options)

其他迭代驱动程序失败/抛出'timeout waiting for renderer exception'我认为这通常是由于chromedriver/chrome的不匹配。我已经检查并验证了我的版本是匹配和兼容的(就像我说的,它们有时确实有效)。

我想我正在寻找一些想法/方向甚至开始解决这个问题。在我的印象中,每个lambda函数的调用都是在一个单独的环境中,那么为什么增加调用的数量会对脚本的运行有任何不利影响呢?

任何想法或想法都将非常感谢!

评论讨论

没有完整的解决方案,但帮助改善这种情况的是增加Lambda服务的内存。

可以尝试/考虑的选择:

  1. 不要使用Chrome。使用requestslxml通过网络级别查询页面,不需要Chrome。

我最近做了一些类似的事情来支持另一个堆栈问题。你可以看到它很相似,但不完全相同。

转到url并从xpath获取一些文本:

from lxml import html
import requests
import json
url = "https://nonfungible.com/market/history"
response = requests.get(url)
page = html.fromstring(response.content)
datastring = page.xpath('//script[@id="__NEXT_DATA__"]/text()')
  1. 不要使用Chrome。Chrome是理想的功能测试-但如果这不是你客观考虑使用HtmlUnitDriverphantomjs。这两个都明显比chrome轻,不需要安装浏览器(你可以直接从库运行)

您只需要更改驱动程序初始化,脚本的其余部分(理论上)应该可以工作。

PhantomJS:

$ pip install selenium
$ brew install phantomjs
from selenium import webdriver
driver = webdriver.PhantomJS()

单位司机:

from selenium import webdriver
driver = webdriver.Remote(
desired_capabilities=webdriver.DesiredCapabilities.HTMLUNIT)

最新更新