【发布时间】:2009-07-23 15:16:33
【问题描述】:
我正在尝试下载和解析网页的 HTML。最近,源网站从将所有信息放在一个页面上转移到将部分信息隐藏在 javascript 后面。有一个“显示全部”复选框需要激活才能查看整个页面。
这是网站: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 错误。我有什么办法可以调试为什么该帖子正文无效?
解决方案: 好的,我无法让我的 postData 字符串正确,但是当我粘贴到原始 POST 正文中时它可以工作。这看起来已经足够了,但我担心这是否会继续工作。
【问题讨论】:
-
你能把它当作一个问题来表达吗?
标签: javascript html checkbox parsing screen-scraping