我一直在努力为我们正在建设的网站抓取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....}) } })
答案 0 :(得分:5)
总结您收到的所有评论:
Cheerio是受jQuery启发的简约DOM读者。它的设计专注于阅读数据,而不是浏览器模拟器,您可以点击按钮。
替代方案是使用无头浏览器,例如PhantomJS或CasperJS。
这两个在Node.js范围之外,您可能很难将Node.js中的数据来回传输到无头浏览器。
如果您要保留在Node.js环境中很重要,那么您可以使用JSDOM。
所有这些都比使用Cheerio更加复杂,但是如果你想操纵DOM,在DOM上执行JavaScript等等......那么这是你最好的选择。
答案 1 :(得分:0)
删除' tbody'标签解决了问题,一旦删除它就开始为所有三个站点正常获取数据。