1) do |anemone-6ren">
gpt4 book ai didi

Ruby Anemone 蜘蛛向访问的每个 url 添加标签

转载 作者:数据小太阳 更新时间:2023-10-29 08:01:38 24 4
gpt4 key购买 nike

我有一个抓取设置:

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 上使用 Google 分析反跟踪标签,而不一定真的点击链接。

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

我该如何实现?

最佳答案

您想在加载之前向 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

用于过滤 URL 列表的 focus_crawl 方法:

Specify a block which will select which links to follow on each page. The block should return an Array of URI objects.

但您也可以将其用作通用 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 编码。

关于Ruby Anemone 蜘蛛向访问的每个 url 添加标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7346933/

24 4 0