【问题标题】:Ruby on Rails, How to determine if a request was made by a robot or search engine spider?Ruby on Rails,如何确定请求是由机器人还是搜索引擎蜘蛛发出的?
【发布时间】:2011-08-18 10:39:14
【问题描述】:

我有 Rails 应用程序,它记录从每个请求到特定 URL 的 IP 地址,但在我的 IP 数据库中,我发现 facebook blok IP 像 66.220.15.* 和 Google IP(我建议它来自 bot )。是否有任何公式可以根据请求确定 IP 是由机器人或搜索引擎蜘蛛发出的?谢谢

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 search-engine web-crawler


    【解决方案1】:

    另一种方法是使用crawler_detectgem:

    CrawlerDetect.is_crawler?("Bot user agent")
    => true
    
    #or after adding Rack::Request extension
    request.is_crawler?
    => true
    

    如果您想检测大量不同的机器人(超过 1000 个),它会很有用。

    【讨论】:

    • 这一用户使用|用户代理连接的正则表达式,但browser使用crawler_list.includes?(current)。这个可能更快
    【解决方案2】:

    我认为您可以使用 浏览器 gem 来检查机器人。

    if browser.bot?
      # code here
    end
    

    https://github.com/fnando/browser

    【讨论】:

      【解决方案3】:

      由于行为良好的机器人至少通常在它们发送的 UA 字符串中包含参考 URI,例如:

      request.env["HTTP_USER_AGENT"].match(/\(.*https?:\/\/.*\)/)
      

      是查看请求是来自机器人还是来自人类用户代理的一种简单方法。这似乎比尝试匹配一个综合列表更可靠。

      【讨论】:

      • +1 但是,对于这个巧妙的解决方案,请记住 Twitter 不遵循此规则,请改用 request.env["HTTP_USER_AGENT"].match(/Twitterbot\/1.0/)
      • 虽然这可能是捕获大多数搜索引擎机器人的聪明解决方案,但它不可维护并且很可能会错过许多机器人
      【解决方案4】:

      要求机器人(根据常识/礼貌比任何法律都更重要)发送用户代理及其请求。您可以使用request.env["HTTP_USER_AGENT"] 进行检查并根据需要进行过滤。

      【讨论】:

      • 谢谢 Ryan,是的,我制作了一系列机器人用户代理,例如:AM_I_ROBOT = ["googlebot","twitterbot", "facebookexternalhit", "google.com/bot.html", "facebook.com/externalhit_uatext.php", “tweetmemebot”、“sitebot”、“msnbot”、“robot”、“bot”]
      • 这里是用户代理列表:user-agents.org,带有 XML 提要:user-agents.org/allagents.xml
      • 这个要点从 user-agents.org 获取所有搜索引擎机器人和垃圾邮件发送者的名称,并将它们放入一个数组中:gist.github.com/1121578 这是一个很长的列表。
      • @sjors 这很好,只是数据库明显缺失,例如facebook 的 fetcher。
      • 偶然发现这颗宝石github.com/biola/Voight-Kampff。看起来它处理检查用户代理,因此您没有采取详尽的方法来列出与机器人相对应的用户代理。似乎是一个很好的快速解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多