当没有可用的 web 服务 API 时,您唯一的选择可能是 Screen Scrape,但是您如何在 c# 中做到这一点?
你觉得怎么做?
当没有可用的 web 服务 API 时,您唯一的选择可能是 Screen Scrape,但是您如何在 c# 中做到这一点?
你觉得怎么做?
马特和保罗的回答是正确的。通过从网站解析 HTML 来进行“屏幕抓取”通常是个坏主意,因为:
解析 HTML 可能很困难,尤其是在格式错误的情况下。如果您正在抓取一个非常非常简单的页面,那么正则表达式可能会起作用。否则,请使用 HTML Agility Pack 之类的解析框架。
网站是一个移动的目标。每次源网站更改其标记结构时,您都需要更新代码。
屏幕抓取不适用于 Javascript。如果目标网站使用任何类型的动态脚本来操作网页,您将很难抓取它。抓取 HTTP 响应很容易,但要抓取浏览器响应包含在该响应中的客户端脚本所显示的内容要困难得多。
如果屏幕抓取是唯一的选择,这里有一些成功的关键:
尽可能轻松地更改您要查找的模式。如果可能,将模式存储为文本文件或某处的资源文件。让其他开发人员(或您自己在 3 个月后)很容易理解您希望找到的标记。
验证输入并抛出有意义的异常。在您的解析代码中,请注意使您的异常非常有用。目标站点会随您而变,当发生这种情况时,您希望错误消息不仅告诉您代码的哪一部分失败,而且告诉您失败的原因。提及您正在寻找的模式和您正在比较的文本。
编写大量自动化测试。您希望以非破坏性方式运行您的爬虫非常容易,因为您将进行大量迭代开发以使模式正确。尽可能多地自动化测试,从长远来看会有所回报。
考虑一个像Watin这样的浏览器自动化工具。如果您需要与目标网站进行复杂的交互,从浏览器本身的角度编写爬虫可能会更容易,而不是手动处理 HTTP 请求和响应。
至于如何在 C# 中筛选抓取,您可以使用 Watin(参见上文)并使用其 DOM 抓取生成的文档,或者您可以使用WebClient
类 [参见 MSDN 或 Google] 获取原始 HTTP 响应,包括 HTML内容,然后使用某种基于文本的分析来提取您想要的数据。
使用Html 敏捷包。它处理不良和格式错误的 HTML。它使您可以使用 XPath 进行查询,从而非常容易地找到您要查找的数据。不要手动编写解析器,也不要使用正则表达式,这太笨拙了。
您正在寻找的术语实际上称为屏幕抓取。
关于抓取网站,您必须考虑的一件事是它们超出了您的控制范围,并且可能会频繁且显着地更改。如果你真的去刮掉改变的事实应该成为你整体战略的一部分。例如,您迟早需要更新您的代码以处理“移动目标”。
这里有几个 C# 链接可以帮助您入门:
以下是可以帮助您的示例 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 已经有一段时间没有更新了,但是“如果它没有损坏,请使用它!” :)