Web 抓取:在 DOM 树更改后查找元素

Web scraping: finding element after a DOM Tree change

我对 Web scraping/crawlers 比较陌生,并且想知道在获取的网页中不再找到已解析的 DOM 元素的情况下的 2 个问题:

1- 是否有一种巧妙的方法来检测页面是否已更改?我读到可以存储和比较哈希,但我不确定它的效果如何。

2- 如果在获取的网页中找不到已解析的元素,假设我们知道相同的 DOM 元素仍然存在于不同的 DOM 树中的某处位置,有没有办法以某种方式有效地遍历 DOM 树而不必遍历它的所有节点?

我正在尝试了解有经验的开发人员如何处理这两个问题,并希望 insights/hints/strategies 了解如何管理它们。

提前致谢。

我在你的标签列表中没有看到这个,所以我想我会先提到这个:一个名为 BeautifulSoup 的工具,专为网络抓取而设计。

网络抓取是一个混乱的过程。除非存在某种长期存在的规律性或与网站的直接关系,否则您不能真正依赖网页中保持静态的任何内容 - 当您扩展到数百万个网页时当然不能。

考虑到这一点:

  1. 没有万能的解决方案。一些想法:
    • 如果可用,请使用 RSS。
    • 将您的抓取分成粗略的类别,其中某些类别具有隐含或明确的时间戳(例如:新闻网站),您可以使用它们来触发您的更新。
    • 您已经提到了这一点,但散列法工作得很好并且在存储方面相对便宜。这里的另一个想法是不散列整个页面,而是只散列动态或感兴趣的元素。
    • 获取 HEAD(如果可用)。
    • 下载并存储以前和当前版本的文件,然后使用像 diff 这样的实用程序。
    • 使用第 3 方服务检测更改并在您这边触发 "refresh"。

显然,以上各项在处理、存储和内存要求方面各有利弊。

  1. 从 BeautifulSoup 的版本 4.x 开始,您可以使用不同的 HTML 解析器,即 lxml,它应该允许您使用 XPath。这肯定比在循环中手动遍历整个树更有效。

或者(可能更有效)使用 CSS 选择器。后者更灵活,因为它不依赖于同一位置的内容;当然,这是假设您感兴趣的内容保留了 CSS 属性。

希望对您有所帮助!