优化在AWS Lambda中运行的Webscraping的Ruby代码
我正在编写一个简单的无服务器应用程序来收集有关可用的体育赛事直播的数据。我正在使用:优化在AWS Lambda中运行的Webscraping的Ruby代码,ruby,web-scraping,selenium-chromedriver,aws-serverless,Ruby,Web Scraping,Selenium Chromedriver,Aws Serverless,我正在编写一个简单的无服务器应用程序来收集有关可用的体育赛事直播的数据。我正在使用: 无服务器chrome v1.0.0-37() 铬驱动2.37 selenium webdriver gem 3.141.0 用Ruby 2.5编写代码并在AWS lambda中运行 这是我的密码: def find_event_ids visit_page elements = @driver.find_elements(class: 'event').map do |event_el| e
- 无服务器chrome v1.0.0-37()
- 铬驱动2.37
- selenium webdriver gem 3.141.0
- 用Ruby 2.5编写代码并在AWS lambda中运行
def find_event_ids
visit_page
elements = @driver.find_elements(class: 'event').map do |event_el|
event_el.attribute('id')
end
end
def setup_driver
options = Selenium::WebDriver::Chrome::Options.new(binary: ENV['BINARY_PATH'])
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1280x1696')
options.add_argument('--disable-application-cache')
options.add_argument('--disable-infobars')
options.add_argument('--no-sandbox')
options.add_argument('--hide-scrollbars')
options.add_argument('--enable-logging')
options.add_argument('--log-level=0')
options.add_argument('--single-process')
options.add_argument('--ignore-certificate-errors')
options.add_argument('--homedir=/tmp')
@driver = Selenium::WebDriver.for :chrome, driver_path: ENV['DRIVER_PATH'], options: options
@driver.manage.timeouts.implicit_wait = 30
end
def visit_page
@driver.navigate.to "https://sports.williamhill.com/betting/en-gb/in-play/football"
end
def call_webdriver_handler(event:, context:)
setup_driver
results = find_event_ids
@driver&.quit
{ statusCode: 200, body: JSON.generate(results) }
end
我想用AmazonAPI网关公开一个API。问题是,当有许多事件时,我在调用此API时总是收到一个超时
我已经试过:
- 更改chrome webdriver选项
- 设置API网关中的最大超时
- 重写代码以返回已分页的事件,例如:
@driver.find_elements(class:'event')
比.map
要耗时得多
有没有办法优化我的代码?我的目标是能够凑够100个体育项目。如果没有,您是否建议我使用AWS Lambda中的代码使用任何其他工具或技术来抓取现场体育赛事
def find_event_ids(page = 1)
visit_page
elements = @driver.find_elements(class: 'event')
paginated_elements_data = elements[(RECORDS_PER_PAGE * (page - 1)), (RECORDS_PER_PAGE * page - 1)].map do |event_el|
event_el.attribute('id')
end
{
metadata: {
total_count: elements.count,
total_pages: (elements.count.to_f / RECORDS_PER_PAGE).ceil,
current_page: page,
},
data: paginated_elements_data
}
end