【问题标题】:Making AJAX Applications crawlable without backend control使 AJAX 应用程序在没有后端控制的情况下可抓取
【发布时间】:2013-08-11 21:33:51
【问题描述】:

我构建了一个tool,它利用 EmberJS 和 GitHub Pages 创建了一个在浏览器中呈现的博客应用程序。它使用 JavaScript 获取 Markdown 文件并将它们呈现到应用程序的主体中。因为所有内容都是通过 AJAX 请求获取的,所以我不确定让 Google 等可以抓取内容的最佳方法。

我有 read many articles 建议使用 PhantomJS 处理 _escaped_fragment_ 请求,但由于内容托管在 GitHub 上,因此无法在服务器端运行任何东西。

是否有可能的解决方法(例如在将内容推送到 GitHub 之前提前渲染一些内容)还是我只是遇到了 JavaScript 应用程序的缺点?

【问题讨论】:

  • “服务器”只是托管在 GitHub 上的静态 Markdown 文件。
  • 所以,要访问您的站点,没有http://hodgesms.com/index.html。相反,我从 GitHub 加载一些东西,将其存储在我的计算机上并将文件加载到我的浏览器中?您没有用于启动和保存 js 链接的服务器吗?是吗?
  • EmberJS 应用程序托管在 Web 上(例如,在 GitHub 页面或任何其他主机上)。该应用程序一旦加载,就会进行 AJAX 调用以获取 Markdown 文件(内容)并将它们显示在浏览器中。这些文件可以托管在 GitHub 上,也可以托管在网络上的任何地方,但不,您不需要将它们下载到您的计算机上并呈现页面。所以是的,您可以通过http://hodgesmr.com 访问该网站。
  • 我认为您无法按照您描述的方式抓取它。您必须拥有具有不同路径部分的实际 URL,这些 URL 与包含在爬虫中的内容一起提供。它需要某种活动服务器来执行此操作或生成页面并存储它们。

标签: javascript ajax github ember.js seo


【解决方案1】:

问题是,Can googlebot do basic javascript?

如果没有,那么,没有。正如我所读到的,您的应用程序需要 JS 支持才能呈现任何页面。这使您没有机器人友好的访问方法。

如果是,那么,是的:

由于 JavaScript 可以通过 location.search 访问 url 参数,因此您可以创建合理的 URL 以供 Google 获取 href 属性,这些属性由您的 JS 应用程序解释,并在 onclick 属性中为用户覆盖。

<a href="/?a=My-Blog-Post" onclick="someFunc(this.href);return false;">

这将与您应用的 onload 中的代码配对,以寻找 location.search 并获取哪个 .md 可能出现在指定的 url 参数中(在您解析查询字符串之后),希望 Google 正在运行所说的 onload 以获取指定的内容。这是许多站点domain.com/#!ajax/path 样式路径的变体。两者都完全是客户端,但查询字符串变体将向 googlebot 指示该页面值得作为不同的 URL 获取。

您可以使用 http://google.com/webmasters 进行测试,它具有“作为 googlebot 获取”功能。

【讨论】:

  • 谢谢。我选择这个作为答案,因为我认为真正的答案实际上是“不”。由于爬虫不执行任何 JS,如果不完全重写应用程序,这似乎不太可能真正起作用。
【解决方案2】:

我创建了一个小模块来帮助它。看看http://alexferreira.github.io/seojs/

【讨论】:

  • 我在看这个。是否需要后端来运行 PhantomJS 或者是否可以提前完成所有工作,然后将静态文件推送出去?
【解决方案3】:

如果没有后端服务器做一些逻辑,它会有点棘手......

但也许是受到http://meta.discourse.org/t/seo-compared-to-other-well-known-tools/3914http://eviltrout.com/2013/06/19/adding-support-for-search-engines-to-your-javascript-applications.html 此处讨论的启发

您可以使用构建脚本在路由定义 post/:post_slug 之后在树中生成索引文件的副本,例如 /post/slug/index.html。每个页面都有一个&lt;noscript&gt; 标签,其中包含非常基本的内容和当前帖子的链接。您甚至可以在页面中预加载您的 CurrentPost JSON 哈希以节省一些 XHR。

这意味着使用对 IE 不太友好的 History API,但可能不是什么大问题。

【讨论】:

    【解决方案4】:

    你走近晚餐,吃了你的沙漠,然后盯着你的蔬菜。

    您真正想做的是首先在没有 AJAX 的情况下提供页面。一旦您在不需要 JavaScript 的情况下正确加载了页面,那么只需添加一个?ajax=1 您的所有请求。如果isset($_GET['ajax']),那么您可以避免加载页眉、页脚、侧边栏等。然后只需使用匿名window.onclick 并从那里插入。

    不使用任何第三方软件(包括框架)的 Web 3.0 技术示例视频全部使用您尝试创建的最严格的代码构建...

    http://www.youtube.com/watch?v=hZw8t-GVCB4

    请随意查看我网站上的 JavaScript。我很乐意在这个周末为您提供帮助。

    【讨论】:

    • 我没有使用任何后端代码来提供这些页面。我做不到isset($_GET['ajax'])
    【解决方案5】:

    你有一个构建脚本,为什么不在那里使用 PhantomJs 来生成静态网页?

    你可以正常提供静态页面,如果开启JS,可以重定向到AJAX页面。

    唯一的一点是,Ember-router-hyperlink 不适用于搜索引擎机器人。但我认为没有服务器代码绝对没有办法处理这个!

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 2014-05-30
      • 2018-03-13
      • 2012-09-05
      • 2023-03-24
      • 2019-08-13
      • 2013-09-26
      • 1970-01-01
      相关资源
      最近更新 更多