你如何屏幕刮?

时间:2010-03-11 13:03:53

标签: c# web-services api web-scraping

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

你觉得这样做怎么样?

6 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:12)

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

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

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

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

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

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

    2. 验证输入并抛出有意义的异常。在解析代码中,请注意使您的异常非常有用。目标站点对您进行更改,当发生这种情况时,您希望错误消息不仅告诉您代码的哪个部分失败,而且为什么失败。提及您正在寻找的模式和您要比较的文本。

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

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

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

答案 2 :(得分:3)

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

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

以下是一些可以帮助您入门的C#链接:

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

答案 3 :(得分:3)

以下是可以帮助您的示例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;
}

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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

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

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