我有一个抓取设置:
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
但是,我希望蜘蛛在其访问的每个网址上使用Google分析反跟踪代码,而不一定实际点击链接。
我可以使用蜘蛛一次并存储所有的URL并使用WATIR来运行它们添加标记,但我想避免这种情况,因为它很慢,我喜欢skip_links_like和页面深度函数。 / p>
我怎么能实现这个?
答案 0 :(得分: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
方法:
指定一个块,该块将选择每个页面上要遵循的链接。该块应该返回一个URI对象数组。
但您也可以将其用作通用网址过滤器。
例如,如果您想将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_source
或atm_medium
包含非URL安全字符,则对其进行URI编码。