4

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

我需要下载整个页面(如果某些内容由于没有向下滚动而没有从延迟加载中加载,那很好)。我尝试设置 time.sleep() 延迟,但没有奏效。获得页面后,我希望对其进行哈希处理并将其存储在数据库中以供稍后比较并检查内容是否已更改。目前哈希每次都不同,这是因为 selenium 没有下载整个页面,每次都会丢失不同的部分数量。我已经在几个网页上证实了这一点,而不仅仅是一个单一的网页。

我可能还有 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()

^ 每次在此处获取不同的哈希值,因为相同的 url 不会产生相同的网页

4

2 回答 2

1

以我的经验 time.sleep() 不适用于动态加载时间。如果页面是 javascript-heavy 你必须使用 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 包装在带有异常的 Try/Except 语句中,如果您想设置硬限制TimeoutException,您可以从子模块中获取该异常。selenium.common.exceptions

如果您真的希望它在页面加载之前一直检查,您可以将它设置在 while 循环中,因为我在文档中找不到任何关于等待“永远”的参考,但您必须尝试它。

于 2018-10-08T06:31:40.977 回答
1

由于被测应用程序(AUT)基于AngularReactVue在这种情况下Selenium似乎是完美的选择。

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中找到详细讨论。值得一提的是,对于所有 1000 多个网页, HTML DOM的状态都是不同的。

解决方案

几个可行的解决方案:

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

于 2018-10-08T07:05:27.223 回答