Ускорение кода - PullRequest
       27

Ускорение кода

0 голосов
/ 20 сентября 2019

Я счищаю продукты с веб-страницы, используя Selenium (хром).Некоторые продукты содержат таблицу питания, некоторые нет.Я сделал блок try/except, чтобы найти элемент, или продолжаю, если это не так.Селену требуется + -100 секунд, чтобы разобраться с тем фактом, что элемент не найден.Можно ли как-нибудь ускорить этот процесс?

P_LIST = []                                                                                             

for i in yum:                                                                                           
    start_time = time.time()                                                                            
    NEW_DICT = {}                                                                                       
    TITLE = ""                                                                                          
    i = "".join(i)                                                                                      
    driver.get(i)                                                                                       
    TITLE = driver.find_element_by_xpath('//*[@id="app"]/main').get_attribute('title')                  
    NEW_DICT["url"] = i                                                                                 
    NEW_DICT["name"] = TITLE                                                                            
    print("Found URL and NAME in: " + str((time.time() - start_time)) + " seconds. Proceeding..")       

    ##############################################################################################      

    start_time = time.time()                                                                            
    try:                                                                                                
        x = driver.find_element_by_class_name('product-info-content-block')                             
        x = x.find_element_by_tag_name('p').text                                                        
        NEW_DICT["weight/amount"] = x                                                                   
    except NoSuchElementException:                                                                      
        print('no weight/amount found.')                                                                
    print("Found WEIGHT/amount in: " + str((time.time() - start_time)) + " seconds. Proceeding..")      

    ##############################################################################################      

    start_time = time.time()                                                                            
    try:                                                                                                
        NUTRITION_TABLE = driver.find_element_by_class_name('product-info-nutritions__table')           
        ENERGY = NUTRITION_TABLE.find_elements_by_tag_name('tr')                                        
        for i in ENERGY:                                                                                
            A = i.find_elements_by_tag_name('td')                                                       
            UNIT = A[0].text                                                                            
            VALUE = A[1].text                                                                           
            NEW_DICT[UNIT] = VALUE                                                                      
    except NoSuchElementException:                                                                      
        print('No nutrition table found.')                                                              
    print("Found (NO) NUT TABLE in: " + str((time.time() - start_time)) + " seconds. Proceeding..")     

    P_LIST.append(NEW_DICT)                                                                             
    print(NEW_DICT)                                                                                     


print(P_LIST)  

Вывод:


Found URL and NAME in: 1.0494945049285889 seconds. Proceeding..

Found WEIGHT/amount in: 0.3859684467315674 seconds. Proceeding..

No nutrition table found.
Found (NO) NUT TABLE in: 100.06239700317383 seconds. Proceeding..

Заранее спасибо.Я учусь.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

Самый быстрый способ сделать это из javascript (непроверенный):

mydict = driver.execute_script("""return [...document.querySelectorAll('product-info-nutritions__table tr')].reduce((map, tr) => {
    map[tr.cells[0].innerText] = tr.cells[1].innerText
    return map
}, {})""")

в противном случае он должен совершить множество обращений к браузеру и обратно и обернуть все с помощью классов Element

0 голосов
/ 20 сентября 2019

Я хотел бы предложить использовать WebDriverWait для аналогичных целей.

Вот пример:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec

driver = webdriver.Chrome()

driver.get("http://url")
driver.maximize_window()

# wait for element to appear, then hover it
wait = WebDriverWait(driver, 10)
men_menu = wait.until(ec.visibility_of_element_located((By.XPATH, "//a[@data-tracking-id='men']")))
ActionChains(driver).move_to_element(men_menu).perform()

# wait for Fastrack menu item to appear, then click it
fastrack = WebDriverWait(driver, 10).until(ec.visibility_of_element_located((By.XPATH, "//a[@data-tracking-id='0_Fastrack']")));
fastrack.click()
...