屏幕刮刀如何工作?

时间:2008-10-01 03:10:55

标签: screen-scraping web-scraping html-content-extraction pdf-scraping console-scraping

我听说人们一直在写这些节目,我知道他们做了什么,但他们是如何做到的呢?我正在寻找一般概念。

9 个答案:

答案 0 :(得分:24)

从技术上讲,screenscraping是抓取另一个程序的显示数据并摄取它自己使用的任何程序。

屏幕分组通常指的是一个Web客户端,它解析目标网站的HTML页面以提取格式化数据。当网站不提供RSS源或REST API以便以编程方式访问数据时,就可以完成此操作。

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

答案 1 :(得分:14)

这里有很多准确的答案。

没人说的是不要这样做!

当没有人为您提供合理的机器可读界面时,屏幕抓取就是您所做的。这很难写,而且很脆弱。

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

当然,有时你别无选择:(

答案 2 :(得分:7)

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

最初这是通过大型机的字符/终端输出来完成的,用于提取数据或更新最终用户过时或不能直接访问的系统。在现代术语中,它通常意味着解析HTTP请求的输出以提取数据或采取其他一些操作。随着Web服务的出现,这种事情应该已经消失,但并非所有的应用程序都能提供良好的api来与之交互。

答案 3 :(得分:2)

屏幕抓取工具下载html页面,并通过搜索已知令牌或将其解析为XML或其他类似内容来提取感兴趣的数据。

答案 4 :(得分:2)

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

答案 5 :(得分:2)

在PC的早期阶段,屏幕抓取工具将模拟终端(例如IBM 3270)并伪装成用户,以便以交互方式提取,更新大型机上的信息。最近,该概念适用于通过网页提供界面的任何应用程序。

随着SOA的出现,屏幕抓取是一种方便的方式,服务支持非应用程序。在这些情况下,网页抓取是更常见的方法。

答案 6 :(得分:2)

这是使用jQuery实现的一小部分屏幕抓取,使用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 ,请复制上述代码和paste it into the Console,并在此问题页面上查看此操作。

如果SO更改了DOM结构/元素类名称/ URI路径约定,则所有投注都会关闭,并且它可能不再起作用 - 这是屏幕抓取工作中通常存在的风险,即各方之间没有合同/理解(刮刀)和scrapee [是的我刚刚发明了一个词])。

答案 7 :(得分:2)

从技术上讲,screenscraping是抓取另一个程序的显示数据并摄取它自己使用的任何程序。在PC的早期,屏幕抓取器会模拟终端(例如IBM 3270)并伪装成一个用户。以交互方式提取,更新大型机上的信息。最近,该概念适用于通过网页提供界面的任何应用程序。

随着SOA的出现,屏幕抓取是一种方便的方式,服务支持非应用程序。在这些情况下,网页抓取是更常见的方法。

屏幕分组通常指的是一个Web客户端,它解析目标网站的HTML页面以提取格式化数据。当网站不提供RSS源或REST API以便以编程方式访问数据时,就可以完成此操作。

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

当没有人为您提供合理的机器可读界面时,屏幕抓取就是您所做的。这很难写,而且很脆弱。

作为一个例子,考虑一个RSS聚合器,然后考虑通过正常的面向人类的博客界面获取相同信息的代码。当博客决定改变他们的布局时,哪一个会破坏。

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

答案 8 :(得分:1)

  

当没有人为您提供合理的机器可读界面时,屏幕抓取就是您所做的。这很难写,而且很脆弱。

不完全正确。当我说大多数开发人员没有足够的经验来编写decents API时,我不认为我夸大了。我曾与屏幕抓取公司合作,而且API经常出现问题(从隐秘的错误到糟糕的结果),并且通常不会提供网站提供的全部功能,因为它可以更好地屏幕刮擦(网页刮擦,如果你将)。外网/网站门户使用的是比API客户更多的客户/经纪人,因此得到了更好的支持。在大公司中,对外联网门户等的更改很少,通常是因为它最初是外包的,现在只是维护。我更多地提到屏幕抓取,其中输出是定制的,例如特定航线和时间的航班,保险报价,航运报价等。

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

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

显然,在大规模环境中,您将编写比上述更强大的代码。

  

屏幕抓取工具下载html   页面,并拉出数据   通过搜索感兴趣   已知的令牌或将其解析为XML或   一些这样的。

这比正则表达式更简洁......在理论上......但是在实践中它并不那么容易,因为大多数文档需要在Xath中规范化才能通过XPath,最后我们发现了微调正则表达式更实用。