我对网络抓取/爬虫相对较新,并且想知道如果在获取的网页中不再找到已解析的 DOM 元素的两个问题:
1- 有没有一种巧妙的方法来检测页面是否已更改?我读到可以存储和比较哈希值,但我不确定它有多有效。
2-万一在获取的网页中找不到已解析的元素,如果我们假设我们知道相同的 DOM 元素仍然存在于 DOM 树中不同位置的某个位置,是否有一种方法可以以某种方式遍历该元素高效 DOM 树而无需遍历其所有节点?
我正在尝试了解经验丰富的开发人员如何处理这两个问题,并且希望获得有关如何管理它们的见解/提示/策略。
提前谢谢您。
最佳答案
我没有在你的标签列表中看到这个,所以我想我应该先提一下这个:一个名为 BeautifulSoup 的工具。 ,专为网页抓取而设计。
网络抓取是一个困惑的过程。除非有一些长期存在的规律性或与网站有直接关系,否则您不能真正依赖网页中保持静态的任何内容 - 当您扩展到数百万个网页时当然不能。
考虑到这一点:
- 没有一劳永逸的解决方案。一些想法:
- 使用 RSS(如果有)。
- 将您的抓取内容分为粗略类别,其中某些类别具有隐含或明确的时间戳(例如:新闻网站),您可以使用它来触发更新。
- 您已经提到过这一点,但散列效果非常好,并且在存储方面相对便宜。这里的另一个想法是不散列整个页面,而只散列动态或感兴趣的元素。
- 获取 HEAD(如果可用)。
- 下载并存储文件的先前版本和当前版本,然后使用 diff 等实用程序。
- 使用第三方服务检测更改并在您端触发“刷新”。
显然,上述每种方法在处理、存储和内存要求方面都有其优缺点。
- 从 BeautifulSoup 4.x 版本开始,您可以使用不同的 HTML 解析器,即 lxml ,这应该允许您使用 XPath。这肯定比手动循环遍历整棵树更有效率。
另一种选择(可能更有效)是使用 CSS 选择器。后者更加灵活,因为它不依赖于同一位置的内容;当然,这假设您感兴趣的内容保留了 CSS 属性。
希望这有帮助!
关于python - 网页抓取 : finding element after a DOM Tree change,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42562881/