【问题标题】:How to get the data programatically using Webclient / HttpClient?如何使用 Webclient / HttpClient 以编程方式获取数据?
【发布时间】:2019-07-17 14:49:53
【问题描述】:

我想使用下拉列表中列出的日期从https://eauction.ccmc.gov.in/frm_scduled_items.aspx 下载数据。

    private async Task Cbetest()
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("https://eauction.ccmc.gov.in");
            var content = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair<string, string>("ctl00$ContentPlaceHolder1$gridedit$ctl14$ctl02","17/02/2016")
        });
            var result = await client.PostAsync("/frm_scduled_items.aspx", content);
            string resultContent = await result.Content.ReadAsStringAsync();
            Console.WriteLine(resultContent);
        }
    }

我想下载上图显示的数据

【问题讨论】:

  • 好的。所以你有一些代码,你已经陈述了一个目标。但是你面临什么问题?您的代码如何未按预期执行?你需要问一个明确的问题。
  • 选择日期后我没有得到内容。上面的代码只返回日期列表而不是实际数据
  • 查找 html 敏捷包。
  • 是的,但是选择日期后我没有得到内容。
  • 你确定元素(下拉)不是 ctl00$ContentPlaceHolder1$drp_auction_date 吗?脚本实际上使用它作为回发的参数。

标签: c# httpclient webclient


【解决方案1】:

您需要做一些额外的工作来模拟帖子以开始对 ASP.NET WebForms 应用程序进行抓取。大多数情况下,您需要传递有效的 ViewState 和 EventValidation 参数,您可以从初始 GET 请求中检索这些参数。

我正在使用 HTML Agility Pack 来轻松解析初始响应,如果您打算抓取 HTML,我建议您查看它。

以下似乎得到了您正在寻找的结果,尽管我没有深入研究响应 HTML。

using(var client = new HttpClient())
{
    client.BaseAddress = new Uri("https://eauction.ccmc.gov.in");

    var initial = await client.GetAsync("/frm_scduled_items.aspx");

    var initialContent = await initial.Content.ReadAsStringAsync();

    var htmlDoc = new HtmlDocument();

    htmlDoc.LoadHtml(initialContent);

    var viewState = htmlDoc.DocumentNode.SelectSingleNode("//input[@id='__VIEWSTATE']").GetAttributeValue("value", string.Empty);
    var eventValidation = htmlDoc.DocumentNode.SelectSingleNode("//input[@id='__EVENTVALIDATION']").GetAttributeValue("value", string.Empty);

    var content = new FormUrlEncodedContent(new Dictionary<string, string>{
        {"__VIEWSTATE", viewState},
        {"__EVENTVALIDATION", eventValidation},
        {"ctl00$ContentPlaceHolder1$drp_auction_date", "17/02/2016"}
    });

    var res = await client.PostAsync("/frm_scduled_items.aspx", content);

    var resContent = await res.Content.ReadAsStringAsync();

    Console.WriteLine(resContent);
}

您需要从那里解析结果表以获取有用的信息。如果您想爬取 DataGrid 的页面,您将需要获取更新的 EventValidation 和 ViewState 值并模拟每个页面的附加帖子。

【讨论】:

  • 感谢您的及时帮助。这帮助我节省了很多时间。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
  • 2017-01-10
相关资源
最近更新 更多