我在一个商店页面上显示了多篇文章。我已经可以看到我用"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