在每个循环中调用cheerio.load

时间:2015-07-06 09:20:34

标签: node.js meteor web-scraping cheerio

所以Meteor中的基本服务器JS scrapper。

模式有点简单。脚本查找某些链接,然后从中加载内容并将内容存储在变量中。

脚本在循环内加载cheerio时会一直崩溃。 捕获的地方在哪里?为此目的最好的实施是什么?

  Meteor.methods({
    loadPage: function () {
      result = Meteor.http.get("http://url.com");
      $ = cheerio.load(result.content);
      $('.class').each(function(i,elem){
        var link = $(this).attr('href');
        var title = $(this).text();
        var $ = cheerio.load(Meteor.http.get(link).content);
        var postContent = $('.classOnLoadedPage');
        Images.insert(
          {
            link: link,
            title: title,
            postContent:  postContent
          });
      });
    }
  });

1 个答案:

答案 0 :(得分:0)

我今天遇到了完全相同的问题。原来这是cheerio本身的问题。它的旧版本有这个bug。你必须使用更新的版本然后才能运行。

在atmospherejs class Product @@all_products = nil def self.all_products @@all_products end #You will have to call this right before getting the children products def self.cache_products if defined? @@all_products && @@all_products.nil? @@all_products = ActiveSupport::Cache::MemoryStore.new(expires_in: 5.minutes) list = Product.all.ordered.pluck(:id, :name, :parent_id) product_instances = [] list.each {|n| p = Product.new p.id = n.first p.name = n.second p.parent_id = n.third product_instances << p } @@all_products.write('products', product_instances) end @@all_products.read('products').select{|c| c.parent_id == nil} end def self.get_children(products) children = [] products.each do |p| children += Product.all_products.read('products').select { |j| p.id == j.parent_id }} end children end def self.products_with_no_children Product.where("id NOT IN (#{Product.all.pluck(:parent_id)})") end end 包装mrt:cheerio中下载次数最多的cheerio包,而npm中的当前版本为cheerio 0.12.3

添加cheerio 0.19.0而不是rclai89:cheerio,它会传递mrt:cheerio,并且在此版本中,循环内的加载效果非常好。