c# - 在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());
}
解决方案
“加载更多”按钮正在向服务器发出 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);
}
}
推荐阅读
- zsh - 使用格式化从数组中回显两个变量
- python - 在 Python (PyQt5) 中使用子类处理 keyPressEvent
- php - PHP:将动态上传的图像转换为特定颜色(动态颜色)
- facebook - Facebook 获取开发者帐户电子邮件?
- javascript - Promise 说他们完成了,但实际上没有完成?
- csv - 导入 csv 在 Jupyter 笔记本中的初始位置 Julia 返回编码标识符
- java - Java Android - 访问 addValueEventListener 之外的变量
- r - 为 Rmarkdown 格式化为 kable / kableExtra 的表格的一个单元格添加上标
- php - 如何使用命令行预编译 php opcache?
- kubernetes - 使用 EnvoyProxy 添加本地速率限制