黄页网页爬取循环页码不递增,重复获取第二页数据问题
解决黄页网页爬取时循环重复获取同一页面的问题
我帮你排查了代码里的问题,核心原因是Next页面链接的选择器逻辑错误,导致每次循环都重复请求第二页的URL。下面一步步给你修正方案和优化建议:
1. 修复选择器的核心错误
你原来的代码里,获取Next链接的选择器和取值逻辑完全错了:
var NextPageCheck = doc.DocumentNode.SelectNodes("//a[text()='Next']/@href").ToList(); // 错误:这里获取的是href属性节点,不是a元素节点,Attributes["href"]根本不存在 string link = webUrl + NextPageCheck[0].Attributes["href"].Value;
正确的做法是先找到包含"Next"文本的a元素节点,再提取它的href属性,还要注意处理文本里的空格/换行:
// 用normalize-space处理文本,避免空格/换行导致匹配失败 var nextLinkNode = doc.DocumentNode.SelectSingleNode("//a[normalize-space(text())='Next']"); if (nextLinkNode != null) { string link = webUrl + nextLinkNode.GetAttributeValue("href", string.Empty); doc = Web.Load(link); // 后续处理... }
2. 修正循环逻辑,避免重复请求
原来的循环里,你需要确保每次都基于最新加载的页面去查找下一页链接,同时用更直观的方式控制循环终止。修正后的完整代码如下:
static void Main(string[] args) { string baseUrl = "https://www.yellowpages.com"; HtmlWeb web = new HtmlWeb(); // 初始URL(第一页) string currentUrl = $"{baseUrl}/search?search_terms=software&geo_location_terms=Los+Angeles%2C+CA"; while (!string.IsNullOrEmpty(currentUrl)) { HtmlDocument doc = web.Load(currentUrl); // 获取当前页面的商家名称 var businessNames = doc.DocumentNode.SelectNodes("//a[@class='business-name']"); if (businessNames != null) { foreach (var nameNode in businessNames) { Console.WriteLine(nameNode.InnerText.Trim()); } } // 获取下一页的链接 var nextLinkNode = doc.DocumentNode.SelectSingleNode("//a[normalize-space(text())='Next']"); if (nextLinkNode != null) { string nextHref = nextLinkNode.GetAttributeValue("href", string.Empty); currentUrl = string.IsNullOrEmpty(nextHref) ? null : $"{baseUrl}{nextHref}"; } else { // 没有下一页,终止循环 currentUrl = null; } } }
3. 更稳定的替代方案:直接构造分页URL
依赖页面的Next按钮容易受网站结构更新影响(比如按钮文本/class变化),更可靠的方式是直接构造分页URL。黄页的搜索结果URL格式是:
https://www.yellowpages.com/search?search_terms=software&geo_location_terms=Los+Angeles%2C+CA&page=N
其中N是页码(从1开始)。你可以循环递增页码,直到某一页没有返回数据为止:
static void Main(string[] args) { string baseUrl = "https://www.yellowpages.com"; HtmlWeb web = new HtmlWeb(); int pageNumber = 1; bool hasData = true; while (hasData) { string currentUrl = $"{baseUrl}/search?search_terms=software&geo_location_terms=Los+Angeles%2C+CA&page={pageNumber}"; HtmlDocument doc = web.Load(currentUrl); var businessNames = doc.DocumentNode.SelectNodes("//a[@class='business-name']"); if (businessNames == null || businessNames.Count == 0) { // 当前页没有数据,终止循环 hasData = false; break; } // 输出商家名称 foreach (var nameNode in businessNames) { Console.WriteLine(nameNode.InnerText.Trim()); } pageNumber++; // 可选:添加1秒延迟,避免被网站封禁IP System.Threading.Thread.Sleep(1000); } }
额外提醒
- 请遵守Yellow Pages的使用条款和
robots.txt协议,避免过度爬取给服务器造成压力。 - 如果遇到验证码或IP封禁,可能需要使用代理IP或Selenium等工具模拟浏览器行为。
内容的提问来源于stack exchange,提问作者Anas Avais
相关产品推荐
相关产品推荐

