屏幕刮板如何工作?

时间:2020-03-06 14:57:34  来源:igfitidea点击:

我听到人们一直在写这些程序,我知道他们在做什么,但是他们实际上是怎么做的呢?我在寻找一般概念。

解决方案

屏幕抓取器下载html页面,然后通过搜索已知标记或者将其解析为XML或者类似的标记来提取感兴趣的数据。

从技术上讲,屏幕抓取是任何可以获取另一个程序的显示数据并将其摄取以供自己使用的程序。

截屏通常是指一个Web客户端,它解析目标网站的HTML页面以提取格式化的数据。当网站不提供RSS提要或者REST API来以编程方式访问数据时,便可以执行此操作。

用于该目的的库的一个示例是Ruby的Hpricot,它是用于屏幕抓取的结构更好的HTML解析器之一。

我们有一个HTML页面,其中包含所需的一些数据。我们要做的是编写一个程序,该程序将获取该网页并尝试提取该数据。这可以通过XML解析器完成,但是对于简单的应用程序,我更喜欢使用正则表达式来匹配HTML中的特定位置并提取必要的数据。但是,有时创建一个好的正则表达式可能很棘手,因为周围的HTML在文档中出现了多次。我们始终希望将一个唯一的项目与我们需要的数据尽可能地匹配。

通常,屏幕抓取器是一种程序,它通过使用浏览器或者终端访问程序模仿坐在工作站前面的人的动作来捕获服务器程序的输出。在某些关键点,程序将解释输出,然后采取措施或者从输出中提取一定数量的信息。

最初,这是通过大型机的字符/终端输出完成的,用于提取数据或者更新陈旧的或者最终用户无法直接访问的系统。用现代术语来说,通常意味着解析HTTP请求的输出以提取数据或者采取其他措施。随着Web服务的到来,这类事情本应消失,但并不是所有的应用程序都提供了一个很好的与之交互的API。

在PC的早期,屏幕抓取器会模拟一个终端(例如IBM 3270)并假装成为用户,以便交互式地提取,更新大型机上的信息。在最近的时间里,该概念被应用于通过网页提供界面的任何应用程序。

随着SOA的出现,屏幕抓屏是一种方便的方法,通过这种方法,服务可以启用那些并非如此的应用程序。在这些情况下,网页抓取是最常用的方法。

这里有很多准确的答案。

没有人说的是不要这样做!

当没有人为我们提供合理的机器可读界面时,我们就会执行屏幕抓取操作。很难写,而且很脆。

例如,考虑一个RSS聚合器,然后考虑通过正常的面向人的博客界面来获取相同信息的代码。当博客决定更改其布局时,哪一个会中断?

当然,有时我们别无选择:(

这是使用jQuery在Javascript中实现的一小部分屏幕抓取(请注意,这不是一个常见的选择,因为抓取通常是客户端-服务器活动):

//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的出现,屏幕抓屏是一种方便的方法,通过这种方法,服务可以启用那些并非如此的应用程序。在这些情况下,网页抓取是最常用的方法。

截屏通常是指一个Web客户端,它解析目标网站的HTML页面以提取格式化的数据。当网站不提供RSS提要或者REST API来以编程方式访问数据时,便可以执行此操作。

通常,我们有一个HTML页面,其中包含所需的一些数据。我们要做的是编写一个程序,该程序将获取该网页并尝试提取该数据。这可以通过XML解析器完成,但是对于简单的应用程序,我更喜欢使用正则表达式来匹配HTML中的特定位置并提取必要的数据。但是,有时创建一个好的正则表达式可能很棘手,因为周围的HTML在文档中出现了多次。我们始终希望将一个唯一的项目与我们需要的数据尽可能地匹配。

当没有人为我们提供合理的机器可读界面时,我们就会执行屏幕抓取操作。很难写,而且很脆。

例如,考虑一个RSS聚合器,然后考虑通过正常的面向人的博客界面来获取相同信息的代码。当博客决定更改其布局时,哪个中断。

用于该目的的库的一个示例是Ruby的Hpricot,它是用于屏幕抓取的结构更好的HTML解析器之一。

Screen scraping is what you do when nobody's provided you with a reasonable machine-readable interface. It's hard to write, and brittle.

不太正确。当我说大多数开发人员没有足够的经验来编写体面的API时,我认为我并不夸张。我曾与屏幕抓取公司合作,并且API经常出现问题(从隐秘错误到不良结果),并且通常不提供网站提供的完整功能,因此最好进行屏幕抓取(如果我们是网络抓取者,将要)。与API客户端相比,Extranet /网站门户被更多的客户/经纪人使用,因此得到了更好的支持。在大公司中,很少更改Extranet门户等。这通常是因为它最初是外包的,而现在只是维护了。我指的是量身定制输出的屏幕抓取功能,例如特定路线和时间的航班,保险报价,运输报价等。

就此而言,将Web页内容拉入字符串并使用一系列正则表达式提取所需信息就像Web客户端一样简单。

string pageContents = new WebClient("www.stackoverflow.com").DownloadString();
int numberOfPosts = // regex match

显然,在大规模环境中,我们将比上述代码编写更健壮的代码。

A screen scraper downloads the html
  page, and pulls out the data
  interested either by searching for
  known tokens or parsing it as XML or
  some such.

从理论上说,这是比正则表达式更干净的方法。但是,实际上,它并不是那么容易,因为大多数文档在使用XPath之前都需要标准化为XHTML,最后,我们发现微调的正则表达式是比较实用。