如何进行屏幕抓取?[关闭]
-
19-09-2019 - |
题
当没有可用的 Web 服务 API 时,您唯一的选择可能是屏幕抓取,但如何在 C# 中做到这一点?
你觉得怎样做?
解决方案
马特和保罗的答案是正确的。通过解析网站的 HTML 进行“屏幕抓取”通常是一个坏主意,因为:
解析 HTML 可能很困难, ,特别是如果它是畸形的。如果您正在抓取一个非常非常简单的页面,那么正则表达式可能会起作用。否则,请使用 HTML Agility Pack 等解析框架。
网站是一个移动的目标. 。每次源网站更改其标记结构时,您都需要更新代码。
屏幕抓取与 Javascript 配合不佳. 。如果目标网站使用任何类型的动态脚本来操作网页,您将很难抓取它。获取 HTTP 响应很容易,但是抓取浏览器响应该响应中包含的客户端脚本而显示的内容却要困难得多。
如果屏幕抓取是唯一的选择,那么以下是成功的一些关键:
尽可能轻松地更改您寻找的模式. 。如果可能,将模式存储为文本文件或资源文件中的某个位置。让其他开发人员(或 3 个月后的您自己)很容易理解您期望找到的标记。
验证输入并抛出有意义的异常. 。在您的解析代码中,请注意使您的异常非常有用。目标站点 将要 当你发生改变时,你希望错误消息不仅告诉你代码的哪一部分失败了,还告诉你 为什么 它失败了。提及您正在寻找的模式和您正在比较的文本。
编写大量自动化测试. 。您希望能够非常轻松地以非破坏性方式运行您的抓取工具,因为您 将要 进行大量的迭代开发以获得正确的模式。尽可能多地自动化测试,从长远来看会得到回报。
考虑浏览器自动化工具 喜欢 瓦廷. 。如果您需要与目标网站进行复杂的交互,那么从浏览器本身的角度编写抓取工具可能会更容易,而不是手动处理 HTTP 请求和响应。
至于 如何 要在 C# 中屏幕抓取,您可以使用 Watin(参见上文)并使用其 DOM 抓取生成的文档,或者您可以使用 WebClient
class [请参阅 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文档中的现场工作这可能非常重要的。
从实用的角度看(我已经写了几十个“网上互动”应用多年来),我在华廷<终于尘埃落定/ A>结合 CSQuery 。
华廷提供浏览器自动化(与按钮等进行交互)的基础知识,同时CSQuery让你使用jQuery风格的语法来解析页面内容。
我用硒一会儿(也设计用于网站的自动测试)用IE和FireFox,但发现它是易于用于长期刮擦时崩溃。所有我目前的生产系统是华廷+ CSQuery和每日的基础上提供多个网站的可靠的刮。
注:我知道华廷还没有了一段时间更新,但的 的 “如果没坏,用它!”)