Улучшение веб-очистки элементов в контейнере с помощью Selenium - PullRequest
0 голосов
/ 13 ноября 2018

Я использую FireFox, и мой код работает просто отлично, за исключением того, что он очень медленный.Я предотвращаю загрузку изображений, просто чтобы немного ускорить:

firefox_profile = webdriver.FirefoxProfile()
firefox_profile.set_preference('permissions.default.image', 2)
firefox_profile.set_preference('dom.ipc.plugins.enabled.libflashplayer.so', 'false')
firefox_profile.set_preference("browser.privatebrowsing.autostart", True)
driver = webdriver.Firefox(firefox_profile=firefox_profile)

, но производительность все еще низкая.Я пытался идти без головы, но, к сожалению, это не сработало, так как я получаю ошибки NoSuchElement.Так есть ли способ ускорить очистку сети Selenium?Я не могу использовать scrapy, потому что это динамическая веб-очистка, мне нужно нажимать следующую кнопку несколько раз, пока не будет нажатых кнопок, и нужно также нажимать всплывающие кнопки.

здесьфрагмент кода:

a = []
b = []
c = []
d = []
e = []
f = []
while True:
    container = driver.find_elements_by_xpath('.//*[contains(@class,"review-container")]')
    for item in container:
        time.sleep(2)
        A = item.find_elements_by_xpath('.//*[contains(@class,"ui_bubble_rating bubble_")]')
        for i in A:
            a.append(i,text)
        time.sleep(2)
        B = item.find_elements_by_xpath('.//*[contains(@class,"recommend-titleInline noRatings")]')
        for j in B:
            b.append(j.text)
        time.sleep(3)
        C = item.find_elements_by_xpath('.//*[contains(@class,"noQuotes")]')
        for k in C:
            c.append(k.text)
        time.sleep(3)
        D = item.find_elements_by_xpath('.//*[contains(@class,"ratingDate")]')
        for l in D:
            d.append(l.text)
        time.sleep(3)
        E = item.find_elements_by_xpath('.//*[contains(@class,"partial_entry")]')
        for m in E:
            e.append(m.text)

    try:
        time.sleep(2)
        next = driver.find_element_by_xpath('.//*[contains(@class,"nav next taLnk ui_button primary")]')
        next.click()
        time.sleep(2)
        driver.find_element_by_xpath('.//*[contains(@class,"taLnk ulBlueLinks")]').click()
    except (ElementClickInterceptedException,NoSuchElementException) as e:
        break

Вот отредактированная версия, но скорость не улучшается.

========================================================================
while True:
    container = driver.find_elements_by_xpath('.//*[contains(@class,"review-container")]')
    for item in container:
        WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH,'.//*[contains(@class,"ui_bubble_rating bubble_")]')))
        A = item.find_elements_by_xpath('.//*[contains(@class,"ui_bubble_rating bubble_")]')
        for i in A:
            a.append(i.text)
        WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH,'.//*[contains(@class,"recommend-titleInline noRatings")]')))
        B = item.find_elements_by_xpath('.//*[contains(@class,"recommend-titleInline noRatings")]')
        for i in B:
            b.append(i.text)
        WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH,'.//*[contains(@class,"noQuotes")]')))
        C = item.find_elements_by_xpath('.//*[contains(@class,"noQuotes")]')
        for i in C:
            c.append(i.text)
        WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH,'.//*[contains(@class,"ratingDate")]')))
        D = item.find_elements_by_xpath('.//*[contains(@class,"ratingDate")]')
        for i in D:
            d.append(i.text)
        WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH,'.//*[contains(@class,"partial_entry")]')))
        E = item.find_elements_by_xpath('.//*[contains(@class,"partial_entry")]')
        for i in E:
            e.append(i.text)

    try:
        #time.sleep(2)
        WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH,'.//*[contains(@class,"nav next taLnk ui_button primary")]')))
        next = driver.find_element_by_xpath('.//*[contains(@class,"nav next taLnk ui_button primary")]')
        next.click()
        WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH,'.//*[contains(@class,"taLnk ulBlueLinks")]')))
        driver.find_element_by_xpath('.//*[contains(@class,"taLnk ulBlueLinks")]').click()
    except (ElementClickInterceptedException,NoSuchElementException) as e:
        break

1 Ответ

0 голосов
/ 14 ноября 2018

Для динамических веб-страниц (страниц, отображаемых или дополненных с помощью javascript), я предлагаю вам использовать scrapy-splash

Не то, чтобы вы не могли использовать селен, но для утилизации лучше использовать скрап-брызги.

Кроме того, если вам нужно использовать селен для очистки, хорошей идеей будет использование опции без головы. А также вы можете использовать хром. У меня были некоторые тесты на то, что Chrome Headless быстрее, чем Firefox, иногда возвращается назад.

Кроме того, вместо сна лучше использовать webdriverwait с ожидаемым условием, поскольку он ожидает столько времени, сколько необходимо, а не режим сна, что заставляет вас ждать указанное время.

Редактировать: добавление как редактирование при попытке ответить на @QHarr, поскольку ответ довольно длинный.

Это предложение для оценки scrapy-splash.

Я тяготею к скрапингу, потому что вся экосистема связана с утилизацией. Как промежуточное ПО, прокси, развертывание, планирование, масштабирование. Поэтому, если вам нужна серьезная утилизация, лучше всего начать с позиции. Так что это предложение приходит с оговоркой.

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

Но я бы предположил, что более или менее вы сможете получить сравнимое время при серийном запуске, если вы делаете то же самое. Как и в большинстве случаев, вы тратите время на ожидание ответов.

Если вы отказываетесь от какого-либо значительного количества товаров, вы получаете ускорение, как правило, распараллеливая запросы. Также в случаях, возвращаясь к базовому http-запросу и ответу, где это не нужно, достаточно отобразить страницу в любом пользовательском агенте.

Кроме того, в некоторых случаях некоторые действия на веб-странице могут выполняться с использованием основного http-запроса / ответа. Так что время является приоритетом, тогда вы должны стремиться к тому, чтобы как можно больше делалось с запросом / ответом http.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...