我一直在尝试使用硒来刮擦整个网页。我希望其中至少有一些是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()
^每次都会在这里得到不同的哈希值,因为相同的网址不会产生相同的网页
答案 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个奇数网页都是不同的。
一些可行的解决方案:
一种可能的解决方案是诱使 WebDriverWait 并确保按照讨论How can I make sure if some HTML elements are loaded for Selenium + Python?的要求来加载某些HTML元素,从而验证至少以下一项:
另一种解决方案是调整功能 pageLoadStrategy 。您可以将所有1000个奇数网页的 pageLoadStrategy 设置为公共点,并为其分配值:
normal
(整页加载)eager
(交互式)none
您可以在How to make Selenium not wait till full page load, which has a slow script?
如果实现 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循环内,因为我在文档中找不到有关“永久”等待的任何参考,但是您必须尝试一下它。