【问题标题】:Get information from a web page (title, pictures, heads, etc...)从网页获取信息(标题、图片、头像等...)
【发布时间】:2023-03-25 00:40:01
【问题描述】:

在 Facebook 中,当您在墙上添加链接时,它会获取标题、图片和部分文本。我在其他可以添加链接的网站上看到了这种行为,它是如何工作的?它有名字吗?有没有实现它的 javascript/jQuery 扩展?

如果 facebook 被禁止进行跨站点 ajax 调用,那它怎么可能转到另一个网站并获取 html??

谢谢。

【问题讨论】:

标签: javascript jquery facebook


【解决方案1】:

基本方法

当触发 fetch 事件时(例如在 Facebook 上粘贴 URL),您可以使用 AJAX 请求 url*,然后根据需要解析返回的数据。

解析数据是一件棘手的事情,因为很多网站都有不同的标准。获取标题标签之间的文本是一个好的开始,同时可能搜索 META 描述(但随着搜索引擎演变为更复杂的基于内容的搜索,这些使用越来越少)。

如果做不到这一点,您需要某种方法来查找页面上最重要的文本并获取前 100 个字符左右,以及查找页面上最显眼的图片。

这不是一项简单的任务,尝试从这样一组流动且对比鲜明的数据(返回的通用网页)中获取语义是非常复杂的。例如,您可能会在页面上找到最大的图像,这是一个好的开始,但您怎么知道它不是背景图像?您怎么知道那是最能描述该页面的图片?

祝你好运!

*如果您不能直接使用 AJAX 第三方 URL,这可以通过在本地服务器上请求一个页面来完成,该页面通过某种 HTTP 请求获取远程页面服务器端。

一些额外的想法

如果您从远程服务器获取图像并将其“热链接”到您的网站上,那么当您尝试显示此图像时,许多网站有时会出现“反盗链”替换图像,因此比较请求的图像可能是值得的从您的服务器页面中获取实际获取的图像,这样您就不会意外显示任何令人讨厌的内容。

头部中的许多标题标签将是通用且非描述性的,如果有可用的标题,最好获取文章的标题(假设是文章类型的网站),因为它更具描述性,找到这个不过很难!

如果你真的很聪明,你也许可以背靠谷歌(不过请查看他们的 T&C)。如果用户请求某个 URL,您可以在后台 google 搜索它,并将返回的 google 描述性文本用作您的返回文本。如果谷歌显着改变他们的标记,虽然这可能会很快打破!

【讨论】:

    【解决方案2】:

    您可以使用 PHP 服务器端脚本来获取任何网页的内容(查找网页抓取)。 facebook 所做的是通过 ajax 调用 PHP 服务器端脚本,该脚本有一个名为

    的 PHP 函数
    file_get_contents('http://somesite.com.au'); 
    

    现在,一旦文件或网页被吸收到您的服务器端脚本中,您就可以过滤特定内容的内容。例如。 Facebook 的获取链接将通过正则表达式查找文件或网页的标题、img 和元属性="description 部分

    例如。 PHP的

    preg_match(); Function.
    

    这可以被收集然后返回到您的网页。

    您可能还需要考虑添加额外的函数来返回所需的数据,因为抓取某些页面可能需要比预期更长的时间才能返回所需的信息。例如。过滤掉不相关的东西,如 javascript、css、不相关的标签、巨大的图像等,使其运行得更快。

    如果您成功了,您可能正在着手构建网络搜索引擎,或者更好的是,从诸如黄页之类的网站收集数据,例如。电话号码、邮寄地址等。

    您可能还想进一步研究:

    get_meta_tags('http://somesite.com.au');
    

    :-)

    【讨论】:

    • 实际上我使用 C#,但我认为它可以解决问题。我将尝试从您所说的关于标题、元和 img 的内容开始,然后我将尝试做一些更复杂的事情。非常感谢!
    【解决方案3】:

    有几个 API 可以提供此功能,例如 PageMunch 允许您传入 url 和回调,以便您可以从客户端执行此操作或通过您自己的服务器提供它:

    http://www.pagemunch.com

    BBC 网站的示例响应如下所示:

    {
    "inLanguage": "en",
    "schema": "http:\/\/schema.org\/WebPage",
    "type": "WebPage",
    "url": "http:\/\/www.bbc.co.uk\/",
    "name": "BBC - Homepage",
    "description": "Breaking news, sport, TV, radio and a whole lot more. The BBC informs, educates and entertains - wherever you are, whatever your age.",
    "image": "http:\/\/static.bbci.co.uk\/wwhomepage-3.5\/1.0.64\/img\/iphone.png",
    "keywords": [
       "BBC",
       "bbc.co.uk",
       "bbc.com",
       "Search",
       "British Broadcasting Corporation",
       "BBC iPlayer",
       "BBCi"
    ],
    "dateAccessed": "2013-02-11T23:25:40+00:00"
    }
    

    【讨论】:

    • 还有哪些类似的服务和/或它们叫什么?
    【解决方案4】:

    您可以随时查看标签中的内容。如果您在 javascript 中需要它,那应该不会那么难。获得数据后,您可以执行以下操作:

    var title = $(data).find('title').html();
    

    问题在于获取数据,因为我认为大多数浏览器会阻止您发出跨站点 ajax 请求。您可以通过在您的网站上提供一项服务来解决此问题,该服务将充当代理并为您提出请求。但是,此时您不妨在服务器上解析出标题。由于您没有指定您的后端语言是什么,所以我现在不费心去猜测。

    【讨论】:

    • 好点,我完全忘记了。如何从您的页面获取另一个网站页面?脸书是怎么做到的?
    • Facebook 是用 PHP 编写的,因此他们将 AJAX 请求发送到“他们自己的”PHP 代码,然后再将请求发送到其他网站。如果你看得够深的话,我相信你会找到那个“代理页面”。 :)
    • 我明白了。我试图避免这一步,但似乎必须完成哈哈,谢谢!
    【解决方案5】:

    由于跨域策略,纯 JavaScript 不可能 - 客户端脚本无法读取其他域上的页面内容,除非其他域显式公开 JSON 服务。

    诀窍是发送服务器端请求(每种服务器端语言都有自己的工具),使用正则表达式或其他一些字符串解析技术解析结果,然后使用此服务器端代码作为“代理”到“在发布链接时飞”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多