我有一个 angularjs 应用程序,我想在 Facebook 上共享页面。这是使用元标记(https://developers.facebook.com/docs/sharing/best-practices)处理的,但我不能用 js 更改元标记,因为 js 不是由 Facebook 的爬虫执行的。因此,我想在爬虫从服务器获取页面之前使用 prerender.io 来执行和呈现我的页面。
问题是我不确定我是否正确理解了文档(https://github.com/greengerong/prerender-java)。
这是来自 GitHub 上的 README.md 的示例 web.xml:
<filter>
<filter-name>prerender</filter-name>
<filter-class>com.github.greengerong.PreRenderSEOFilter</filter-class>
<init-param>
<param-name>prerenderServiceUrl</param-name>
<param-value>http://localhost:3000</param-value>
</init-param>
<init-param>
<param-name>crawlerUserAgents</param-name>
<param-value>me</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>prerender</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
经过一系列尝试使事情正确后,我发现如果我只是删除这部分:
<init-param>
<param-name>prerenderServiceUrl</param-name>
<param-value>http://localhost:3000</param-value>
</init-param>
我不必在 GAE 中处理 websockets(这给了我这个错误:'Caused by: java.net.SocketException: Permission denied: ...'),我可以使用已经部署在http://的默认值prerender.herokuapp.com。 问题 1) 使用默认服务与部署我自己的服务有何优缺点?
现在该服务似乎正在运行,并且我没有收到服务器错误 - 太棒了!
如文档 ( https://github.com/greengerong/prerender-java ) 中所述,我首先使用“我”作为用户爬虫代理。当使用“我”作为爬虫代理时,预渲染开始缓存我自己的 API 调用。例如,当我从服务器获取一堆项目时,prerender 返回一些 HTML 并使用我想要的 JSON 缓存 URI。所以现在我在 prerender.io 有一些兑现页面,但不完全是我想要缓存的页面:)。
所以我将 crawlerUserAgent 更改为:
<init-param>
<param-name>crawlerUserAgents</param-name>
<param-value>facebookexternalhit/1.1</param-value>
</init-param>
(我也尝试过 facebookexternalhit,FacebookUserExternalHit,...)。现在我没有在 prerender.io 上缓存任何页面,并且在 Facebook 的爬虫获取页面之前没有执行 javascript。查看调试器(https://developers.facebook.com/tools/debug/og/object/),它告诉我爬虫只能看到原始元标记,而不是我用 js 替换的元标记在不同的页面上(当我打开页面并检查元素时,元标记被替换)。
问题2)我这样做对吗?我应该尝试其他爬虫用户代理吗?facebookexternalhit 正确吗?