Делаем Webscraping с селеном быстрее (или более быстрые альтернативы) - PullRequest
0 голосов
/ 20 января 2020

Ребята, у меня в настоящее время есть рабочий скрипт, который удаляет ajax контента с определенной страницы ... дело в том, что для запуска требуется + - 12 секунд, и для моих целей мне нужно, чтобы он был быстрее.

Есть советы?

from urllib.parse import urlencode
import requests
import time
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options

def search_char():
    char_name_input = str(input('Search Character: ')) # User input / Character Name

    start_time = time.time()
    browser = webdriver.PhantomJS()


    search_url = 'https://www.tibia.com/community/?subtopic=characters' # URL 

    r = browser.get(search_url) # Searched Character Page

    element = browser.find_element_by_name("name")
    element.send_keys(char_name_input)
    element2 = browser.find_element_by_name("Submit").click()


    page = browser.find_element_by_id('Content')
    rendered_page = page.get_attribute('innerHTML')

    soup = BeautifulSoup(rendered_page, 'html.parser')



    selection = soup.find_all('td')

    lista = []
    for item in selection:
        lista.append(item.get_text())

    browser.close()

    print("--- %s seconds ---" % (time.time() - start_time))

    for i in lista:
        print(i,'\n')

search_char()

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Начнем с того, что если вы имеете дело с веб-страницей, в которой элементы имеют элементы JavaScript или содержат элементы AJAX, то не существует готового решения, доступного для очистки содержание быстрее. Однако в отношении ваших фрагментов кода есть пара предложений:

  • Если в вашем сценарии использования используется click() или send_keys(), всегда вызывайте WebDriverWait для element_to_be_clickable() как следует:

Подробное обсуждение можно найти в Как щелкнуть по элементу с помощью селена Python

  • Если в вашем сценарии использования используется get_attribute('innerHTML'), всегда вызывайте WebDriverWait для visibility_of_element_located() следующим образом:

Подробное обсуждение можно найти в Python + Selenium: дождаться полной загрузки элемента

Locator Strategies_W3C

  • Существует некоторая разница в производительности с использованием CssSelector и XPath . Несколько замечаний:
    • Для начала, нет никакой разницы в производительности c между XPath и CSS.
    • Обход DOM в старых браузерах, таких как IE8, не работает с CSS но с XPath все в порядке. И XPath может подниматься по DOM (например, от дочернего к родителю), тогда как CSS может проходить только по DOM (например, от родительского к дочернему). Однако отсутствие возможности обхода DOM с CSS в старых браузерах не обязательно является плохой вещью, поскольку это скорее показатель того, что ваша страница имеет плохой дизайн и может извлечь пользу из некоторой полезной разметки.
    • An аргумент в пользу CSS заключается в том, что они более читабельны, кратки и лаконичны, хотя это субъективный вызов.
    • Бен Бертон упоминает, что вы должны использовать CSS потому что так строятся приложения. Это облегчает написание тестов, их обсуждение и помощь других.
    • Адам Гоше говорит о необходимости применения более гибридного подхода - в первую очередь сосредоточиться на идентификаторах затем CSS и использование XPath только тогда, когда вам это нужно (например, прогулка по DOM), и что XPath всегда будет более мощным для продвинутых локаторов.
    • Подробное обсуждение можно найти в Почему я должен когда-либо использовать CSS селекторы в отличие от XPath для автоматического тестирования?

Ссылка

Вы можете найти соответствующую подробную обсуждение в Как ускорить Java Selenium Script, с минимальным временем ожидания

0 голосов
/ 21 января 2020

У меня есть несколько советов:

  • переключиться на безголовый chrome, это будет быстрее

  • установитьabilities.pageLoadStrategy в " нет "и использовать WebDriverWait / E C для ожидания элементов. Таким образом, он может продолжаться до того, как все загрузится

  • Всегда использовать css селекторы вместо name / id / xpath

  • send_keys медленный, установлен эти значения с javascript

  • Вам не нужен красивый суп, вот пример того, как их получить:

lista = browser.execute_script ("return [... document.querySelectorAll ('# Content td')]. map (s => s.innerText)")

Я ожидаю, что вы сократите время пополам, если вы делаете все это, и даже меньше, если вы переключаетесь на Puppeteer

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