我在抓取从网站回发中获取的一些 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/