抓取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>