php抓取网页连接函数( 一个项目有关网站图标爬取经验分享出来的经验分享)

优采云 发布时间: 2021-10-07 08:31

  php抓取网页连接函数(

一个项目有关网站图标爬取经验分享出来的经验分享)

  

  最近的一个项目是关于网站图标爬取,所以分享一些经验点和解决方法。

  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>

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线