C# 在 aspx 页面上遇到屏幕抓取问题

问题描述 投票:0回答:1

我在抓取从网站回发中获取的一些 HTML 时遇到了一些问题。这是一个 aspx 页面,我试图从中获取生成的 HTML。

我已经查看了使用 Chrome 开发人员工具发送的 cookie 数据、会话数据和论坛数据,尽管在我的代码中模仿了几乎所有内容,但我仍然无法让页面响应搜索结果。

页面上有 3 个下拉菜单,其中 2 个是在您首次访问该页面时预先填充的。在为前 2 个选择值后(每次选择这两个时它都会回发),它将填充第 3 个下拉列表的值。在第三个下拉列表中选择一个值后,您点击搜索按钮,结果将返回到下方的表格中。

点击搜索按钮并在屏幕上获得结果后,我进入开发人员工具并获取所有看起来相关的值(尤其是所有表单值)并将它们捕获到我的代码中,但仍然没有运气。甚至准确捕捉大视图状态。

这里是我尝试过的许多代码示例的代码示例。不可否认,我对其中一些类不是很熟悉,我一直在尝试不同的代码片段。

我不确定我的代码是否做错了,或者我是否只是缺少表单数据或 cookie 以使其执行 POST 并返回正确的数据。我的代码当前将 HTML 从页面返回到 responseInString 变量,但 HTML 看起来像是页面的第一个版本(就像您第一次访问它一样),没有选择下拉框并且第三个没有填充任何值。所以我不知道我的代码是否真的遇到了代码隐藏并执行表单 POST 以使其返回数据。

任何帮助将不胜感激。谢谢!

using (var wb = new WebClient())
{
    var data = new NameValueCollection();
    data["_EVENTTARGET"] = "";
    data["_EVENTARGUMENT"] = "";
    data["_LASTFOCUS"] = "";
    data["_VIEWSTATE"] = "(giant viewstate)";
    data["__VIEWSTATEGENERATOR"] = "D86C5D2F";
    //3 more form input/select fields after this with values corresponding to the drop downs.

    wb.Headers.Add(HttpRequestHeader.Cookie,
".ASPXANONYMOUS=(long string);" +
    "ASP.NET_SessionId=(Redacted);" +
    " _gid=GA1.2.1071490528.1676265043;" +
    "LoginToken=(Redacted);" +
    "LoginUserID=(Redacted);" +
    "_ga=GA1.1.1195633641.1675746985;" +
    "_ga_38VTY8CNGZ=GS1.1.1676265043.7.1.1676265065.0.0.0");
    wb.Headers.Add("Sec-Fetch-Dest", "document");
    wb.Headers.Add("Sec-Fetch-Mode", "navigate");
    wb.Headers.Add("Sec-Fetch-Site", "same-origin");
    wb.Headers.Add("Sec-Fetch-User", "?1");
    wb.Headers.Add("Content-Type", "application/x-www-form-urlencoded");

    var response = wb.UploadValues("(the web page url)", "POST", data);
    string responseInString = Encoding.UTF8.GetString(response);

    return responseInString;
}
httpwebrequest screen-scraping webclient
1个回答
0
投票

问题可能与几件事有关:

检查您是否发送了

__EVENTTARGET
__EVENTARGUMENT
参数的正确值。它们在 ASP.NET 页面中用于触发处理请求可能需要的服务器端事件。

您是否正在对发送的表单数据进行编码?对于

application/x-www-form-urlencoded
内容类型,您需要对每个表单字段的值进行 URL 编码。使用 C#
HttpUtility.UrlEncode
方法。

仔细检查你的饼干。服务器预期的任何缺失值都可能导致它失败。

要调试您的问题,请使用工具来捕获您的 HTTP 请求,它会为您提供有关请求失败位置的信息。 (您应该能够在 Chrome chrome://net-export/ 中记录您的数据)

我使用 Visual Studio 进行编码,它在格式化方面做得很好:

using System.Collections.Specialized;
using System.Net;
using System.Text;

class Program
{
  static void Main(string[] args)
  {
    var wc = new WebClient();
    wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
    wc.Headers[HttpRequestHeader.Cookie] =
            ".ASPXANONYMOUS=(long string);" +
            "ASP.NET_SessionId=(Redacted);" +
            "_gid=GA1.2.1071490528.1676265043;" +
            "LoginToken=(Redacted);" +
            "LoginUserID=(Redacted);" +
            "_ga=GA1.1.1195633641.1675746985;" +
            "_ga_38VTY8CNGZ=GS1.1.1676265043.7.1.1676265065.0.0.0";

    var values = new NameValueCollection
    {
        { "_EVENTTARGET", "" },
        { "_EVENTARGUMENT", "" },
        { "_LASTFOCUS", "" },
        { "__VIEWSTATE", "(giant viewstate)" },
        { "__VIEWSTATEGENERATOR", "D86C5D2F" },
        // Add the remaining form input/select fields with values corresponding to the drop downs.
    };

    byte[] responseBytes = wc.UploadValues("(the web page url)", "POST", values);
    string responseInString = Encoding.UTF8.GetString(responseBytes);
    Console.WriteLine(responseInString);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.