我有一些网站,例如http://example.com
我想生成一个站点地图作为URI列表,例如:
http://example.com/main
http://example.com/tags
http://example.com/tags/foo
http://example.com/tags/bar
我找到了一个很好的应用程序:iGooMap
iGooMap可以生成所需的URI列表作为文本文件(而不是XML文件)
以下是我想要实现的目标:
我想在Ruby中生成这种类型的站点地图(不是 Rails)。
我找到了SiteMapGenerator,但它只生成一个.XML文件,但是如上所述,我需要一个文本文件。
Ruby是否有解决方案为给定网站创建链接列表?
答案 0 :(得分:7)
你想要的不是Ruby中的站点地图生成器,而是Ruby中的 web spider 。我推荐Anemone
require 'anemone'
links = []
Anemone.crawl("http://www.foo.com/") do |anemone|
anemone.on_every_page do |page|
links << page.url
end
end
File.open('./link_list.txt', 'wb'){|f| f.write links.join("\n") }
这会产生一个名为link_list.txt
的文件,其中包含以下内容:
http://www.foo.com/
http://www.foo.com/digimedia_privacy_policy.html
修改:根据@ChrisCummings的建议,使用Set
代替Array
可能更好一点,以防止重复。我还建议按字母顺序对链接进行排序,这将使输出文件更易于人类阅读:
require 'anemone'
require 'set'
links = Set.new # Set will prevent duplicates
Anemone.crawl("http://www.foo.com/") do |anemone|
anemone.on_every_page do |page|
links << page.url.to_s # to_s needed in order to sort
end
end
File.open('./link_list.txt', 'wb') do |f|
f.write links.sort.join("\n") # call to sort added
end
答案 1 :(得分:3)
您可以使用自定义适配器扩展sitemap_generator
,例如:
require 'sitemap_generator'
require 'nokogiri'
module SitemapGenerator
class TextFileAdapter
def write(location, raw_data)
# Ensure that the directory exists
dir = location.directory
if !File.exists?(dir)
FileUtils.mkdir_p(dir)
elsif !File.directory?(dir)
raise SitemapError.new("#{dir} should be a directory!")
end
doc = Nokogiri::XML( raw_data )
txt = doc.css('url loc').map(&:text).join("\n")
open(location.path, 'wb') do |f|
f.write(txt)
end
end
end
end
SitemapGenerator::Sitemap.default_host = 'http://example.com'
SitemapGenerator::Sitemap.create(
:adapter => SitemapGenerator::TextFileAdapter.new,
:sitemaps_namer => SitemapGenerator::SitemapNamer.new(:sitemap, :extension => '.txt')
) do
add '/home', :changefreq => 'daily', :priority => 0.9
add '/contact_us', :changefreq => 'weekly'
end
SitemapGenerator::Sitemap.ping_search_engines
这会产生文件public/sitemap1.txt
:
http://example.com
http://example.com/home
http://example.com/contact_us