我一直在尝试使用 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
我的 url 调用 我的超时 = 20
driver.get(url)
time.sleep(timeout)
content = driver.page_source
content = content.encode('utf-8')
hashed_content = hashlib.sha512(content).hexdigest()
^ 每次都在这里得到不同的哈希值,因为相同的 url 不会产生相同的网页
最佳答案
由于被测应用程序 (AUT) 基于 Angular、React、Vue 在这种情况下Selenium 似乎是完美的选择。
现在,由于您对 某些内容由于不滚动而未从延迟加载中加载
的事实感到满意,因此 用例可行的。但是在所有可能的方式中 ...没有时间在它们上面找到一个元素以确保它被加载...
不能真正补偿诱导 time.sleep()
因为 time.sleep()
有一些缺点。您可以在 How to sleep webdriver in python for milliseconds 中找到详细的讨论。 .值得一提的是 HTML DOM 的状态所有 1000 个奇数网页都会不同。
解决方案
几个可行的解决方案:
一个潜在的解决方案可能是引发 WebDriverWait 并确保根据讨论加载一些 HTML 元素 How can I make sure if some HTML elements are loaded for Selenium + Python?至少验证以下任何一项:
- 页面标题
- 页面标题
另一种解决方案是调整功能 pageLoadStrategy。您可以将所有 1000 个奇数网页的 pageLoadStrategy 设置为公共(public)点并分配一个值:
正常
(整页加载)eager
(交互式)无
您可以在 How to make Selenium not wait till full page load, which has a slow script? 中找到详细的讨论。
如果您实现 pageLoadStrategy,page_source
方法将在相同的触发点触发,您可能会看到相同的 hashed_content。
关于python - Selenium 下载整个 html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52696433/