Selenium WebDriver将WebElement数据附加到列表非常慢

时间:2017-10-17 20:18:56

标签: python selenium selenium-webdriver web-scraping

我正在尝试将webelement内容存储到python列表中。虽然它有效,但需要大约15分钟来处理~2,000行。

# Grab webelements via xpath
rowt = driver.find_elements_by_xpath("//tbody[@class='table-body']/tr/th[@class='listing-title']")
rowl = driver.find_elements_by_xpath("//tbody[@class='table-body']/tr/td[@class='listing-location']")
rowli = driver.find_elements_by_xpath("//tbody[@class='table-body']/tr/th/a")

title = []
location = []
link = []

# Add webElement strings to lists
print('Compiling list...')
[title.append(i.text) for i in rowt]
[location.append(i.text) for i in rowl]
[link.append(i.get_attribute('href')) for i in rowli]

有更快的方法吗?

4 个答案:

答案 0 :(得分:0)

建议(如果没有帮助,道歉):

  1. 我认为Pandas可以直接用于加载HTML表。如果你的目的是刮掉一张桌子,那么像Bs4这样的图书馆也可能会派上用场。
  2. 您可以存储整个HTML并使用Regex对其进行解析,因为您提取的所有数据都将包含在固定的HTML标记集中。

答案 1 :(得分:0)

您的解决方案是通过表格解析三次,一次针对标题,一次针对位置,一次针对链接。

尝试仅解析一次表格。拥有行的选择器,然后遍历行,并且对于每一行,使用相对路径提取3个元素,例如,对于链接,它看起来像这样:

link.append(row.find_elements_by_xpath("./th/a").get_attribute('href'))

答案 2 :(得分:0)

根据您尝试执行的操作,如果呈现该页面的服务器具有API,则使用该服务器检索数据可能会快得多,而不是从内容中抓取内容。页。

您可以使用浏览器工具查看发送到服务器的不同请求,并且可能以JSON格式返回数据,您可以轻松地从中检索数据。

当然,这假设您对数据感兴趣,而不是直接验证页面内容。

答案 3 :(得分:0)

我想最慢的是[location.append(i.text) for i in rowl]
当您致电i.text时,Selenium需要确定该元素中将显示的内容,因此需要更多时间来处理。
您可以改为使用变通方法i.get_attribute('innerText')

[location.append(i.get_attribbute('innerText')) for i in rowl]

但是,我不能保证结果是一样的。 (它应与.Text)相同或相似。

我已经在我的机器上测试了这个〜2000行,i.text耗时80秒。虽然i.get_attribute('innerText')花了28秒。