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

优采云 发布时间: 2022-03-07 21:19

  抓取php网页源码(

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

  

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

  favicon 图标的描述

  

  favicon.ico一般用于网站标志,显示在浏览器的地址栏、浏览器选项卡或采集夹中,是体现网站个性的缩写标志。

  浏览器是如何获得 网站 图标的?

  浏览器会先分析请求的URL源码的head部分,找到带有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="shortcut icon" 来识别,我们只需要找出这部分的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人工客服


线