如何检测请求是来自prerender.io(爬虫)还是来自javacript中的真实用户(浏览器)?

时间:2017-05-02 06:42:23

标签: javascript angularjs seo prerender

我想检测请求是来自prerender.io(用于在来自爬虫的请求时呈现angularjs应用程序的库)还是来自真实用户。如果请求来自prerender,那么我必须重定向到仅页面专为SEO目的而设计。

我尝试设置cookie来检测但是它不起作用,因为prerender.io执行javascript代码甚至cookie /会话存储在prerender.io中工作。

经过一些研究,我发现我们可以检测到用户代理,因为prerender.io在无头浏览器中调用网站(即phantomJS)

if (/PhantomJS/.test(window.navigator.userAgent)) {
          //  console.log("PhantomJS environment detected.");
 } else {
        //  console.log("PhantomJS environment not detected.");    
  }

但它是否是此问题的永久/正确/最佳解决方案?还有其他解决方案吗?

4 个答案:

答案 0 :(得分:0)

检测来自GoogleBot的请求:

您可以按照Google在以下文章中的建议使用IP范围和UserAgent,以便在GoogleBot的情况下重定向。

https://support.google.com/webmasters/answer/80553

对于其他情况,您只能使用UserAgent,类似于您现在正在执行的操作。

答案 1 :(得分:0)

您可以查看" Prerender"在用户代理中但我不建议在检测到Prerender.io浏览器时更改页面内容,因为这被认为是隐藏真实内容。

您希望为抓取工具提供用户看到的同一页面的原始HTML。

答案 2 :(得分:0)

In their FAQ, you can see the UserAgent they use:

  

您的抓取工具的用户代理是什么?

     

Mozilla / 5.0(X11; Linux x86_64)AppleWebKit / 537.36(KHTML,例如Gecko)HeadlessChrome / 61.0.3159.5 Safari / 537.36 Prerender(+ https://github.com/prerender/prerender

您可以使用userAgent来了解请求是否来自其搜寻器。

答案 3 :(得分:0)

预渲染检测

根据 Prerender 文档,最好在用户代理中搜索 Prerender,而不是搜索字符串的任何其他部分,因为它们会不断升级其 Chrome 版本,因此这些可以随时更改。

var isPrerender = navigator.userAgent.toLowerCase().indexOf('prerender') !== -1;

https://docs.prerender.io/article/7-faq

永久/正确/最佳修复

我添加是为了完整性,因为其他答案中提到了 GoogleBot 检测。我知道的一个项目是这样建立的:

  • 当您的网络应用程序被调用时,需要检查用户代理,如果客户端是机器人,您应该调用预渲染,并且您需要传递所请求页面的网址。

  • Prerender 将转到页面,呈现它并返回一个 HTML,该 HTML 应在响应中发回。

  • 您的网址将被机器人访问两次,然后被预渲染访问。您也可以检测预渲染,并通过针对无头浏览器不起作用的解决方法、删除闪屏和设置 window.prerenderReady 标志 https://docs.prerender.io/article/11-best-practices 来使事情变得更容易。

  • 如果用户代理既不是机器人也不是预渲染,那么您可以像往常一样做事,无需调整即可为您的 Angular 应用提供服务。

机器人检测和预渲染调用发生在服务器端或在 http 调用到达您的应用程序之前拦截它们的解决方案中。有一些我熟悉的,列表并不详尽: