首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用node.js服务Backbone.js应用程序的内容,搜索搜索引擎优化爬虫

使用node.js服务Backbone.js应用程序的内容,搜索搜索引擎优化爬虫
EN

Stack Overflow用户
提问于 2012-09-16 09:44:27
回答 6查看 2.1K关注 0票数 19

要么是我的google-fu让我失望了,要么就是还没有太多的人这么做。正如您所知,Backbone.js有一个弱点--它不能为页面爬虫(比如googlebot )呈现的html提供服务,因为他们不运行JavaScript (尽管考虑到它的Google拥有自己的资源、V8引擎,以及JavaScript应用程序正在崛起这一令人警醒的事实,我预计有一天会发生这种情况)。我知道Google有一个hashbang的解决方案,但这只是一个糟糕的主意。另外,我正在使用PushState。这对我来说是一个极其重要的问题,我也希望对其他人也是如此。SEO是不可忽视的东西,因此对于许多需要或依赖的应用程序来说,不能考虑SEO。

输入node.js。我才刚刚开始进入这股热潮,但似乎有可能有相同的Backbone.js应用程序存在于客户端,在服务器上与node.js手牵手。然后,node.js将能够提供从Backbone.js应用程序呈现到页面爬虫的html。这似乎是可行的,但我正在寻找一个更有经验的node.js,甚至更好的人,谁真的做了这件事,建议我这一点。

我需要采取哪些步骤来允许我使用node.js向网络爬虫提供我的Backbone.js应用程序?而且,我的主干网应用程序使用了一个用Rails编写的API,我认为这会使这个问题不那么令人头痛。

编辑:我没有提到我已经有一个用Backbone.js编写的生产应用程序。我想把这个技术应用到那个应用程序上。

EN

回答 6

Stack Overflow用户

发布于 2012-10-11 08:32:27

首先,让我添加一个免责声明,我认为使用node.js是个坏主意。第二个免责声明:我做过类似的黑客攻击,但只是为了自动测试,而不是爬虫。

别挡道,我们走吧。如果您打算在服务器上运行客户端应用程序,则需要在服务器上重新创建浏览器环境:

  1. 最明显的是,您缺少了DOM ()--基本上就是您解析的HTML文档之上的AST。这方面的node.js解决方案是jsdom
  2. 然而,这是不够的。您的浏览器还公开了BOM (浏览器对象模型)--访问诸如history.pushState之类的浏览器功能。这才是棘手的地方。有两个选择:您可以尝试弯曲幻影卡珀尔运行您的应用程序,然后刮掉它的HTML。它是脆弱的,因为您运行的是一个巨大的完整的WebKit浏览器,UI部件被锯掉了。
  3. 另一个选项是僵尸,它是Javascript中浏览器特性的轻量级重新实现。根据它支持pushState的页面,但我的经验是,浏览器仿真还远远没有完成--不过,尝试一下,看看你能走多远。
票数 1
EN

Stack Overflow用户

发布于 2012-10-09 11:27:42

我将由您来决定是否将呈现引擎推送到服务器端是一个正确的决定。

因为Nodejs构建在V8 (Chrome)上,它将运行javascript,就像Backbone.js一样。创建您的模型等等都将以完全相同的方式完成。

Nodejs环境当然缺乏DOM。所以这是你需要重新创造的部分。我认为最受欢迎的模块是:

https://github.com/tmpvar/jsdom

一旦您在Nodejs中拥有了一个可访问的DOM,您只需像为一个典型的浏览器客户机(可能使用jQuery)那样构建它的节点,并使用呈现的HTML (通过$("myDOM").html()或类似的方式)响应服务器请求。

票数 0
EN

Stack Overflow用户

发布于 2012-10-09 22:39:47

我相信你可以采取后备战略的方法。考虑一下javascript关闭和一个链接单击vs js会发生什么情况。当javascript被关闭时,您在页面上所做的任何可以爬行的操作都应该有一些合理的回退过程。您的链接应该始终以href的形式链接到服务器,并且应该使用javascript防止默认操作的发生。

我不认为这一定是骨干的责任。我的意思是,在这里,主干可以帮助您修改页面更改时的URL,并使您的模型/集合同时成为客户端和服务器端。视图和路由器,我相信将严格客户端。

不过,您可以做的是让您的玉页和部分呈现从客户端或服务器端注入或不注入内容。通过这种方式,可以以任何一种方式呈现相同的页面。也就是说,如果您替换了页面的很大一部分并更改了url,那么您要获取的html可以来自同一个模板,就像有人直接进入该页面一样。

当您的服务器接收到请求时,它应该直接带您到该页面,而不是通过主入口点和负载主干,让它操作页面并以用户使用url的方式设置它。

我认为你应该能够做到这一点,只要在你的应用程序重新安排一些东西。没有真正的重写,只是移动了大量的东西。您可能需要编写一个控制器,该控制器将为您提供具有注入或不注入内容的html文件。这将帮助您的主干应用程序,它需要与从模型的数据相结合的html。就像我说的,当您通过express/node.js中定义的路由器直接访问这些链接时,可以使用相同的模板。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12445896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档