2016-03-02 86 views
0

我試圖從kompass.com上刮掉公司信息如何加快python selenium find_elements?

但是,由於每個公司配置文件提供不同數量的詳細信息,某些頁面可能缺少元素。例如,並非所有公司都有關於「協會」的信息。在這種情況下,我的腳本需要很長的時間來搜索這些缺失的元素。無論如何,我可以加快搜索過程嗎?

這裏是我的腳本摘錄:

import time 
import selenium 
from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import TimeoutException 
from selenium.common.exceptions import ElementNotVisibleException 
from lxml import html 

def init_driver(): 
    driver = webdriver.Firefox() 
    driver.wait = WebDriverWait(driver, 5) 
    return driver 

def convert2text(webElement): 
    if webElement != []: 
     webElement = webElement[0].text.encode('utf8') 
    else: 
     webElement = ['NA'] 
    return webElement 

link='http://sg.kompass.com/c/mizkan-asia-pacific-pte-ltd/sg050477/' 
driver = init_driver() 
driver.get(link) 
driver.implicitly_wait(10) 

name = driver.find_elements_by_xpath("//*[@id='productDetailUpdateable']/div[1]/div[2]/div/h1") 
name = convert2text(name) 

## Problem: 
associations = driver.find_elements_by_xpath("//body//div[@class='item minHeight']/div[@id='associations']/div/ul/li/strong") 
associations = convert2text(associations) 

這需要超過一分鐘刮每一頁,我有超過26,000頁湊。

+0

你'WebDriverWait'進口,但儘管這一事實使用'implicitly_wait()'...爲什麼? – Andersson

回答

1

driver.implicitly_wait(10)告訴司機要等待長達10秒的元素在DOM存在。這意味着每次您查找不存在的元素時,都會等待10秒鐘。將時間縮短到2-3秒將提高運行時間。

另外,xpathslowest selector,你通過給絕對路徑使它值得。你可以使用find_elements_by_idfind_elements_by_class_name。例如,你可以improve

driver.find_elements_by_xpath("//body//div[@class='item minHeight']/div[@id='associations']/div/ul/li/strong") 

只需通過與associations ID

driver.find_elements_by_xpath("//*div[@id='associations']/div/ul/li/strong") 

陳述或者將其更改爲css_selector

driver.find_elements_by_css_selector("#associations > div > ul > li > strong") 
1

由於您的XPath不使用class和id以外的任何屬性來查找元素,因此您可以將搜索遷移到CSS選擇器。在不支持本機XPath搜索的IE瀏覽器中,這些可能會更快。

例如:

//body//div[@class='item minHeight']/div[@id='associations']/div/ul/li/strong 

能成爲:

body .item .minHeight > #associations > div > ul > li > strong 
+0

在提供的代碼OP中使用Firefox的webdriver,所以它不會解決問題... – Andersson

+0

似乎沒有幫助。需要花費相同的時間來搜索缺失的元素 –

+0

@SeamusLam可以簡化一些XPath嗎? // // body // div [@ class ='item minHeight']/div [@ id ='associations']/div/ul/li/strong'當然不需要初始'// // // // div []'部分,如果下面的div有一個唯一的標識符。 –

相關問題