优化在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