我有一个基本的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服务的内存。
可以尝试/考虑的选择:
- 不要使用Chrome。使用
requests
和lxml
通过网络级别查询页面,不需要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()')
- 不要使用Chrome。Chrome是理想的功能测试-但如果这不是你客观考虑使用
HtmlUnitDriver
或phantomjs
。这两个都明显比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)