2009-07-23 68 views
1

我想下载并解析网页的HTML。最近,源网站从一个页面上的所有信息转移到隐藏在JavaScript后面的一部分。有一个“显示全部”复选框需要激活才能查看整个页面。ASP.NET屏幕刮贴模拟

这里的网站:Source Website

基本上我寻找已被点击复选框后自动检索该页面。目前,我们有一个C程序,用于下载网页并处理我们的解析。我不确定它是否可以在URL中接受JavaScript(如果可以用来解决此问题)(我尝试使用小书签从URL调用JavaScript,但我无法获得它来处理复选框),但是如果编写可以处理这个问题的C#程序更容易,它可以处理文件。

我更喜欢自己编写代码的方式,而不是使用第三方程序来避免在运行的服务器上安装任何东西。任何帮助是极大的赞赏。


编辑:基本上,我怎么可以自动调用链接到的是,JavaScript的“全选”复选框,这样我就可以抢包含HTML页中的一切是一个的点击复选框后显示。


编辑2: 下面是来自Fiddler2输出:

__EVENTTARGET ctl00$ContentPlaceHolder1$GenericWebUserControl$ShowAllCheckBox 
__EVENTARGUMENT 
__LASTFOCUS 
__VIEWSTATE (REMOVED DUE TO LENGTH) 
__EVENTVALIDATION (REMOVED DUE TO LENGTH) 
ctl00$ContentPlaceHolder1$GenericWebUserControl$Organization0 ALL 
ctl00$ContentPlaceHolder1$GenericWebUserControl$Initial or Amendment1 ALL 
ctl00$ContentPlaceHolder1$GenericWebUserControl$Relief Requested2 ALL 
ctl00$ContentPlaceHolder1$GenericWebUserControl$Country3 ALL 
ctl00$ContentPlaceHolder1$GenericWebUserControl$Status4 ALL 
ctl00$ContentPlaceHolder1$GenericWebUserControl$StartDate5 
ctl00$ContentPlaceHolder1$GenericWebUserControl$EndDate5  
ctl00$ContentPlaceHolder1$GenericWebUserControl$ShowAllCheckBox on 

我目前正在从服务器获取500错误。我是否也需要在发布请求中包含所有这些GenericWebUserControls?我是否也需要包含EVENTVALIDATION?


编辑3: 这里有最新的代码。我仍然收到服务器500错误。

private void CreateRequest() 
{ 
    HttpWebRequest httpWebRequest; 
    HttpWebResponse httpWebResponse; 
    StreamWriter streamWriter; 
    Stream webResponseStream; 
    StreamReader streamReader; 
    string postData; 
    string outputHTML; 

    postData = String.Format("&__EVENTTARGET={0}" + "&__VIEWSTATE={1}" + "&__EVENTVALIDATION=(2)"+"&ctl00$ContentPlaceHolder1$GenericWebUserControl$ShowAllCheckBox=on" +"&ctl00$ContentPlaceHolder1$GenericWebUserControl$Organization0=ALL" +"&ctl00$ContentPlaceHolder1$GenericWebUserControl$Initial+or+Amendment1=ALL" +"&ctl00$ContentPlaceHolder1$GenericWebUserControl$Relief+Requested2=ALL" +"&ctl00$ContentPlaceHolder1$GenericWebUserControl$Country3=ALL" +"&ctl00$ContentPlaceHolder1$GenericWebUserControl$Status4=ALL",EVENTTARGET, VIEWSTATE, EVENTVALIDATION); 

    httpWebRequest = (HttpWebRequest)WebRequest.Create("http://services.cftc.gov/sirt/sirt.aspx?Topic=ForeignPart30Exemptions"); 
    httpWebRequest.Method = "POST"; 
    httpWebRequest.ContentType = "application/x-www-form-urlencoded"; 
    httpWebRequest.ContentLength = postData.Length; 

    streamWriter = new StreamWriter(httpWebRequest.GetRequestStream(), System.Text.Encoding.ASCII); 
    streamWriter.Write(postData); 
    streamWriter.Close(); 

    httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 

    webResponseStream = httpWebResponse.GetResponseStream(); 
    streamReader = new StreamReader(webResponseStream); 
    outputHTML = streamReader.ReadToEnd(); 

    Console.WriteLine(outputHTML); 
} 

编辑4: 我已经决定了它是一个的造成服务器的500错误的POSTDATA字符串。如果我将它设为空字符串,它会输出整个网页。有谁知道我是否必须将来自Fiddler2的具有值的所有内容放入postData字符串中?另外,__VIEWSTATE是一个令人难以置信的长字符串。有没有限制或任何我不确定的事情?


编辑5: 我跑了所有通过URL编码器POSTDATA使用的字符串,但我仍然得到500服务器错误。有没有什么方法可以调试为什么这个帖子主体是无效的?


SOLUTION: 好吧,我不能让我的POSTDATA字符串是正确的,但是当我在原始的POST体粘贴它的工作原理。这看起来会很好,但我担心这是否会继续工作。

+1

你能把它作为一个问题来形容吗? – 2009-07-23 15:19:06

回答

3

这是一个asp.net页面。点击复选框会导致页面被回发到服务器。所以,而不是试图模拟JavaScript你想要做的,而是模拟发布请求。

这对ASP.Net页面来说是非常棘手的,因为你通常需要填充隐藏的__ViewState输入。我建议使用像Fiddler这样的数据包嗅探器来查看实际发送的请求。你应该能够从那里复制ViewState。

+0

好的,我跑了嗅探器并进入ViewState输入。我假设我现在可以运行一个C#HttpWebRequest来模拟发布请求。我唯一的问题是ViewState会改变吗? – 2009-07-23 15:41:40

+0

它可能。 ViewState可能存储诸如用户令牌,面包屑等东西。您可以在其中放置很多东西。但是您关心的主要是在EnableEventValidation设置为true(默认)并且您的复选框输入具有正确值的情况下它是“有效的”。 – 2009-07-23 15:44:16

1

它看起来JavaScript启动一个POST到同一页面。 Firebug在POST数据中显示以下内容。

__EVENTTARGET: ctl00$ContentPlaceHolder1$GenericWebUserControl$ShowAllCheckBox 

这可能是一个开始寻找的好地方。