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