【问题标题】:Why crawler don't go next page?为什么爬虫不进入下一页?
【发布时间】:2013-01-07 16:26:27
【问题描述】:

我已经制作了这个爬虫,我想知道为什么我转到下一页的代码不起作用。代码来了。

        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();
    }
}

请尽快回答。非常感谢。

【问题讨论】:

    标签: c# xpath web-crawler


    【解决方案1】:

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

    所以你的 XPATH 应该是:

    document.DocumentNode.SelectSingleNode(".//div[@id='mainContent']/div[@class='paginado']/div/*[contains(@class,'previous')]");
    

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

    【讨论】:

    • 感谢您的回答和关注!
    猜你喜欢
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    相关资源
    最近更新 更多