javascript - ASP.NET 屏幕抓取后模拟

标签 javascript html checkbox parsing screen-scraping

我正在尝试下载和解析网页的 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: 我确定是 postData 字符串导致服务器 500 错误。如果我将它设为空字符串,它会输出整个网页。有谁知道我必须将来自 Fiddler2 的所有具有值的内容放入 postData 字符串中是否正确?此外,__VIEWSTATE 是一个非常长的字符串。有什么限制或我不确定的地方吗?


编辑 5: 我通过 URL 编码器运行了 postData 中使用的所有字符串,但我仍然遇到服务器 500 错误。我有什么办法可以调试为什么该帖子正文无效?


解决方案: 好吧,我无法让我的 postData 字符串正确,但是当我粘贴到原始 POST 正文中时它起作用了。这看起来已经足够好了,但我担心这是否会继续有效。

最佳答案

那是一个 asp.net 页面。单击该复选框会使页面回传到服务器。因此,与其尝试模拟 javascript,不如模拟 post 请求。

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

关于javascript - ASP.NET 屏幕抓取后模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1172496/

相关文章:

php - 复选框 Action 事件

jQuery 数据表 : Multiple checkbox filtering

javascript - 如何获取对象内部嵌套数组的值?

javascript - CSS Float 和 AngularJS

javascript - jQuery - 根据类别显示和隐藏不同的 div

jquery - 灰色屏幕覆盖登录表单中的打开页面(例如 Mozilla Alert)

javascript - 如何将 ember 添加到 NodeJS 项目中?

php - Offscreen div 导致窗口仅在移动浏览器中展开

html - CSS对齐问题

join - SQL 语法挑战