【问题标题】:Store crawled links in array, then calling a function to scrape those contents将抓取的链接存储在数组中,然后调用函数来抓取这些内容
【发布时间】:2016-10-26 20:49:14
【问题描述】:

我在显示多篇文章的商店页面上。我已经可以看到我通过“links_with”获得的所有文章链接。现在我想在一个新功能中抓取文章页面上的内容。我可以到达那里,但我只有一个地址,我想抓取包含内容的多个页面。有没有办法用数组和一些循环来解决这个问题?我是 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

【问题讨论】:

    标签: arrays ruby web-crawler nokogiri mechanize


    【解决方案1】:

    如果我理解正确,您可以使用 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
    

    【讨论】:

    • 谢谢!但是当我在 startCrawler 方法中时,我只有一个(最后一页)数组(当我打印 article_URL 时)。我想抓取每个页面的内容。我必须从哪里开始循环?
    • 不可能是这样的。在uniq 之后,article_links 的每个元素都会调用startCrawler
    猜你喜欢
    • 2021-06-22
    • 2023-03-30
    • 1970-01-01
    • 2020-10-06
    • 2019-04-02
    • 2020-06-16
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多