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