硒下载整个html

时间:2018-10-08 06:19:52

标签: python selenium dom web-scraping pageloadstrategy

我一直在尝试使用硒来刮擦整个网页。我希望其中至少有一些是spa的,例如Angular,React,Vue,所以这就是我使用Selenium的原因。

我需要下载整个页面(如果由于未向下滚动而未从延迟加载中加载某些内容,则可以)。我尝试设置time.sleep()延迟,但这没有用。获取页面后,我希望对其进行哈希处理并将其存储在数据库中,以便以后进行比较,并检查内容是否已更改。当前,每次的哈希值都不相同,这是因为硒没有下载整个页面,每次丢失的部分量都不一样。我已经在几个网页上确认了这一点,而不仅仅是一个。

我大概还有1000多个网页需要手工浏览才能获得所有链接,所以我没有时间在其上查找元素来确保已加载。

此过程需要多长时间并不重要。如果要花1个小时以上,那么速度就不仅仅是精度而已。

如果您有其他想法,也请分享。

我的驱动程序声明

 from selenium import webdriver
 from selenium.common.exceptions import WebDriverException

 driverPath = '/usr/lib/chromium-browser/chromedriver'

 def create_web_driver():
     options = webdriver.ChromeOptions()
     options.add_argument('headless')

     # set the window size
     options.add_argument('window-size=1200x600')

     # try to initalize the driver
     try:
         driver = webdriver.Chrome(executable_path=driverPath, chrome_options=options)
     except WebDriverException:
         print("failed to start driver at path: " + driverPath)

     return driver

我的网址呼叫我的超时时间= 20

 driver.get(url)
 time.sleep(timeout)
 content = driver.page_source

 content = content.encode('utf-8')
 hashed_content = hashlib.sha512(content).hexdigest()

^每次都会在这里得到不同的哈希值,因为相同的网址不会产生相同的网页

2 个答案:

答案 0 :(得分:1)

在这种情况下,被测应用程序(AUT)基于 Angular React Vue 似乎是完美的选择。

现在,您可以使用 some content isn't loaded from lazy loading because of not scrolling 使用例变得可行。但是 ...do not have time to find an element on them to make sure it is loaded... 在所有可能的方式中都无法得到真正的补偿,因为time.sleep()具有某些缺点,因此可以诱使time.sleep()。您可以在How to sleep webdriver in python for milliseconds中找到详细的讨论。值得一提的是,HTML DOM的状态对于所有1000个奇数网页都是不同的。

解决方案

一些可行的解决方案:

如果实现 pageLoadStrategy ,则page_source方法将在相同的触发点触发,并且可能会看到相同的 hashed_content

答案 1 :(得分:0)

以我的经验,time.sleep()在动态加载时间上不能很好地工作。 如果页面是javascript繁重的页面,则必须使用WebDriverWait子句。

类似这样的东西:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get(url)

element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "[my-attribute='my-value']")))

使用所需的任何计时器更改10,将By.CSS_SELECTOR及其值更改为您想要用作lo的引用的任何类型

您还可以将WebDriverWait包裹在带有TimeoutException异常的Try / Except语句周围,如果要设置硬限制,可以从子模块selenium.common.exceptions获得该异常。

如果您确实希望它在页面加载之前进行永久检查,则可以将其设置在while循环内,因为我在文档中找不到有关“永久”等待的任何参考,但是您必须尝试一下它。