刮擦ASP.NET页面,模拟点击

时间:2015-03-02 20:46:18

标签: c# asp.net web-scraping csquery

我正试图抓取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);
    }

1 个答案:

答案 0 :(得分:0)

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

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