php抓取网页连接函数( 一个项目有关网站图标爬取经验分享出来的经验分享)
优采云 发布时间: 2021-10-07 08:31php抓取网页连接函数(
一个项目有关网站图标爬取经验分享出来的经验分享)
最近的一个项目是关于网站图标爬取,所以分享一些经验点和解决方法。
favicon 图标介绍
favicon.ico 通常用于 网站 标志。它显示在浏览器的地址栏、浏览器选项卡或采集夹上。它是一个缩写的标志,显示了网站的个性。
浏览器如何获取网站图标?
浏览器会首先分析请求的 URL 源代码的头部,找到具有 rel="icon" 属性的链接元素。href属性是图标地址,但不是所有的网站都会设置这个项目,有的网站我喜欢把favicon.ico直接放在根目录下进行SEO优化。因为搜索引擎爬虫会尝试请求网站根目录下的favicon.ico,久而久之,就在不知不觉中成为了行业规范。了解了网站图标的来源后,爬取的思路就可用了。
要求暴力
不管你的网站的根目录下有没有favicon.ico,我只想抓住它。至于能不能抓到,就试试你的运气吧(毕竟运气的概率还是很高的)。以我们官网()为例,PHP爬取代码如下:
$url = 'https://www.kunquer.com';
$content = file_get_contents($url.'/favicon.ico');
请原谅我没有一次把代码全部放出来,毕竟我要详细解释一下。如何判断检索到的内容是图标?也许它只是一个 404 页面?将内容保存到本地文件后,可以通过getimagesize()函数判断:
$file = tmpfile();
$path = stream_get_meta_data($file)['uri'];
file_put_contents($path, file_get_contents($Pea->url.'/favicon.ico'));
var_dump(getimagesize($path));
如果顺利,会打印如下内容:
array(6) { [0]=> int(48) [1]=> int(48) [2]=> int(17) [3]=> string(22) "width="48" height="48"" ["bits"]=> int(32) ["mime"]=> string(24) "image/vnd.microsoft.icon" }
上面的例子不能不成功,因为我们官网的根目录下有这个文件哈哈哈。为了演示后续的性能(另一种情况),我们以虾米网为例,访问/favicon.ico,得到如下反馈:
非常好!我们可以开始下一步了。
分析网页的源代码
当暴力请求失败时,我不得不抓取页面并分析源代码来获取图标,因为图标是放在head部分的链接中,浏览器是通过设置rel="icon"或rel=来设置的“快捷方式图标”来识别,我们只需要找出这部分的href,分析匹配代码如下:
$base = 'http://xiami.com';
preg_match('/(.*?)/is', file_get_contents($base), $head);
if(isset($head[1])) {
preg_match_all('/]+>/is', $head[1], $links);
if(isset($links[0]) && is_array($links[0])) {
foreach($links[0] as $link) {
// 查找rel中包含icon标识的图片路径
if(preg_match('/rel=("|\')?(icon\w?|\w+\s+icon)("|\')?/i', $link)) {
var_dump($link);
}
}
}
}
(恐怕格式不对,截图供参考)
上面,为了找到真相,通过逐步缩小搜索范围,我们得到了结果:
string(102) ""
是的,href 部分就是我们想要的图标:
<p>preg_match('/([^"\s>