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

标签 httpwebrequest screen-scraping webclient

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

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

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

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

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

我不确定我的代码是否做错了,或者我是否只是缺少表单数据或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;
}

最佳答案

该问题可能与以下几件事有关:

检查您发送的 __EVENTTARGET__EVENTARGUMENT 参数值是否正确。它们在 ASP.NET 页面中用于触发处理请求可能需要的服务器端事件。

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

仔细检查您的 cookie。服务器期望的任何缺失值都可能导致其失败。

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

对代码进行了格式化,使其更易于阅读:

using System;
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);
  }
}

关于httpwebrequest - C# 在 aspx 页面上遇到屏幕抓取问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75455808/

相关文章:

c# - 具有大数据集的不完整 HttpWebResponse

c# - 从异步 HttpWebRequest 流读取 NullReferenceException

coldfusion - 使用 Coldfusion 进行屏幕抓取

python - 屏幕抓取时处理 javascript 重页面的选项

.net - WebClient Headers 属性缺少 Add 方法?

c# - 如何在 C# 中通过 POST HttpWebRequest 发送 PDF

c# - 使用 HttpWebRequest 的自定义 NTLM 身份验证

python - 尝试使用 Beautiful Soup 或 ElementTree 从链接的迭代列表中抓取信息

C# - 从异步方法回调更新变量 BY REF - WebClient 类

.net downloadstring(url) 突然返回503错误