首页 > 解决方案 > 在c#中抓取时,有什么方法可以通过网页上的加载更多按钮?

问题描述

我正在使用 HtmlAgilityPack 来定位我需要抓取的标签并从中获取所有文本数据,但我无法找到通过“加载更多”按钮的方法,这是我迄今为止从教程中尝试过的任何想法将不胜感激。

    var httpClient = new HttpClient();

    var html = await httpClient.GetStringAsync(url);

    var htmlDocument = new HtmlDocument();
    htmlDocument.LoadHtml(html);

    var Review = htmlDocument.DocumentNode.Descendants("div")
        .Where(node => node.GetAttributeValue("class", "notfound").Equals("content")).ToList();

    foreach (var item in Review)
    {
            Console.WriteLine(item.Descendants("div").FirstOrDefault().InnerText.Trim().ToString());
    }

标签: c#asp.net.netselenium-webdriverweb-scraping

解决方案


“加载更多”按钮正在向服务器发出 XHR 请求,每次进行新调用时,该请求都会附加一个动态分页键,所以我所做的是收集包含扩展部分的所有 url(请求)的评论。然后单独抓取每个网址以检索我想要的内容。

该函数将用户评论页面的url作为参数,函数内部的前3行是形成XHR请求url,然后从html页面中检索分页键并形成下一页的url,这样继续下去递归直到找到所有网址。

public async void GetUrls(string u)
{
    string toappend = "/_ajax?ref_=undefined&paginationKey=";
    string aurl = u.Substring(0, 44) + toappend;
    var init_url = u;

    var httpCli = new HttpClient();
    var html = await httpCli.GetStringAsync(init_url);
    var htmldoc = new HtmlDocument();
    htmldoc.LoadHtml(html);


    var nxt_url = htmldoc.DocumentNode.Descendants("div")
    .Where(node => node.GetAttributeValue("class", "").Equals("loadmoredata")).ToList();

    if (nxt_url.Count!=0)
    {
        foreach (var item in nxt_url)
        {
            string url = item.GetAttributeValue("data-key", "").ToString();
            urllist.Add(url);
            string succ_url = aurl + url;
            //Console.WriteLine(succ_url);
            GetUrls(succ_url);
            Console.WriteLine("----Saving URLs..-----");
        }
    }
    else if(nxt_url.Count==0)
    {
        Console.WriteLine(" Crawl Successful ");
        ScrapenSave(u);
    }
}

推荐阅读