【发布时间】: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,虽然不是我在发布时想到的解决方案 :)