2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > PHP 获取网页标题(title) 描述(description) 关键字(keywords)等meta信息

PHP 获取网页标题(title) 描述(description) 关键字(keywords)等meta信息

时间:2023-08-31 13:29:52

相关推荐

PHP 获取网页标题(title) 描述(description) 关键字(keywords)等meta信息

米扑导航在收集网站、验证网站时,需要采集网页标题(title)、描述(description)、关键字(keywords)等meta信息

本文将其整理出来,总结的经验分享给大家,欢迎交流、斧正、改进。

本文原文转自米扑博客:PHP 获取网页标题(title)、描述(description)、关键字(keywords)等meta信息

1. PHP 内置函数 get_meta_tags

运行结果:

get_meta_tags 默认是 utf-8 编码,如果遇到 gbk、gb2312编码,则会出现乱码,

例如,爬取首页,其编码为 gb2312 则出现了乱码:

运行结果:

解决乱码,方法有二种(其实,方法有很多,这里先介绍两种)

方法1

需加上 header 头编码,正确代码格式如下:

方法2

通用的编码解决方案:

注意:charset=xxx 表示让浏览器自动适配正确的编码,不会造成乱码错误,header函数仅在PHP中使用

小结:

PHP 内置函数get_meta_tags 虽然可以获取meta信息,但是也有其缺点

1)可能会出现编码错误、中文乱码,如上 (UTF-8) 和 (GB2312)

2) meta 获取的信息不全面,例如米扑科技首页()还有<meta charset="utf-8"> 等meta标签没有包含显示出来

2. 爬取网页,正则匹配

爬取网页内容,然后进行正则匹配

1)爬取网页内容

2)正则匹配

这里,正则匹配的代码在网上也可以找到,但米扑科技对其进行了优化

优化1)兼容单引号、双引号,兼容content前后顺序,兼容 name 和http-equiv

优化2)不仅匹配keywords和description,还匹配了标题(title)、自定义网站归属认证(mimvp-site-verification)、友情链接检测(friend_link_status)

优化3)统计了正文网页大小,网页打开时间(上面代码没给出,可自己去实现,给出关键代码)

运行结果:

正则匹配,表面看似乎已经满足了需求,不仅匹配了keywords和description,还获得了title、自定义meta、特定友情链接判断等

实际上,这里的正则匹配仍然无法用于项目,因为其内藏的问题还有很多,例如:

网页编码、乱码问题,似乎可以用 header 函数来解决,但是content在前,name在后,匹配错误的问题,却没法解决!

例如,匹配大街网的结果如下(部分):

可见,site_keywords 中包含了<meta content=" 内容,原因看大街网的网页源码

匹配出错的原因,即上文我已经在注释里说明的:content在前,name在后,匹配错误(从第一个content开始,从最后一个name结束)

这里,使用get_meta_tags('');则不会出现上面的问题,但其无法获取标题title等meta信息

有没有更好的方法呢?既能获得正确的meta,又能获得title、自定义meta、特定字符串匹配(如友情链接)等

答案,当然是有的,但是需要自己写代码实现,且比正则匹配、get_meta_tags 的功能更加强大!

3. 改进网页正则匹配

前面的两个方法,并不能完全且完美的满足我们米扑科技的最基本的需求:

需求1) 正确的获取 keywords、description

需求2) 正确的获取 title、自定义meta、检测特定字符串(如友情链接)等

于是,自己动手写了

原理思路:

1)首先,正则匹配,获取全部的meta信息

2)然后,保存每一个meta的key和value到数组(实现了一个自己的get_meta_tags函数)

3)最后,提取 keywords和description

优化的正则匹配代码

运行结果,解决方法1 大街网的问题:

一切都在代码里,核心有两个:

1)匹配了所有meta信息,实现了自定义的get_meta_tags

2)解决网页乱码的问题,否则获取的数据是乱码或为空

正则匹配,基本可以解决一切问题了

但是用正则解决的问题,一般还会考虑有HTMP Parse解析来提取元素 element

4. HTML Dom 解析网页,提取元素内容

方法3 正则解析网页,是一个非常好的方法,这里再附加介绍一种 HTML Dom 解析,替换方法3的正则匹配即可

遇到问题,一般采用方法3 和 方法4,基本可以解决80%的网页抓取问题

此方法4和方法3,能够正常解析网页的前提是网页内容不能有乱码,

解决乱码详见方法1和方法3,深究代码,注释已给出了四种方法

下面给出测试case,供你验证乱码问题:

附上HTML <meta> 标签

定义和用法

<meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词。

<meta> 标签位于文档的头部,不包含任何内容。<meta> 标签的属性定义了与文档相关联的名称/值对。

HTML 与 XHTML 之间的差异

在 HTML 中,<meta> 标签没有结束标签。

在 XHTML 中,<meta> 标签必须被正确地关闭。

提示和注释

注释:<meta> 标签永远位于 head 元素内部。

注释:元数据总是以名称/值的形式被成对传递的。

必需的属性

可选的属性

总结

至此,本文比较详细、全面的总结了PHP获取网页标题(title)、描述(description)、关键字(keywords)等meta信息的多种方法

方法3,米扑科技自己写代码,改进了网页匹配,实现了获取全部meta信息,比PHP内置的get_meta_tags函数功能更加强大,也实现了一些自定义需求,基本满足了米扑科技的项目要求。其中,还有一些技术细节处理,需根据项目改进优化,这里就不给出了。

本文分析了抓取网页遇到的多种问题,并给出了一个比较完善的匹配解决方案,

本文基本可解决90%的网页匹配问题,余下的10%问题,在项目中遇到了就去逐步解决

例如,有些网站禁止了curl、wget爬虫,也有的强制需要cookie、referer、host等header参数

解决方案就是 PHP + Selenium + Firefox,通过虚拟浏览器爬取展现网页内容,并抓取其内容再解析,且听下文分解

应用实例

本文PHP匹配抓取网页,应用于米扑科技的项目有米扑导航、米扑代理、米扑博客、米扑域名等

为方便客户,米扑科技提供了对外的API接口:/api/header.php

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。