【问题标题】:Exclude bots and spiders from a View counter in PHP从 PHP 中的查看计数器中排除机器人和蜘蛛
【发布时间】:2013-07-05 02:54:11
【问题描述】:

我已经用 PHP 为一个网站构建了一个非常基本的广告管理器。

我说基本是因为它不像 Google 或 Facebook 广告甚至大多数高端广告服务器那样复杂。不处理付款或任何事情,甚至不针对用户。

虽然只是简单地显示一个随机横幅广告、计算印象浏览次数和点击次数,但它适用于我的低流量网站。

特点:

  • 广告位/页面位置
  • 横幅图片
  • 姓名
  • 查看/展示次数计数器
  • 点击计数器
  • 开始和结束日期,或永无止境
  • 禁用/启用广告

不过,我希望逐步向系统添加更多功能。

我注意到的一件事是展示次数/观看次数计数器经常看起来膨胀。

我认为造成这种情况的原因是社交网络的蜘蛛和机器人以及搜索引擎蜘蛛。

例如,如果有人从我的网站页面输入一个 URL 到 Facebook、Google+、Twitter、LinkedIn、Pinterest 和其他网络,这些网站通常会爬取我的网站以收集网页标题、图像和描述。

我真的希望能够在没有实际用户查看页面时禁用此功能,使其不计为广告展示次数/浏览次数。

我意识到这将很难检测到所有这些,但如果有办法获得其中的大多数,至少它会使我的统计数据更加准确。

所以我正在寻求有关如何实现我的目标的任何帮助或想法?请不要说要使用其他广告系统,那是不可能的,谢谢

【问题讨论】:

  • 您应该考虑过滤用户代理。不过,聪明的机器人总是能够模拟浏览器。
  • 我建议在页面加载后使用页面上的横幅 id 发布 ajax 帖子。此外,您可以在 robots.txt 中禁止此更新脚本

标签: php ads web-crawler


【解决方案1】:

您需要使用 JavaScript 提供广告。这是避免大多数爬虫的唯一方法。只有浏览器加载依赖项,如图像、JS 和 CSS。 99% 的机器人都会避开它们。

你也可以这样做:

// basic crawler detection and block script (no legit browser should match this)
if(!empty($_SERVER['HTTP_USER_AGENT']) and preg_match('~(bot|crawl)~i', $_SERVER['HTTP_USER_AGENT'])){
    // this is a crawler and you should not show ads here
}

通过这种方式,您将获得更好的统计数据。 将 JS 用于广告。

PS您也可以尝试在 JS 中设置一个 cookie,然后再检查它。 爬虫可能会通过 HTTP 获取在 PHP 中发送的 cookie,但在 JS 中设置的是 99.9 % 的机会他们会错过它。因为他们需要加载一个 JS 文件并解释它。这只能由浏览器完成。

【讨论】:

  • 这个解决方案在这一点上似乎是最好的,但对于我不推荐的自行开发的广告应用程序,爬虫的发展速度非常快。随着越来越多的网站将使用js来验证用户,爬虫也将实现它......
  • @alexalex 不,他们不会,因为 JS 会响应用户输入。 鼠标、键盘等......因此爬虫无法生成该输入和轨道的所有组合JS 在做什么。谷歌在为预览拍摄页面快照时确实包含了 JS。但他们也卡在onLoad 层上,没有任何交互性。 所以...不。现在和可预见的将来,没有任何内部爬虫可以证明加载 JS 是合理的。
  • 我喜欢粗体字...emoticode.net/python/… 你所说的可预见是什么意思?怎么办?我们正在谈论一个广告管理器,所以我可以看到很多理由来创建一个会点击广告的爬虫......我只想说任何蜘蛛/机器人检测的解决方案,这个字段是一个只针对给定的解决方案时间->它必须不断更新...说最好使用js是正确的(我赞成答案)但这是可预见的未来的解决方案...我不太确定...
  • @alexalex 如果有人创建了一个专门的爬虫来点击广告,那就没有办法阻止它。但他想尽量减少误报。这意味着 99% 的爬虫(1% 知道 JS)。这比什么都好......
  • 这个答案不再正确。许多机器人(包括 Google)运行所有 JS 并在索引之前完全呈现页面,以处理越来越多的通过 AJAX(和单页应用程序)等动态加载其内容的网站。
【解决方案2】:

你可以这样做: 这里有一个很好的文本格式的爬虫列表:http://www.robotstxt.org/db/all.txt

假设您已将该文件中的所有用户代理收集到一个名为 $botList 的数组中

$ua = isset($_SERVER['HTTP_USER_AGENT']) ? strtolower($_SERVER['HTTP_USER_AGENT']) : NULL;

if($ua && in_array($ua, $botList)) {
  // this is probably a bot
}

当然,用户代理很容易更改或有时可能会丢失,但谷歌和雅虎等搜索引擎对自己是诚实的。

【讨论】:

  • -1 你不是在教他查看 256KB 的用户代理并比较字符串与这么多可能性!您不是在告诉他要扼杀他网站的性能!对吗?
  • 你检查过那个列表了吗?我说只取用户代理文本并将它们放入一个数组中。我的意思不是在运行时,一次是通过手动编码。这对性能几乎没有影响。顺便说一句,你的态度非常不具建设性。
  • 这是非常不具建设性的 :) 并且总是支持性能。阅读我的回复,了解我的态度。
  • 它也没有任何好处。您确实可以通过避免文件 i/o 来节省一些时间,但其中有大量条目 - 无论如何性能都会受到影响。除非您在云上运行并产生大量收入,并且可以负担多个处理器来浏览列表。抱歉,我和@CodeAngry 合作。
  • 这几乎是我最初的想法。不完全适用于所有这些,但就像所有社交网络和主要搜索引擎的主要搜索引擎一样,所以最多可能是 10 个。我确实认为 JavaScript 方法会更可靠
【解决方案3】:

爬虫会下载 robots.txt,即使它不尊重它并且出于好奇而这样做。这是一个很好的迹象,表明您可能正在处理一个问题,尽管还不确定。

如果爬虫在很短的时间内访问大量链接,您就可以检测到他。不过,这在代码中可能非常复杂。

但这只有在您不想或无法运行 Javascript 时才可行。否则请使用 CodeAngry 的答案。


编辑:响应@keune 的回答,您可以保留所有访问者 IP,并在 cron 作业中通过列表运行它们,然后发布更新的访问者计数。

【讨论】:

  • 我疯狂地爬网,但从不理会robots.txt ;) 另外,raw access logsgenerating the file in php 可以跟踪robots.txt 访问。它使事情有点复杂,并且不会阻止可疑的爬虫... 访问速度可以作为一个指标,但我几乎总是在爬网时从每个域加载一个页面。如果操作不当,可能会严重影响数据库写入访问。
  • 那你就是个粗鲁的蜘蛛。
  • 我是 SEO 蜘蛛。我们都是一样的 :) 当你需要不被注意的时候,你为什么要挺身而出……
【解决方案4】:

试试这个:

if (preg_match("/^(Mozilla|Opera|PSP|Bunjalloo|wii)/i", $_SERVER['HTTP_USER_AGENT']) && !preg_match("/bot|crawl|crawler|slurp|spider|link|checker|script|robot|discovery|preview/i", $_SERVER['HTTP_USER_AGENT'])) {
    It's not a bot
} else {
    It's a bot
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2015-07-13
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多