Как использовать webscraper, работающий на экземпляре EC2 с лямбда-функциями? - PullRequest
0 голосов
/ 06 марта 2019

Я построил webscraper с использованием python и selenium с помощью geckodriver, в настоящее время он работает в экземпляре EC2 по расписанию crontab.

Моя проблема в том, что для завершения загрузки требуется более 5 минут, и я хочуиспользуйте функции lamda, чтобы запустить мой скребок, но они позволяют только 5 минут работы.

Так что у меня есть код, подобный этому.

from selenium import webdriver

def start_browser(url):
    browser = webdriver.Firefox( executable_path="./geckodriver")
    executable_path="./geckodriver")
    browser.get(url)
    return browser

def log_in(user, pass, user_elem, pass_elem, login_elem, browser):
    user_elem.click().send_keys(user)
    pass_elem.click().send_keys(pass)
    login_elem.click()
    return browser

def nav_to_data(browser, data_elem)
    data_elem.click()
    return browser

def find_data(browser, data_table)
    data_links = data_table.find_elements_by_tag_name("tr")
    return data_links, browser

Я думаю, что эти функции могут быть запущенына лямбда-функциях, передающих друг другу экземпляр браузера / веб-драйвера?

Часть, с которой я борюсь, - это циклическое прохождение данных и ожидание завершения всех загрузок, это займет больше 5 минут.

Есть ли что-нибудь вокруг этого?


def download_data(browser, link)
    link.click()
    time.sleep(2)
    download_elem = browser.find_element_by_id("download_xls_file")
    download_path =    download_elem.click()
    return download_path

# THIS TAKES LONGER THAN 5 mins
download_paths = []
for link in data_links:
    download = download_data(browser, link) # clicks a link to a new page wdownload button and returns path to the .xls file
    download_paths.append(download)

upload_data()

1 Ответ

0 голосов
/ 06 марта 2019

Вы можете разделить ваши данные и использовать рекурсивную лямбду для обработки фрагментов вашего списка.Взяв пример из моего блога

def invoke_self_async(data_list, context):
    this_data_list = data_list[0:20] # increase number as needed
    new_event = {
        'data': data_list[20:] # needs to match above number
    }
    boto3.client('lambda').invoke_async(
        FunctionName=context.invoked_function_arn,
        InvokeArgs=json.dumps(new_event)
    )
    my_data = []
    for data in data_list:
        download = download_data(browser, data) # returns path  to .xls file
        my_data.append(download)
    return my_data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...