抓取ASP.NET页面,模拟点击

Scraping ASP.NET page, simulate click

我正在尝试抓取 http://www.menorcarentals.com/en/villas 的所有页面,但我遇到了一些问题,因为它每次都会给我第一页。 我的方法是在页面上找到所有输入和选择,并将 __EVENTTARGET 的值设置为我要单击的按钮的值,这以前有效,但这个网站不会让步。

获取所有输入字段的方法

public static Dictionary<string, string> GetInputFields(CQ dom)
{
    Dictionary<string, string> result = new Dictionary<string, string>();
    foreach (var v in dom.Find("input"))
    {
        var value = v.Cq().Attr("value");
        var key = v.Cq().Attr("name");
        if (!string.IsNullOrWhiteSpace(value))
        {
            if (!result.ContainsKey(key))
            {
                result.Add(key, value);
            }
            else
            {
                result[key] = value;
            }
        }
    }

    // Get all selects
    foreach (var s in dom.Select("select"))
    {
        var select = s.Cq();
        var key = select.Attr("name");
        foreach (var option in select.Children("option"))
        {
            var opt = option.Cq();
            if(!string.IsNullOrWhiteSpace(opt.Attr("selected")))
            {
                if (!result.ContainsKey(key))
                {
                    result.Add(key, opt.Val());
                }
                else
                {
                    result[key] = opt.Val();
                }
            }
        }
    }

    return result;
}

我的代码通过不同的页面运行

    string searchPageUrl = "http://www.menorcarentals.com/en/villas";
    var html = DownloadHelper.Download(searchPageUrl);
    while (true)
    {
        CQ dom = html;

        // parse page and get info i need here

        // Find the next page
        var pagination = dom.Select("#ctl00_Content_dpVillas").Children();
        bool foundCurrent = false;
        string clickElementName = string.Empty;
        foreach (var pagi in pagination)
        {
            if (pagi.Classes.Any(x=>x.ToLower() == "current"))
            {
                foundCurrent = true;
            }
            else if (foundCurrent)
            {
                var href = pagi.Cq().Attr("href");
                clickElementName = RegexHelper.Match(@"doPostBack\(\'([^']+)", href);
                break;
            }
        }
        if (string.IsNullOrWhiteSpace(clickElementName))
        {
            break; // no more pages
        }
        var inputFields = ScraperHelper.GetInputFields(html);

        // Simulate that we click the next button
        if (!inputFields.ContainsKey("__EVENTTARGET"))
            inputFields.Add("__EVENTTARGET", String.Empty);
        inputFields["__EVENTTARGET"] = clickElementName;

        html = DownloadHelper.Post(searchPageUrl, inputFields);
    }

关闭浏览器中的 JavaScript 和 cookie(在关闭前删除 cookie),然后查看 CsQuery 将使用的实际页面。

这可能是您无法解析任何内容的结果, 例如,页面的实际内容加载 AJAX。