如何加速python selenium find_elements?

时间:2016-03-02 09:41:17

标签: python selenium web-scraping

我正试图从kompass.com上抓取公司信息

但是,由于每个公司资料提供不同数量的详细信息,因此某些页面可能缺少元素。例如,并非所有公司都有关于'协会的信息。在这种情况下,我的脚本需要非常长时间搜索这些缺少的元素。无论如何我可以加快搜索过程吗?

这是我的剧本的摘录:

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页要刮。

2 个答案:

答案 0 :(得分:4)

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 :(得分:1)

由于您的XPath没有使用除class和id之外的任何属性来查找元素,因此您可以将搜索迁移到CSS选择器。对于像IE这样不支持本机XPath搜索的浏览器,这些可能会更快。

例如:

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

可以成为:

body .item .minHeight > #associations > div > ul > li > strong
相关问题