2

我在 Rails 应用程序中设置了滚动条。它不断报告记录未找到,这是由于 SEO 爬虫(即 Google bot、百度、findxbot 等)搜索已删除帖子的结果。

如何防止 rollbar 报告 SEO 爬虫活动。

4

3 回答 3

1

TL;博士:

# ./initializers/rollbar.rb
#
# https://stackoverflow.com/questions/36588449/how-to-prevent-rollbar-from-reporting-seo-crawlers-activities
# 
# frozen_string_literal: true

crawlers = %w[Facebot Twitterbot YandexBot bingbot AhrefsBot crawler MJ12bot Yahoo GoogleBot Mail.RU_Bot SemrushBot YandexMobileBot DotBot AppleMail SeznamBot Baiduspider]
regexp = Regexp.new(Regexp.union(*crawlers).source, Regexp::IGNORECASE)

Rollbar.configure do |config|
  ignore_bots = lambda do |options|
    agent = options.fetch(:scope).fetch(:request).call.fetch(:headers)['User-Agent']
    raise Rollbar::Ignore if agent.match?(regexp)
  end

  config.before_process << ignore_bots

  ...
end

=======================

如果您的 Ruby 版本低于 2.3 ,请小心使用魔术注释frozen_string_literal和使用=~match?

这里我使用了一个将被转换为正则表达式的数组。我这样做是因为我想防止将来开发人员的语法和转义相关错误,并出于同样的原因添加忽略大小写的东西。

所以在正则表达式中你会看到一个Mail\.RU_Bot, 而不是任何错误。

同样在您的情况下,您可以使用简单的单词bot而不是许多爬虫,但要小心不寻常的用户代理。就我而言,我想知道我网站上的所有爬虫,所以我想出了这个解决方案。工作部分的另一个例子:在我crawlercrawler4j生产站点上。我只crawler在数组中使用以防止通知他们两个。

我想说的最后一件事——我的解决方案不是非常理想,但它确实有效。我希望有人能分享我的代码的优化版本。这也是我推荐异步发送数据的主要原因,即使用sidekiq、delayed_job 或任何你想要的,不要忘记查看相关的wiki。

我的回答基于@AndrewSouthpaw 的解决方案(?),这对我不起作用。希望批准的 wiki-copy- pasteed @Jesse Gibbs 能够以某种方式进行审核。

=======

EDIT1:如果您需要防止滚动条通知 js ,检查https://github.com/ZLevine/rollbar-ignore-crawler-errors存储库是个好主意。

于 2018-03-18T02:49:52.387 回答
0

看起来你正在使用rollbar-gem,所以你想Rollbar::Ignore用来告诉 Rollbar 忽略由蜘蛛引起的错误

handler = proc do |options|
  raise Rollbar::Ignore if is_crawler_error(options)
end

Rollbar.configure do |config|
    config.before_process << handler
end

whereis_crawler_error检测导致错误的请求是否来自爬虫。

如果您使用rollbar.js检测客户端 Javascript 中的错误,则可以使用该checkIgnore选项过滤掉由机器人引起的客户端错误:

_rollbarConfig = {
  // current config...
  checkIgnore: function(isUncaught, args, payload) {
     if (window.navigator.userAgent && window.navigator.userAgent.indexOf('Baiduspider') !== -1) {
       // ignore baidu spider
       return true;
     }
     // no other ignores
     return false;
   }
}
于 2017-01-06T19:53:31.900 回答
0

这是我所做的:

is_crawler_error = Proc.new do |options|
  return true if options[:scope][:request]['From'] == 'bingbot(at)microsoft.com'
  return true if options[:scope][:request]['From'] == 'googlebot(at)googlebot.com'
  return true if options[:scope][:request]['User-Agent'] =~ /Facebot Twitterbot/
end

handler = proc do |options|
  raise Rollbar::Ignore if is_crawler_error.call(options)
end

config.before_process << handler

基于这些文档

于 2018-02-04T02:37:03.960 回答