如何使用Webclient / HttpClient以编程方式获取数据?

时间:2019-07-17 14:49:53

标签: c# httpclient webclient

enter image description here

我想使用下拉列表中列出的日期从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);
        }
    }

我想下载上图中显示的数据

1 个答案:

答案 0 :(得分: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值,并为每个页面模拟其他帖子。