Facebook抓取器无法加载动态Meta标签。

11

我正在使用以下函数(GWT)动态创建HTML元标记。它需要1秒钟才能在DOM上呈现。它的工作很好,除了Facebook之外。当我从我的网站分享链接时,爬虫获取的是HTML中的meta标签:none。我该怎么解决?

/**
* Include the HTML attributes: title, description and keywords (meta tags)
*/
private void createHTMLheader(MyClass thing) {

    String title=thing.getTitle();
    String description=thing.getDescription();

    Document.get().setTitle(title);

    MetaElement metaDesc = Document.get().createMetaElement();
    metaDesc.setName("description");
    metaDesc.setContent(description);
    NodeList<Element> nodes = Document.get().getElementsByTagName("head");
    nodes.getItem(0).appendChild(metaDesc);
}

这是DOM中生成的HEAD。标题aaaa和meta-description已经通过动态方式加载。(感谢CBroe给的提示)。在“查看源代码”功能中,这些动态标记不会被显示出来(只会在开发工具-视图DOM中显示)。

<head>
    <title>aaaa</title>
    <meta content="text/html; charset=utf-8" http-equiv="content-type">
    <meta name="description" content="My description">

    <script language="javascript" type="text/javascript" src="dialective/dialective.nocache.js"></script><script defer="defer">dialective.onInjectionDone('dialective')</script>

</head>

原始的HTML没有TITLE或META-DESCRIPTION标签。


1
你能展示一下它实际生成的HTML吗? - Mike Christensen
1
谢谢。刚刚添加了<head>。 - user411103
1
你是在尝试使用Java应用程序添加HTML标签吗?Facebook爬虫不会运行你的Java代码。它将看到你的Web服务器发送的内容。 - Mike Christensen
没错。下面的代码在客户端运行(一个 GWT presenter)。所以没有办法完成这个任务吗?谢谢。 - user411103
不行。在服务器上生成元标签。 - Mike Christensen
你能告诉我你是如何解决这个问题的吗? - user2099451
2个回答

12
Facebook爬虫只能查看服务器原始HTML响应中包含的标签。它不足以运行任何JavaScript代码、Flash插件、Java小程序或其他完整浏览器可能运行的内容。
您需要使用服务器端框架在服务器上生成这些标签。
此外,Facebook提供了一个方便的测试工具,以确保您的页面公开适当的meta标签。您可能还需要添加OpenGraph标签,例如og:title和og:description。

嗨Mike,你提到Facebook爬虫只能看到原始的HTML是我发现的问题,因为我遇到了与OP相同的问题。然而,我想如果我在对DOM进行更改后使用$.getScript加载AddThis,那么FB只会到达使用新DOM进行爬取的地方。但这不可能吗?我担心当AddThis触发并且FB分享被点击时,URL被传递给FB,然后它会独立爬取分享URL,但该URL没有经过JavaScript编辑的元标记。你对此有什么想法吗?丹尼尔。 - daniel blythe
谢谢!很有道理。如果页面是动态生成的,比如WordPress的活动帖子,那么这样做就不可能了吗? - undefined

-2
由于某些原因,上述函数未加载元描述...
这是因为您只是创建了一个新的MetaElement - 但您没有对其进行任何操作。
您需要将其附加到文档中,更具体地说是附加到其head元素。
类似以下内容:
getHead().appendChild(metaDesc)

缺失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接