在Screen Scraping中工作时的页面发布问题

时间:2010-05-26 13:32:51

标签: c# asp.net screen-scraping

我正在进行屏幕抓取并在3个网站上成功完成,我在上一个网站上有一个问题

这是我的网址,当我点击我的参数时,它会在下一页显示结果,只是发布到其他页面并在其他页面上显示结果

Here is My Test

然而,当我从我的应用程序中点击时,由于这里我没有选项发布,它只获取请求页面的html,这显然是我上面提到的HTML测试链接,实际上在URL中有参数来获取结果

我该如何处理这种情况? 请给我提示。

由于

这是我的C#代码,我正在使用HTMLAgality

String url;
HtmlWeb hw = new HtmlWeb();
HtmlDocument doc;
url = "http://mysampleURL";
doc = hw.Load(url);

3 个答案:

答案 0 :(得分:3)

使用WebClient类发布包含预期输入值的第一页的表单。输入值可以在第一页的源代码中找到,但也可以使用Fiddler捕获它们,这对于这些场景来说是一个很好的工具。

示例:

NameValueCollection values = new NameValueCollection();
values.Add("action","hotelPackageWizard@searchHotelOnly");
values.Add("packageType","HOTEL_ONLY");
// etc..
WebClient webclient = new WebClient();
webclient.Headers.Add("Content-Type","application/x-www-form-urlencoded");
byte[] responseArray = webclient.UploadValues("http://www.expedia.com/Hotels?rfrr=-905&","POST", values);
string response = System.Text.Encoding.ASCII.GetString(responseArray);

答案 1 :(得分:2)

如果资源需要POST,那么你必须提交一个POST。

这是一项相当简单的任务。以下是Rick Strahl's blog的示例。代码有点质朴但有效,可以让你走向正确的方向

string lcUrl = "http://www.west-wind.com/testpage.wwd";
HttpWebRequest loHttp =
   (HttpWebRequest) WebRequest.Create(lcUrl);

// *** Send any POST data
string lcPostData =
   "Name=" + HttpUtility.UrlEncode("Rick Strahl") +
   "&Company=" + HttpUtility.UrlEncode("West Wind ");

loHttp.Method="POST";
byte [] lbPostBuffer = System.Text.           
                       Encoding.GetEncoding(1252).GetBytes(lcPostData);
loHttp.ContentLength = lbPostBuffer.Length;

Stream loPostData = loHttp.GetRequestStream();
loPostData.Write(lbPostBuffer,0,lbPostBuffer.Length);
loPostData.Close();

HttpWebResponse loWebResponse = (HttpWebResponse) loHttp.GetResponse();

Encoding enc = System.Text.Encoding.GetEncoding(1252);

StreamReader loResponseStream =
   new StreamReader(loWebResponse.GetResponseStream(),enc);

string lcHtml = loResponseStream.ReadToEnd();

loWebResponse.Close();
loResponseStream.Close();

答案 2 :(得分:0)

对于涉及发布表单(如登录,维护cookie,处理XSRF令牌)的屏幕抓取任务,一种解决方案是使用CURL。但这并不容易。

然后我探索了Selenium并且我喜欢它。有两件事 - 1)安装Selenium IDE(仅适用于Firefox)。 2)安装Selenium RC Server

启动Selenium IDE后,转到您尝试自动执行的站点,并开始记录您在站点上执行的事件。将其视为在浏览器中录制宏。然后,您将获得所需语言的代码输出。

您知道Browsermob使用Selenium进行负载测试以及在浏览器上自动执行任务。

我已经上传了一段我曾经做过的ppt。这可以为您节省大量时间 - http://www.4shared.com/get/tlwT3qb_/SeleniumInstructions.html

在上面的链接中选择常规下载选项。

我花了很多时间搞清楚,所以认为这可以节省一些人的时间。