如何加速Python Selenium的find_elements函数?

3
我正在尝试从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页需要抓取。


你已经导入了 WebDriverWait,但是为什么还要使用 implicitly_wait() - Andersson
2个回答

6

driver.implicitly_wait(10)会告诉驱动程序在DOM中等待最多10秒钟以使元素存在。这意味着每次您寻找不存在的元素时,它都会等待10秒钟。将时间缩短到2-3秒将改善运行时间。

此外,xpath最慢的选择器,而且你还通过提供绝对路径让它更加缓慢。在可以使用find_elements_by_idfind_elements_by_class_name的情况下,请使用它们。例如,您可以改进

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

由于您的XPaths没有使用除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

似乎没有帮助。搜索缺失元素需要相同的时间。 - Seamus Lam
@SeamusLam,你能简化一下你的 XPath 吗?如果接下来的 div 有唯一的标识符,那么 //body//div[@class='item minHeight']/div[@id='associations']/div/ul/li/strong 这个 XPath 肯定不需要初始的 //body//div[] 部分。 - Ben C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接