Я пишу простое безсерверное приложение для сбора данных о доступных спортивных событиях в прямом эфире.Я использую:
Вот мой код:
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?