为什么爬虫不跳转下一页

本文关键字:一页 爬虫 为什么 | 更新日期: 2023-09-27 17:50:58

我已经做了这个爬虫,我想知道为什么我的代码去下一页不工作。下面是代码

        var pessoaFinder = new ABCTelefonosPessoasLinkFinder();
        var pessoaContent = new ABCTelefonosPessoasContentFinder();
        var Urls = DadoPo.ListarUrls();

        foreach (var url in Urls)
        {
            var tempPessoas = new List<string>();
            tempPessoas.AddRange(pessoaFinder.Find(url));
            foreach (var linkPessoa in tempPessoas)
            {
                var infoPessoa = new List<DadoTo>();
                infoPessoa.AddRange(pessoaContent.Find(url + linkPessoa));

                foreach (var pessoa in infoPessoa)
                {
                    if (DadoPo.VerificaLink(url + linkPessoa))
                    {
                        continue;
                    }
                   DadoPo.Salvar(pessoa);
                }
            }
        }
    }

这个函数调用调用查找链接的函数,并转到下一页。这里有一个功能,查找人员信息,并转到下一页(我认为错误是)。

    public string[] Find(string url)
    {
        var webGet = new HtmlWeb();
        var document = webGet.Load(url);
        var nodes = document.DocumentNode.SelectNodes("//div[@id='mainContent']/div/a");
        if (nodes == null)
        {
            return new string[0];
        }
        foreach (var node in nodes)
        {
            var href = node.GetAttributeValue("href", "");
            cidades.Add(href);
        }
        var elUrlProximaPagina = document.DocumentNode.SelectSingleNode("//div[@id='mainContent']/div[@class='paginado']/div/*[contains(@class,'previous')]");
        if (elUrlProximaPagina == null)
        {
            return cidades.ToArray();
        }
        var urlProximaPagina = elUrlProximaPagina.GetAttributeValue("href", "");
        if (!String.IsNullOrEmpty(urlProximaPagina))
        {
            return Find(urlProximaPagina);
        }
        return cidades.ToArray();
    }
}

请尽快回答。非常感谢。

为什么爬虫不跳转下一页

一个可能的问题是,写入SelectSingleNode("//blah")将导致每次从根节点搜索文档,并且无论从哪个节点开始搜索,它总是返回第一个匹配的结果。这将导致您不断选择一个节点并重新爬行它。您应该使用.//语法来指定您正在从当前节点搜索:SelectSingleNode(".//blah") .

所以XPATH应该是:
document.DocumentNode.SelectSingleNode(".//div[@id='mainContent']/div[@class='paginado']/div/*[contains(@class,'previous')]");

您还必须修复代码中的所有其他XPATH选择器,以便从当前节点进行选择,而不是从根节点。