我一直在尝试使用硒来刮擦整个网页.我希望它们中至少有一小部分是水疗中心,如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()
^每次得到不同的哈希,因为相同的网址不生成相同的网页
最佳答案 由于受测试的应用程序(AUT)基于Angular,React,Vue,在这种情况下Selenium似乎是完美的选择.
现在,因为你没有从延迟加载加载某些内容这一事实,因为没有滚动使得用例可行.但是在所有可能的方面……没有时间在它们上面找到一个元素以确保它被加载…无法真正补偿导致time.sleep(),因为time.sleep()有一定的缺点.您可以在How to sleep webdriver in python for milliseconds中找到详细的讨论.值得一提的是,对于所有1000多个网页,HTML DOM的状态将有所不同.
解
一些可行的解决方案:
>一个可靠的解决方案可能是诱导WebDriverWait并确保根据讨论How can I make sure if some HTML elements are loaded for Selenium + Python?加载一些HTML元素,至少验证以下任一项:
>页面标题
>页面标题
>另一个解决方案是调整功能pageLoadStrategy.您可以将所有1000个奇数网页的pageLoadStrategy设置为公共点,分配值:
>正常(整页加载)
>渴望(互动)
>没有
>您可以在How to make Selenium not wait till full page load, which has a slow script?找到详细的讨论
如果你实现了pageLoadStrategy,那么page_source方法将在同一个跳转点被触发,你可能会看到相同的hashed_content.