【问题标题】:Issue in scraping with cheerio用cheerio刮的问题
【发布时间】:2014-08-31 11:57:28
【问题描述】:

我一直在尝试为我们正在构建的网站抓取 10 个网站,其中包含指向原始网站的链接,在 node.js 上使用cheerio,我们得到的问题是一些网站已经改变,现在使用 ajax 调用来带来他们的数据,我的问题是我们如何获取这些信息,例如先触发按钮单击然后获取 DOM。

其次:相同的 dom 结构并没有获取我所有的数据,它正在检索一个页面的信息,但没有获取具有相同 DOM 结构的另一页面上的元素。任何帮助将不胜感激。

谢谢和问候。 编辑 1:相关代码

$('#ProductContent').filter(function(){
                            var price = undefined;
                            var ukulele = false;
                            var model = $(this).find('.ProductSubtitle').text().replace(/\n\s*/g,"");
                            if(model.indexOf(/m/i) != 0){
                                var description = $(this).find('.RomanceCopy').text().replace(/\n\s*|\r/g,"");
                                .
                                .code removed for brevity and the variables present here are populated
                                .
                                //this children is populated only for one page.
                                children =  $(this).find('.SpecsColumn .SpecsTable table tbody').children('tr');
                                console.log('children: '+children.length)
                                console.log(guitar_url);
                                children.each(function(){
                                    var key = $(this).children('td').first().text();
                                    var value = $(this).children('td').last().text();
                                    specs[key] = value;
                                    console.log(specs); 
                                });

编辑 2:Cherios 初始化

request(guitar_url,function(error,response,html){
                    if(!error){
                        var $ = cheerio.load(html);
                        $("#content #right-content").filter(function(){..children and other variables are populated inside here....})
                    }
 })

【问题讨论】:

  • 展示你如何检索 DOM 的代码,以及为什么你很难触发按钮点击
  • 我不知道如何使用cheerios从我的服务器触发按钮点击,我将通过编辑我的问题发布代码
  • 为避免被标记,我建议从问题中删除您要报废的网站。
  • 谢谢,我想您需要知道我遇到的问题是哪个网站,才能更好地理解代码。
  • Cheerio 不会在页面中加载 javascript,您也无法与之交互(点击等)。页面上使用 javascript 的任何内容都无法访问,ajax 就是其中之一。

标签: node.js screen-scraping cheerio


【解决方案1】:

总结一下你收到的所有cmet:

Cheerio 是受 jQuery 启发的简约 DOM 阅读器。它的设计侧重于读取数据,而不是浏览器模拟器,您可以在其中单击按钮。

另一种方法是使用无头浏览器,例如 PhantomJSCasperJS

这两个不在 Node.js 范围内,您可能很难将数据从 Node.js 来回传输到无头浏览器。

如果保留在 Node.js 环境中对您很重要,那么您可以使用JSDOM

所有这些都比 Cheerio 使用起来更复杂,但是如果你想操作 DOM,在 DOM 上执行 JavaScript 等等......那么这是你最好的选择。

【讨论】:

  • 感谢您的回答并澄清它,它非常适合我将开始工作的一些网站。但是我最初的问题仍未得到解答,为什么没有为具有相同 DOM 结构的所有链接填充子对象?
  • 如果它适用于 X,但不适用于 Y,其中 X == Y,那么您就违反了我们宇宙的基本定律 :) 您应该将 X 和 Y 转储到某个文件中,然后使用diff 或其他比较工具找出它们不同的原因,那么答案就很明显了
  • 谢谢,您的回答提供了很多信息,但我选择了我的回答,因为我认为它可能会帮助其他人解决问题,这可能在模块本身中。无论如何,您是否愿意用 JSDOM 为我指明正确的方向,我找不到任何有关模仿点击页面的相关文档。我发布了一个问题并获得了 2 票否决:(
【解决方案2】:

删除“tbody”标签解决了这个问题,一旦它们被删除,它就开始正常获取所有三个站点的数据。

【讨论】:

  • 不错,只用了 4 年 :) - 开个玩笑
猜你喜欢
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
相关资源
最近更新 更多