Оптимизация кода Ruby для запуска веб-скрепинга в AWS Lambda - PullRequest
1 голос
/ 13 мая 2019

Я пишу простое безсерверное приложение для сбора данных о доступных спортивных событиях в прямом эфире.Я использую:

Вот мой код:

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

Я хотел представить API с помощью Amazon API Gateway. Проблема в том, что при большом количестве событий я всегда получаю тайм-аут при вызове этого API.

Я уже пробовал:

  • Изменение параметров chrome webdriver

  • Настройка максимального времени ожидания в API Gateway

  • Перезапись кода для возврата событийнумерация страниц, например:

  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

Это было только немного быстрее, поэтому я предполагаю, что @driver.find_elements(class: 'event') намного больше времени, чем .map.

Есть лиЛюбой способ оптимизировать мой код? Моя цель - собрать до 100 спортивных событий. Если нет, то порекомендуете ли вы какой-либо другой инструмент или технологию, которую я могу использовать для очистки живых спортивных событий?с кодом в AWS Lambda?

...