2011-09-08 35 views
3

我有一个爬设置:红宝石海葵蜘蛛中加入代码,每个URL访问

require 'anemone' 

Anemone.crawl("http://www.website.co.uk", :depth_limit => 1) do |anemone| 
anemone.on_every_page do |page| 
    puts page.url 
end 
end 

不过,我想使用谷歌,分析蜘蛛反跟踪标签上的每次访问并不见得网址实际上点击链接。

我可以使用蜘蛛一次并存储所有的URL,并使用WATIR来运行它们添加标签,但我想避免这种情况,因为它很慢,我喜欢skip_links_like和页面深度功能。

我该如何实现?

回答

3

想要在加载之前向URL添加内容,请更正此问题?您可以使用focus_crawl

Anemone.crawl("http://www.website.co.uk", :depth_limit => 1) do |anemone| 
    anemone.focus_crawl do |page| 
     page.links.map do |url| 
      # url will be a URI (probably URI::HTTP) so adjust 
      # url.query as needed here and then return url from 
      # the block. 
      url 
     end 
    end 
    anemone.on_every_page do |page| 
     puts page.url 
    end 
end 

focus_crawl方法旨在过滤URL列表:

指定块,将选择哪个环节跟踪每一页上。该块应该返回一个URI对象数组。

但您也可以将其用作通用URL过滤器。

例如,如果你想添加atm_source=SiteCon&atm_medium=Mycampaign到所有的链接,然后你会page.links.map这个样子:

page.links.map do |uri| 
    # Grab the query string, break it into components, throw out 
    # any existing atm_source or atm_medium components. The to_s 
    # does nothing if there is a query string but turns a nil into 
    # an empty string to avoid some conditional logic. 
    q = uri.query.to_s.split('&').reject { |x| x =~ /^atm_(source|medium)=/ } 

    # Add the atm_source and atm_medium that you want. 
    q << 'atm_source=SiteCon' << 'atm_medium=Mycampaign' 

    # Rebuild the query string 
    uri.query = q.join('&') 

    # And return the updated URI from the block 
    uri 
end 

如果你atm_sourceatm_medium包含非URL安全字符,那么URI编码他们。

+0

你能举个例子。如果我想将“thisstring”添加到每个网站? – Benjamin

+0

@Benjamin:将它添加到URL的哪个部分?作为CGI参数? –

+0

一个例子:“http://yahoo.co.uk/?atm_source=SiteCon&atm_medium=Mycampaign”在哪里我想为每个访问过的网址添加 “?atm_source = SiteCon&atm_medium = Mycampaign”。 – Benjamin