【问题标题】:Screen scraping gotchas屏幕抓取问题
【发布时间】:2009-07-29 03:14:06
【问题描述】:

在进行屏幕抓取时,需要注意哪些“问题”?

这样做的灵感是:我配偶的同事让我从一个 Blogger 托管的博客中刮掉她患有癌症的朋友在最后几个月保留的所有页面,而这位女士想要保留所有帖子,以防万一博客曾经被删除。我最终找到了一个勉强够用的免费工具。

抓取许多 Blogger 页面的一个问题是,通常有一个导航菜单,您可以在其中单击三角形以按年或月展开帖子列表。这些小虫子创造了大量的重复内容,因为您会一遍又一遍地拥有相同的页面,并且菜单的不同组合被展开/折叠。在 Blogger 的情况下,我不确定这是可以避免的,因为链接都被格式化为真正的 http 链接,而不是明显的 JavaScript 调用。尽管如此,它还是让我思考:

如果你要抓取一个网站,你会补偿哪些潜在的不明显的东西?

【问题讨论】:

    标签: language-agnostic screen-scraping


    【解决方案1】:

    不要使用正则表达式来抓取

    虽然正则表达式可以很好地完成各种各样的任务,但我发现它在解析 HTML DOM 时通常不够用。 HTML 的问题在于您的文档结构非常多变,以至于很难准确(准确地说,我的意思是 100% 成功率且没有误报)提取标签。

    我建议您使用 DOM 解析器,例如 BeautifulSoup 或等效的(PHP 中的 SimpleHTMLDom)。

    有些人可能认为这有点矫枉过正,但最终,它会更容易维护,也允许更多的可扩展性。

    可以设计一个正则表达式来实现相同的目标,但会受到限制。例如,开发一个正则表达式来获取srcalt 标记将强制alt 属性位于src 之后或相反,克服此限制将增加正则表达式的复杂性。

    此外,请考虑以下事项。要使用正则表达式正确匹配 <img> 标记并仅获取 src 属性(在第 2 组中捕获),您需要以下正则表达式:

    <\s*?img\s+?[^>]*?\s*?src\s*?=\s*?(["'])((\\?+.)*?)\1[^>]*?>
    

    再一次,如果出现以下情况,上述操作可能会失败:

    • 属性或标签名称大写且未使用 i 修饰符。
    • src 属性周围不使用引号。
    • src 之后的另一个属性在其值的某处使用 > 字符。
    • 其他一些我没有预见到的原因。

    同样,不要使用正则表达式来解析 dom 文档。

    【讨论】:

      【解决方案2】:

      我经常擦屏。一些建议:

      1. 为您要使用的某些浏览器模拟User-Agent string。根据您的用户代理是什么,不同的网站经常返回非常不同的结果。如果他们不识别用户代理,他们通常会恢复到最低公分母,所以通常最好从一些最近的浏览器开始。 (例如,如果魔兽世界军械库认为你是最近的 Firefox,它会返回漂亮、易于解析的 XML。如果它不知道你是什么,它会发送糟糕的 HTML。
      2. 对您正在抓取的网站保持礼貌;不要打得太重。如果您使用多线程,您的抓取工具会运行得更快,一次发出许多请求,但这会惹恼网站所有者。
      3. 在错误处理方面要聪明。不要写像 while (1) { makeRequest(); 这样的代码。 }。如果您的代码或服务器抛出错误,这样的循环将立即获取另一个请求,从而产生另一个错误。它会很快变丑。妥善处理错误,如果发现大量错误,请考虑进入休眠或退出。
      4. 在开发解析代码时,针对缓存版本进行测试,而不是每次都访问服务器。将使您的开发速度更快,并且是简单测试套件的基础。

      【讨论】:

        【解决方案3】:

        首先,我会检查 RSS 提要。如果我没记错的话,在博客上,您只需将/rss 添加到根网址即可。

        然后我会检查是否已经有一些工具可以抓取博主。

        如果没有 RSS 提要,也没有现成的工具,我会放弃并手动复制/粘贴。除非我们说的是 5000 页,否则这样会更快、更容易。从尝试过的人那里拿走。

        如果你有权限访问实际账号,博主有导出功能。

        edit:当然,你也可以试试机械土耳其人。

        【讨论】:

          【解决方案4】:

          就问题而言..限制在特定时间段内发出的请求数量通常是个好主意。在短时间内用大量请求粉碎一个网站是拒绝您的请求的好方法。

          【讨论】:

            【解决方案5】:

            除了技术方面的考虑之外,请确保您不会将自己置于法律风险之中。大多数大型网站在其使用条款中都有特定的法律语言,不允许通过自动化计算机程序以编程方式访问其服务,而且还有明显的版权问题。

            从技术角度来看,一定要使用 DOM 解析器库,这样可以节省大量时间。许多提供将 HTML 读入 XML 结构的能力,可以使用 XPath 进行查询以准确找到所需的内容。

            【讨论】:

              【解决方案6】:

              如果您认识可以访问该帐户的人,他们可以使用Blogger's export "Export blog" feature

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-02-20
                • 1970-01-01
                • 1970-01-01
                • 2019-01-17
                相关资源
                最近更新 更多