Twitter 网站没有开放图表标签?

Twitter website doesn't have open graph tags?

我正在尝试让 url 预览(对于支持它们的网站)显示在我正在处理的项目中。我最近注意到 twitter urls 不再有 open graph meta 标签。我期待 og:title、og:description 等等,如果我没记错的话,它曾经存在于所有推特 links.

例如如果我看到此 link 的页面源:twitter.com/DalaiLama/status/1274998376338124800

除了 og:site_name,我没有看到 og 元数据。我也没有看到任何 twitter:title 或相应的内容。我错过了什么?

更新:原来查看源代码没有显示 og:title,但我确实在 Chrome 的“检查”菜单下看到了它。这是否意味着 JS 实际上有它但没有 HTML (它也只显示 og:title 而不是其他字段)?这是预期的吗?

Twitter 似乎允许 Facebook 爬虫查看他们的开放图标签。如果您可以将您的用户代理设置为类似于 facebook 爬虫站点 Troubleshooting 部分中描述的内容,则会显示完整的标签集。

$ curl -s --compressed -H "Range: bytes=0-524288" -H "Connection: close" -A "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)" "https://
twitter.com/sharifshameem/status/1284095222939451393" | grep -i 'og:'
    <meta  property="og:type" content="video">
    <meta  property="og:url" content="https://twitter.com/sharifshameem/status/1284095222939451393">
    <meta  property="og:title" content="Sharif Shameem on Twitter">
    <meta  property="og:image" content="https://pbs.twimg.com/ext_tw_video_thumb/1284094287383166977/pu/img/LsArMNT3djA7xg53.jpg">
    <meta  property="og:description" content="“I just built a *functioning* React app by describing what I wanted to GPT-3. &#10;&#10;I&#39;m still in awe. https://someurl”">
    <meta  property="og:site_name" content="Twitter">
    <meta  property="og:video:url" content="https://twitter.com/i/videos/1284095222939451393?embed_source=facebook">
    <meta  property="og:video:secure_url" content="https://twitter.com/i/videos/1284095222939451393?embed_source=facebook">
    <meta  property="og:video:type" content="text/html">
    <meta  property="og:video:width" content="1200">
    <meta  property="og:video:height" content="696">

不指定用户代理:

$ curl -s "https://twitter.com/sharifshameem/status/1284095222939451393" | grep -i 'og:'
  <meta property="og:site_name" content="Twitter" />

我无法通过仅解析 http 响应来使它工作。注册为 Twitter API 用户并调用他们的实验室端点非常有用。然后您可以解码结果 json.

Twitter 使用 client-side-rendering (CSR) 在浏览器中生成 HTML

直接查看源代码 不会 显示任何相关 <meta> 标签或实际页面 HTML 内容,因为它们都是动态生成的React 中客户端的浏览器使用 JavaScript(即 CSR: Client-side 渲染)。事实上,HTML 源将有一个存根,其中包含“我们检测到 JavaScript 在您的浏览器中被禁用。您想继续使用旧版 Twitter 吗?”。这可以通过打开开发人员工具并在页面 load/render 期间查看“元素”选项卡或在没有 JavaScript 仿真的情况下下载页面来验证。

但是,为了改进各种突出 web-crawlers 的搜索引擎优化 (SEO),Twitter 将改为 return server-side-rendered (SSR) HTML 内容( 是否包含 <meta> 标签)。这使抓取工具不必模拟 JavaScript 来查看页面,而只抓取原始 HTML 内容。 Twitter 根据提供的 User-Agent HTTP Header 识别爬虫。 Server-side-rendering 通常比将 HTML 渲染卸载到客户端更昂贵,这可能是 Twitter 选择 client-side-rendering 作为默认行为的原因。

绕过User-Agent白名单接收server-side-rendered(SSR)HTML

各种突出的 web-crawlers 被 Twitter 列入白名单以接收 server-side-rendered HTML。 通过在您自己的请求中欺骗 User-Agent HTTP Header,您可以绕过白名单并接收包含相关 <meta> 标签的 server-side-rendered HTML (是否推荐这个是完全不同的主题)。对于程序化 HTTP 请求,检查是否支持更改 HTTP 库中的 User-Agent HTTP Header - 大多数 non-trivial 库都支持此功能。

whatismybrowser.com有一个list of well known web-crawler User-Agent headers;其中一些网络爬虫被列入白名单(但不一定全部)。在撰写本文时,这里有一些可用的用户代理:

  • Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
  • Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
  • facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)
  • Mozilla/5.0 (compatible; Discordbot/2.0; +https://discordapp.com)