在Facebook中,当您向墙壁添加链接时,它会获得标题,图片和部分文字。我在其他可以添加链接的网站上看到过这种行为,它是如何工作的?它有名字吗?有没有实现它的javascript / jQuery扩展?
facebook怎么可能去另一个网站并获取html,据说禁止进行跨站点ajax调用?
感谢。
答案 0 :(得分:6)
基本方法
当触发获取事件时(例如在Facebook上粘贴URL),您可以使用AJAX请求url *,然后根据需要解析返回的数据。
解析数据非常棘手,因为很多网站都有不同的标准。在标题标签之间采用文本是一个良好的开端,同时可能搜索META描述(但随着搜索引擎演变为更复杂的基于内容的搜索,这些描述越来越少)。
如果做不到这一点,你需要一些方法来找到页面上最重要的文字,并取出前100个字符左右,以及找到页面上最突出的图片。
这不是一项微不足道的任务,尝试从这样一个流畅且对比鲜明的数据集(一般返回的网页)中导出语义非常复杂。例如,您可能会在页面上找到最大的图像,这是一个良好的开端,但您怎么知道它不是背景图像?你怎么知道那个最能描述那个页面的图片呢?
祝你好运!*如果您不能直接使用AJAX第三方URL,可以通过请求本地服务器上的页面来完成此操作,该页面通过某种HTTP请求获取远程页面服务器端。
一些额外的想法
如果您从远程服务器获取图像并在您的网站上“热链接”该图像,那么当您尝试显示此图像时,许多网站似乎有时会出现“反热链接”替换图像,因此可能需要比较请求的图像从您的服务器页面获取实际提取的图像,这样您就不会出现任何令人讨厌的事情。
头部中的很多标题标签都是通用的和非描述性的,如果有一个可用的标题,最好是获取文章的标题(假设文章类型网站),因为它会更具描述性,找到这个虽然很难!
如果你真的很聪明,你或许可以躲避谷歌(例如检查他们的T& C)。如果用户请求某个网址,您可以在后台谷歌搜索它,并使用返回的谷歌描述性文字作为返回文本。如果谷歌显着改变他们的标记虽然这可能会很快破裂!
答案 1 :(得分:4)
您可以使用PHP服务器端脚本来获取任何网页的内容(查找网页抓取)。 facebook所做的是通过ajax抛出对PHP服务器端脚本的调用,该脚本具有一个名为
的PHP函数file_get_contents('http://somesite.com.au');
现在,一旦文件或网页被吸入您的服务器端脚本,您就可以过滤特定内容。例如。 Facebook获取链接将查找标题,img和meta property =“通过正则表达式描述文件或网页的部分
例如。 PHP的
preg_match(); Function.
这可以收集然后返回到您的网页。
您可能还需要考虑添加额外的功能来返回您想要的数据,因为某些页面可能需要比预期更长的时间才能返回所需的信息。例如。过滤掉不相关的东西,如javascript,css,无关标签,巨大的图像等,以使其运行更快。
如果你对此感到失望,那么你可能正在建立一个网络搜索引擎或更好的方式,从像黄页这样的网站收集数据,例如。电话号码,邮寄地址等。
您也可以进一步了解:
get_meta_tags('http://somesite.com.au');
: - )
答案 2 :(得分:3)
有几个API可以提供此功能,例如,PageMunch允许您传入URL和回调,以便您可以从客户端执行此操作或通过您自己的服务器提供它:
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"
}
答案 3 :(得分:1)
您可以随时查看标签中的内容。如果你在javascript中需要它,那应该不那么难。获得数据后,即可:
var title = $(data).find('title').html();
问题在于获取数据,因为我认为大多数浏览器会阻止您制作跨站点ajax请求。您可以通过在您的网站上提供服务来解决这个问题,该服务将充当代理并向您提出请求。但是,此时您还可以解析服务器上的标题。由于你没有指定你的后端语言是什么,我现在不用再猜测了。
答案 4 :(得分:1)
由于跨域策略,纯JavaScript无法实现 - 客户端脚本无法读取其他域上的页面内容,除非该其他域明确公开JSON服务。
技巧是发送服务器端请求(每个服务器端语言都有自己的工具),使用正则表达式或其他一些字符串解析技术解析结果,然后使用此服务器端代码作为“代理”对AJAX调用“on the在发布链接时“飞”。