python - 网页抓取 : finding element after a DOM Tree change

标签 python parsing web-scraping web-crawler dom-traversal

我对网络抓取/爬虫相对较新,并且想知道如果在获取的网页中不再找到已解析的 DOM 元素的两个问题:

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

2-万一在获取的网页中找不到已解析的元素,如果我们假设我们知道相同的 DOM 元素仍然存在于 DOM 树中不同位置的某个位置,是否有一种方法可以以某种方式遍历该元素高效 DOM 树而无需遍历其所有节点?

我正在尝试了解经验丰富的开发人员如何处理这两个问题,并且希望获得有关如何管理它们的见解/提示/策略。

提前谢谢您。

最佳答案

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

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

考虑到这一点:

  1. 没有一劳永逸的解决方案。一些想法:
    • 使用 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/

    相关文章:

    python - 用 python 制作一个(希望简单的)wiki 解析器

    python - 美汤-查找 child 标签属性内容

    web-scraping - Issuu 从嵌入的 iframe 的 configId 中获取 documentId

    python - 单击登录按钮后 Ebay 网站挂起 - Selenium Python

    c++ - GPL如何影响存储在用户数据中的宏?

    python - 如何根据数据框列值将目录中的图像组织成类?

    python - Plotly 中的条件格式

    python - 如何在sqlite中从此循环插入数据

    parsing - 是否可以为此语法编写递归下降解析器?

    perl - 解析逻辑表达式并将其转换为 Perl 中的树