你如何屏幕刮?

如果没有可用的Web服务API,您唯一的选择可能是Screen Scrape,但是如何在c#中执行?

你觉得这样做怎么样?

马特和保罗的答案是正确的。 通过从网站解析HTML来“屏幕抓取”通常是一个坏主意,因为:

  1. 解析HTML可能很困难 ,特别是如果它格式不正确。 如果你正在抓一个非常非常简单的页面,那么正则表达式可能会起作用。 否则,请使用HTML Agility Pack等解析框架。

  2. 网站是一个不断变化的目标 。 每次源网站更改其标记结构时,您都需要更新代码。

  3. 使用Javascript,屏幕抓取效果不佳 。 如果目标网站使用任何类型的动态脚本来操纵网页,那么您将很难抓住它。 抓取HTTP响应很容易,要抓取浏览器显示的内容以响应该响应中包含的客户端脚本要困难得多。

如果屏幕抓取是唯一的选择,这里有一些成功的关键:

  1. 尽可能简单地更改您要查找的模式 。 如果可能,将模式存储为文本文件或存储在某个资源文件中。 让其他开发人员(或3个月内自己)很容易理解您期望找到的标记。

  2. validation输入并抛出有意义的exception 。 在解析代码中,请注意使您的exception非常有用。 目标站点在您身上发生变化,当发生这种情况时,您希望您的错误消息不仅告诉您代码的哪个部分失败,而且还告诉您失败的原因 。 提及您正在寻找的模式和您要比较的文本。

  3. 写了很多自动化测试 。 您希望以非破坏性的方式运行刮刀非常容易,因为您进行大量的迭代开发以使模型正确。 尽可能多地自动化测试,从长远来看,它将获得回报。

  4. 考虑像Watin这样的浏览器自动化工具 。 如果您需要与目标网站进行复杂的交互,那么从浏览器本身的角度来编写您的刮刀可能更容易,而不是手动扫描HTTP请求和响应。

至于如何在C#中屏幕抓取,您可以使用Watin(参见上文)并使用其DOM抓取生成的文档,或者您可以使用WebClient类[请参阅MSDN或Google]来获取原始HTTP响应,包括HTML内容,然后使用某种基于文本的分析来提取您想要的数据。

使用Html Agility Pack 。 它处理不良和格式错误的HTML。 它允许您使用XPath进行查询,从而可以非常轻松地找到您正在查找的数据。 不要手工编写解析器,也不要使用正则表达式,这太笨拙了。

您正在寻找的术语实际上称为屏幕刮擦。

关于抓取网站,你必须考虑的一件事是,它们超出了你的控制范围,可以经常和显着地改变。 如果你确实采取了改变的事实应该成为整体战略的一部分。 例如,您需要迟早更新代码以处理“移动目标”。

这里有几个C#链接可以帮助您入门:

http://www.cambiaresearch.com/c4/3ee4f5fc-0545-4360-9bc7-5824f840a28c/How-to-scrape-or-download-a-webpage-using-csharp.aspx

以下是可以帮助您的示例C#代码

 Uri url = new Uri("http://msdn.microsoft.com/en-US/"); if (url.Scheme == Uri.UriSchemeHttp) { //Create Request Object HttpWebRequest objRequest = (HttpWebRequest)HttpWebRequest.Create(url); //Set Request Method objRequest.Method = WebRequestMethods.Http.Get; //Get response from requested url HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse(); //Read response in stream reader StreamReader reader = new StreamReader(objResponse.GetResponseStream()); string tmp = reader.ReadToEnd(); objResponse.Close(); //Set response data to container this.pnlScreen.GroupingText = tmp; } 

有一点需要注意,有些人提到将网站作为XML下拉,然后使用XPath迭代节点。 确保您使用已在XHTML中开发的站点以确保HTML表示格式良好的XML文档可能很重要。

从实际角度来看(多年来我已经写了几十个“网络互动”应用程序),我最终选择了Watin和CSQuery 。

Watin提供了浏览器自动化的基础知识(与按钮等交互),而CSQuery允许您使用jQuery样式语法来解析页面内容。

我用IE和FireFox一段时间(也用于网站的自动化测试)使用Selenium,但发现它在用于长期刮擦时容易崩溃。 我目前的所有生产系统都是Watin + CSQuery,每天都可以对多个网站进行可靠的抓取。

注意:我发现Watin暂时没有更新,但“如果没有破坏,请使用它!” 🙂