【问题标题】:Python selenium webdriver code performancePython selenium webdriver 代码性能
【发布时间】:2018-05-20 00:18:12
【问题描述】:

我正在使用 Python 中的 Selenium 抓取网页。我可以使用以下代码定位元素:

from selenium import webdriver
import codecs

driver = webdriver.Chrome()
driver.get("url")
results_table=driver.find_elements_by_xpath('//*[@id="content"]/table[1]/tbody/tr')

results_table 中的每个元素又是一组子元素,子元素的数量因元素而异。我的目标是将每个元素作为列表或分隔字符串输出到输出文件中。到目前为止我的代码是这样的:

results_file=codecs.open(path+"results.txt","w","cp1252")

for element in enumerate(results_table):
    element_fields=element.find_elements_by_xpath(".//*[text()][count(*)=0]")
    element_list=[field.text for field in element_fields]
    stuff_to_write='#'.join(element_list)+"\r\n"
    results_file.write(stuff_to_write)
    #print (i)
results_file.close()
driver.quit()

在大约 400 个元素的列表中,第二部分代码大约需要 2.5 分钟,每个元素大约有 10 个子元素。我得到了想要的输出,但是太慢了。我可以做些什么来提高性能?

使用 python 3.6

【问题讨论】:

  • 一次性下载整个页面,然后使用 BeautifulSoup 之类的工具进行处理。我有一段时间没有使用 splinter 或 selenium,但是在 splinter 中,.html 会给你页面。我不确定 selenium 的语法是什么,但应该有一种方法可以抓取整个页面。
  • 我正在使用 selenium,因为我需要在需要登录的网站上对页面进行剪贴,并且我希望避免为每个页面登录一次。 BeautifulSoup 是一个选项,但我不知道如何让它抓取活动的 chromedriver 页面。而且,在学习方面,我一定是在我的代码中做一些结构上的错误
  • @horace_vr 如果您在最后只写入文件一次,在 for 循环之后而不是在每次迭代中写入文件,它会加快速度吗?
  • Selenium(以及位于 Selenium 之上的 Splinter)对于随机访问网页内容的速度非常慢。看起来driver.page_source 可能会在 Selenium 中提供页面的全部内容,我在stackoverflow.com/questions/35486374/… 找到了这些内容。如果一次读取一个页面上的所有块会影响您的性能(而且很可能是这样),那么读取整个页面并离线处理会更快。
  • @Gary02127 BeautifulSoup 是要走的路;根据您的建议,我尝试了它,并替换了基于 webdriver 的处理代码,而不是 2 分钟,代码在几秒钟内执行。如果您详细说明并发布答案,我会接受。它肯定回答了我的 OP,虽然不是我在发布时想到的解决方案 :)

标签: python selenium-webdriver


【解决方案1】:

一次性下载整个页面,然后使用 BeautifulSoup 之类的工具进行处理。我有一段时间没有使用 splinter 或 selenium,但在 Splinter 中,.html 将为您提供页面。我不确定 Selenium 中的语法是什么,但应该有一种方法可以抓取整个页面。

Selenium(以及位于 Selenium 之上的 Splinter)对于随机访问网页内容的速度非常慢。看起来 .page_source 可能会在 Selenium 中提供页面的全部内容,我在 stackoverflow.com/questions/35486374/… 找到了这些内容。如果一次读取一个页面上的所有块会影响您的性能(并且可能确实如此),那么读取整个页面并离线处理它会更快。

【讨论】:

    猜你喜欢
    • 2021-07-03
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 2019-01-06
    • 2011-10-03
    • 2017-05-11
    • 1970-01-01
    相关资源
    最近更新 更多