将已爬网的链接存储在数组中,然后调用函数来抓取这些内容



我在一个商店页面上显示了多篇文章。我已经可以看到我用"links_with"获得的所有文章链接了。现在我想在一个新函数中抓取文章页面上的内容。我可以到达那里,但我只有一个地址,我想抓取包含内容的多个页面。有没有一种方法可以用数组和someloop来解决这个问题?我是Ruby的新手,我自己无法解决这个问题。

def self.configureCrawler(page_URL)
  agent = Mechanize.new
  page = agent.get(page_URL)
  article_links = page.links_with(href: %r{.*/p/}) #all links with /p/ in address
  article_links.uniq { |link| link.uri }.each do |link| #no double entries
    link.click
    @target_URL = page.uri + link.uri #full url
    puts "#{@target_URL}"
  end
  startCrawler(@target_URL)
end

def self.startCrawler(article_URL) #the crawling process itself
  page = Nokogiri::HTML(open(article_URL))
  @id = page.css('CSS STUFF').text.
  @name = page.css('CSS STUFF').text
  @price = page.css('CSS STUFF').text
  #...
  puts "id: #{@id}"
  puts "name: #{@name}"
  puts "price: #{@price}"
end

如果我理解正确,您可以使用map而不是each
map也通过但返回值进行迭代。

试试这个

def self.configureCrawler(page_URL)
  agent = Mechanize.new
  page = agent.get(page_URL)
  article_links = page.links_with(href: %r{.*/p/}) #all links with /p/ in address
  article_links.uniq { |link| link.uri }.map do |link| #no double entries
    link.click
    target_URL = page.uri + link.uri #full url
    puts "#{target_URL}"
    startCrawler target_URL
  end
end

通过这种方式,self.configureCrawler将返回startCrawler调用的结果数组
此外,您不需要在self.startCrawler中使用实例变量(删除@(。

def self.startCrawler(article_URL) #the crawling process itself
  page = Nokogiri::HTML(open(article_URL))
  id = page.css('CSS STUFF').text.
  name = page.css('CSS STUFF').text
  price = page.css('CSS STUFF').text
  puts "id: #{id}"
  puts "name: #{name}"
  puts "price: #{price}"
  { id: id, name: name, price: price } # do not forget to return value, for example such hash
end

相关内容

  • 没有找到相关文章

最新更新