You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

黄页网页爬取循环页码不递增,重复获取第二页数据问题

解决黄页网页爬取时循环重复获取同一页面的问题

我帮你排查了代码里的问题,核心原因是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:42:36