实施付费专区:为避免隐藏付费专区通知的问题,我应该在 HTML 还是 JSON-LD 中指定它?
Implementing paywall: to avoid cloaking issues with paywall notice, should I specify it in the HTML or in the JSON-LD?
问题
Google 的文档中似乎无法识别“付费专区通知”。我试图让它对所有人可见,但从页面主题和内容中排除,而不会导致隐藏真实内容的问题。 我可以在 DOM 中执行此操作(例如使用 role
属性),还是我需要在 JSON-LD 标记中执行此操作?
背景
我正在使用客户端 JS 实现网站付费专区,结合了开放图形标记和 CSS 选择器。
实现基于 Google 在 https://developers.google.com/search/docs/advanced/structured-data/paywalled-content
的编程建议
此站点上有 3 种类型的内容,在此实现中,无论付费专区状态如何,服务器都会为每位访问者呈现所有 3 种内容:
- 免费内容,所有人都能看到;
- 付费专区通知,不是页面的一部分content/topic,仅在未登录时可见;和
- 付费内容,仅对登录用户和搜索爬虫可见。
类型 2 是导致问题的原因,Google 没有记录。
HTML
<html>
<head>
</head>
<body>
<div id="div-1" class="non-paywall">
All visitors can see this sentence, whether or not subscribed.
</div>
<div id="div-2" class="paywall-notice" role="dialog">
<!-- This element is the issue in question -->
If you are setting this notice, you are logged out our not subscribed. You cannot see the main content of this page. Please subscribe!
</div>
<div id="div-3" class="paywall">
This section is paid content.
If you can see it, you are a logged in subscriber or a verified crawler (e.g. googlebot or bingbot).
</div>
</body>
</html>
JSON-LD
{
"@context": "https://schema.org",
"@type": "WebPage",
"@id": "https:\/\/foo\/page\/#webpage",
"mainEntityOfPage": {
"@type": "Article",
"mainEntityOfPage": "https:\/\/bar\/article"
},
"isAccessibleForFree": "False",
"hasPart": [
{
"@type": "WebPageElement",
"isAccessibleForFree": "True",
"cssSelector": ".non-paywall"
},
{
"@type": "WebPageElement",
"isAccessibleForFree": "True",
"cssSelector": ".paywall-notice"
},
{
"@type": "WebPageElement",
"isAccessibleForFree": "False",
"cssSelector": ".paywall"
}
]
}
如果付费专区通知 (#2) 与 #1 一样对待,爬虫似乎有可能会认为它们是页面内容的一部分,并包括在与搜索意图相关性的评估中。
我找不到任何关于#2 存在的官方认可或如何处理它的指导,同时尊重 objective 付费专区标记并避免伪装问题。
Handling isAccessibleForFree for client side paywalls, and a related issue at https://webmasters.stackexchange.com/questions/117936/isaccessibleforfree-and-paywalled-content-delivered-to-googlebots 中有多种方法的组合,这些都没有解决我上面的原始问题。
最理想的是,我想按照 Google 想要的方式来实现...要是我知道那是什么就好了!
更多背景
为了能够向 googlebot 提供付费内容,服务器向所有访问者呈现相同的 HTML。
页面加载后,一些 JS 会检查访问者是否是 googlebot,如果是:
- 删除
.paywall-notice
element/s
- 显示
.paywall
element/s
对于非 googlebot 访问者,可能还会进行定期或交互驱动的检查以删除 .paywall
element/s,但如果标记正确地向 googlebot 显示那些 element/s 已付费。
您是否可以检测爬虫服务器端而不呈现 paywall-notice
元素?此标记的意义在于,您不会向 Googlebot 显示与普通匿名访问者不同的内容。我觉得只要你把文章的“付费”内容包裹在paywall
class你就不用担心因为隐藏真实内容而被处罚了。
在 wsj.com 上,我们有一个服务器端付费专区,因此当 Googlebot 访问该网站时,我们甚至不会像您在 paywall-notice
元素中那样呈现任何营销优惠。我们只是呈现完整的文章并将付费内容包装在 paywall
class 中。因此,如果可能的话,请向 Googlebot 发送不带付费专区通知元素的页面。
顺便说一下,nyt.com 有一个前端付费专区,他们在标记营销优惠方面没有做任何特别的事情。他们只是将付费内容标记为与您的示例相同。只需确保从 hasPart
数组中删除 paywall-notice
,因为它绝对不应该在那里。
问题
Google 的文档中似乎无法识别“付费专区通知”。我试图让它对所有人可见,但从页面主题和内容中排除,而不会导致隐藏真实内容的问题。 我可以在 DOM 中执行此操作(例如使用 role
属性),还是我需要在 JSON-LD 标记中执行此操作?
背景
我正在使用客户端 JS 实现网站付费专区,结合了开放图形标记和 CSS 选择器。
实现基于 Google 在 https://developers.google.com/search/docs/advanced/structured-data/paywalled-content
的编程建议此站点上有 3 种类型的内容,在此实现中,无论付费专区状态如何,服务器都会为每位访问者呈现所有 3 种内容:
- 免费内容,所有人都能看到;
- 付费专区通知,不是页面的一部分content/topic,仅在未登录时可见;和
- 付费内容,仅对登录用户和搜索爬虫可见。
类型 2 是导致问题的原因,Google 没有记录。
HTML
<html>
<head>
</head>
<body>
<div id="div-1" class="non-paywall">
All visitors can see this sentence, whether or not subscribed.
</div>
<div id="div-2" class="paywall-notice" role="dialog">
<!-- This element is the issue in question -->
If you are setting this notice, you are logged out our not subscribed. You cannot see the main content of this page. Please subscribe!
</div>
<div id="div-3" class="paywall">
This section is paid content.
If you can see it, you are a logged in subscriber or a verified crawler (e.g. googlebot or bingbot).
</div>
</body>
</html>
JSON-LD
{
"@context": "https://schema.org",
"@type": "WebPage",
"@id": "https:\/\/foo\/page\/#webpage",
"mainEntityOfPage": {
"@type": "Article",
"mainEntityOfPage": "https:\/\/bar\/article"
},
"isAccessibleForFree": "False",
"hasPart": [
{
"@type": "WebPageElement",
"isAccessibleForFree": "True",
"cssSelector": ".non-paywall"
},
{
"@type": "WebPageElement",
"isAccessibleForFree": "True",
"cssSelector": ".paywall-notice"
},
{
"@type": "WebPageElement",
"isAccessibleForFree": "False",
"cssSelector": ".paywall"
}
]
}
如果付费专区通知 (#2) 与 #1 一样对待,爬虫似乎有可能会认为它们是页面内容的一部分,并包括在与搜索意图相关性的评估中。
我找不到任何关于#2 存在的官方认可或如何处理它的指导,同时尊重 objective 付费专区标记并避免伪装问题。
Handling isAccessibleForFree for client side paywalls, and a related issue at https://webmasters.stackexchange.com/questions/117936/isaccessibleforfree-and-paywalled-content-delivered-to-googlebots 中有多种方法的组合,这些都没有解决我上面的原始问题。
最理想的是,我想按照 Google 想要的方式来实现...要是我知道那是什么就好了!
更多背景
为了能够向 googlebot 提供付费内容,服务器向所有访问者呈现相同的 HTML。 页面加载后,一些 JS 会检查访问者是否是 googlebot,如果是:
- 删除
.paywall-notice
element/s - 显示
.paywall
element/s
对于非 googlebot 访问者,可能还会进行定期或交互驱动的检查以删除 .paywall
element/s,但如果标记正确地向 googlebot 显示那些 element/s 已付费。
您是否可以检测爬虫服务器端而不呈现 paywall-notice
元素?此标记的意义在于,您不会向 Googlebot 显示与普通匿名访问者不同的内容。我觉得只要你把文章的“付费”内容包裹在paywall
class你就不用担心因为隐藏真实内容而被处罚了。
在 wsj.com 上,我们有一个服务器端付费专区,因此当 Googlebot 访问该网站时,我们甚至不会像您在 paywall-notice
元素中那样呈现任何营销优惠。我们只是呈现完整的文章并将付费内容包装在 paywall
class 中。因此,如果可能的话,请向 Googlebot 发送不带付费专区通知元素的页面。
顺便说一下,nyt.com 有一个前端付费专区,他们在标记营销优惠方面没有做任何特别的事情。他们只是将付费内容标记为与您的示例相同。只需确保从 hasPart
数组中删除 paywall-notice
,因为它绝对不应该在那里。