我一直听到人们在编写这些程序,我知道他们在做什么,但他们实际上是如何做到的呢?我正在寻找一般概念。
9 回答
从技术上讲,屏幕抓取是抓取另一个程序的显示数据并将其摄取以供自己使用的任何程序。
很多时候,屏幕截图是指解析目标网站的 HTML 页面以提取格式化数据的 Web 客户端。当网站不提供用于以编程方式访问数据的 RSS 提要或 REST API 时,就会执行此操作。
用于此目的的库的一个示例是Hpricot for Ruby,它是用于屏幕抓取的架构更好的 HTML 解析器之一。
这里有很多准确的答案。
没有人说不要做!
当没有人为您提供合理的机器可读界面时,您会执行屏幕抓取。很难写,也很脆弱。
例如,考虑一个 RSS 聚合器,然后考虑通过正常的面向人的博客界面获取相同信息的代码。当博主决定更改其布局时,哪一个会中断?
当然,有时你别无选择:(
一般来说,屏幕抓取工具是一个程序,它通过使用浏览器或终端访问程序模仿坐在工作站前面的人的动作来捕获服务器程序的输出。在某些关键点,程序会解释输出,然后采取行动或从输出中提取一定数量的信息。
最初,这是通过大型机的字符/终端输出来完成的,用于提取数据或更新最终用户无法直接访问的过时或无法直接访问的系统。用现代术语来说,它通常意味着解析 HTTP 请求的输出以提取数据或采取其他操作。随着网络服务的出现,这种事情应该已经消失了,但并不是所有的应用程序都提供了一个很好的 api 来与之交互。
屏幕抓取器下载 html 页面,并通过搜索已知标记或将其解析为 XML 或类似的方式提取感兴趣的数据。
您有一个 HTML 页面,其中包含一些您想要的数据。您所做的是编写一个程序来获取该网页并尝试提取该数据。这可以通过 XML 解析器完成,但对于简单的应用程序,我更喜欢使用正则表达式来匹配 HTML 中的特定位置并提取必要的数据。但是,有时创建一个好的正则表达式可能会很棘手,因为周围的 HTML 在文档中出现了多次。您总是希望将一个独特的项目尽可能地与您需要的数据相匹配。
在 PC 的早期,屏幕抓取工具会模拟终端(例如 IBM 3270)并假装是用户,以便交互式地提取、更新大型机上的信息。最近,该概念适用于通过网页提供界面的任何应用程序。
随着 SOA 的出现,屏幕抓取是一种方便的方式,通过它可以让服务支持不支持的应用程序。在这些情况下,网页抓取是更常用的方法。
这是在Javascript中使用 jQuery实现的一小部分屏幕抓取(请注意,这不是常见的选择,因为抓取通常是客户端-服务器活动):
//Show My SO Reputation Score
var repval = $('span.reputation-score:first'); alert('StackOverflow User "' + repval.prev().attr('href').split('/').pop() + '" has (' + repval.html() + ') Reputation Points.');
如果您运行Firebug,请复制上面的代码并将其粘贴到控制台中,并在此问题页面上查看它的实际效果。
如果 SO 更改了 DOM 结构/元素类名称/URI 路径约定,那么所有的赌注都将被取消,它可能不再起作用 - 这是屏幕抓取工作中的常见风险,各方之间没有合同/理解(抓取工具和抓取工具) [是的,我刚刚发明了一个词])。
从技术上讲,屏幕抓取是抓取另一个程序的显示数据并将其摄取以供自己使用的任何程序。在 PC 的早期,屏幕抓取器将模拟终端(例如 IBM 3270)并假装是用户以交互提取、更新主机信息。最近,该概念适用于通过网页提供界面的任何应用程序。
随着 SOA 的出现,屏幕抓取是一种方便的方式,通过它可以让服务支持不支持的应用程序。在这些情况下,网页抓取是更常用的方法。
很多时候,屏幕截图是指解析目标网站的 HTML 页面以提取格式化数据的 Web 客户端。当网站不提供用于以编程方式访问数据的 RSS 提要或 REST API 时,就会执行此操作。
通常,您有一个 HTML 页面,其中包含一些您想要的数据。您所做的是编写一个程序来获取该网页并尝试提取该数据。这可以通过 XML 解析器完成,但对于简单的应用程序,我更喜欢使用正则表达式来匹配 HTML 中的特定位置并提取必要的数据。但是,有时创建一个好的正则表达式可能会很棘手,因为周围的 HTML 在文档中出现了多次。您总是希望将一个独特的项目尽可能地与您需要的数据相匹配。
当没有人为您提供合理的机器可读界面时,您会执行屏幕抓取。很难写,也很脆弱。
例如,考虑一个 RSS 聚合器,然后考虑通过正常的面向人的博客界面获取相同信息的代码。当博主决定更改其布局时,哪一个会中断。
用于此目的的库的一个示例是 Hpricot for Ruby,它是用于屏幕抓取的架构更好的 HTML 解析器之一。
当没有人为您提供合理的机器可读界面时,您会执行屏幕抓取。很难写,也很脆弱。
不完全正确。当我说大多数开发人员没有足够的经验来编写像样的 API 时,我认为我并没有夸大其词。我曾与屏幕抓取公司合作过,API 经常出现问题(从隐秘的错误到糟糕的结果),并且通常没有提供网站提供的全部功能,因此屏幕抓取可能会更好(如果你将要)。与 API 客户端相比,我使用外联网/网站门户的客户/经纪人更多,因此得到了更好的支持。在大公司中,很少更改外联网门户等。通常是因为它最初是外包的,现在只是维护。我更多地指的是屏幕抓取,其中输出是定制的,例如特定路线和时间的航班、保险报价、运输报价等。
就做而言,它可以像 web 客户端一样简单,将页面内容拉成一个字符串,并使用一系列正则表达式来提取你想要的信息。
string pageContents = new WebClient("www.stackoverflow.com").DownloadString();
int numberOfPosts = // regex match
显然,在大规模环境中,您将编写比上述更健壮的代码。
屏幕抓取器下载 html 页面,并通过搜索已知标记或将其解析为 XML 或类似的方式提取感兴趣的数据。
这比正则表达式更简洁……理论上……,但实际上它并不那么容易,因为大多数文档都需要规范化为 XHTML,然后才能通过 XPath,最后我们发现经过微调的正则表达式是更实用。