Паук Ruby Anemone добавляет тег к каждому посещенному URL - PullRequest
3 голосов
/ 08 сентября 2011

У меня настроено сканирование:

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-адресе и не обязательно фактически нажимал на ссылки.

Я мог бы использовать паука один раз, сохранить все URL-адреса и использовать WATIR , чтобы пробежаться по ним, добавив тег, но я хочу избежать этого, потому что он медленный, и мне нравятся функции skip_links_like и page глубина.

Как я могу это реализовать?

1 Ответ

3 голосов
/ 08 сентября 2011

Вы хотите добавить что-то в 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_source или atm_medium содержат не-URL-символы, безопасные, тогда URI-кодируйте их.

...