记一次爬取搜索引擎缩略图并保存到本地

简介: ✨✨欢迎订阅本专栏或者关注我,大家一起努力每天一题算法题✨✨❤️❤️❤️最后,希望我的这篇文章能对你的有所帮助!愿自己还有你在未来的日子,保持学习,保持进步,保持热爱,奔赴山海!❤️❤️❤️。.........
❤️❤️❤️❤️❤️❤️ 🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,欢迎加入人工智能交流群(看我的动态),更多周边福利等你🥳🥳🥳
在这里插入图片描述

✨✨欢迎订阅本专栏或者关注我,大家一起努力每天一题算法题✨✨

❤️❤️❤️ 最后,希望我的这篇文章能对你的有所帮助!

愿自己还有你在未来的日子,保持学习,保持进步,保持热爱,奔赴山海! ❤️❤️❤️

前景

今天接到一个单子,需求如图,大致的意思就是通过搜索引擎图片进行搜索,将缩略图保存到本地,并返回一维数组
在这里插入图片描述

于是我们通过对__图片的抓取
在这里插入图片描述
在这里插入图片描述

分析python代码

import requests

cookies = {
}

headers = {
    'Accept': 'text/plain, */*; q=0.01',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    'Referer': 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1658123529379_R&pv=&ic=0&nc=1&z=&hd=&latest=&copyright=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&dyTabStr=&ie=utf-8&sid=&word=%E8%BD%A6',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest',
    'sec-ch-ua': '".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
}

params = {
    'tn': 'resultjson_com',
    'word': '车',
    'rn': '2',
}

response = requests.get('https://image.baidu.com/search/acjson', params=params, cookies=cookies, headers=headers)
print(response.text)

得到的数据
在这里插入图片描述

由于客户对图片的要求不高,随机3个就可以,所以我在这里进行了处理,经过对代码的测试,发现cookie对接口不影响,最后筛选为这几个参数

params = {
    'tn': 'resultjson_com',#必须携带
    'word': '车',#关键字
    'rn': '2',#数据条数
}

不过!对方要的是php

这简单,通过转换即可

curl_get函数

function curl_get($url){
 
   $header = array(
    //   'Accept: application/json',
     'Accept:text/plain, */*; q=0.01',
    'Accept-Language:zh-CN,zh;q=0.9',
    'Connection:keep-alive',
    'Referer:https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1658123529379_R&pv=&ic=0&nc=1&z=&hd=&latest=&copyright=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&dyTabStr=&ie=utf-8&sid=&word=%E8%BD%A6',
    'Sec-Fetch-Dest:empty',
    'Sec-Fetch-Mode:cors',
    'Sec-Fetch-Site:same-origin',
    'User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
    'X-Requested-With:XMLHttpRequest',
    'sec-ch-ua:Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"',
    'sec-ch-ua-mobile:?0',
    'sec-ch-ua-platform:"Windows"',
    );
    $curl = curl_init();
    //设置抓取的url
    curl_setopt($curl, CURLOPT_URL, $url);
    //设置头文件的信息作为数据流输出
    curl_setopt($curl, CURLOPT_HEADER, 0);
    // 超时设置,以秒为单位
    curl_setopt($curl, CURLOPT_TIMEOUT, 1);
 
    // 超时设置,以毫秒为单位
    // curl_setopt($curl, CURLOPT_TIMEOUT_MS, 500);
 
    // 设置请求头
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    //设置获取的信息以文件流的形式返回,而不是直接输出。
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    //执行命令
    $data = curl_exec($curl);
 
    // 显示错误信息
    if (curl_error($curl)) {
        print "Error: " . curl_error($curl);
    } else {
        // 打印返回的内容
        return $data;
        curl_close($curl);
    }
}

网络图片保存方法
(保存在当前目录的img文件夹)

function file_exists_S3($url)

{

    $state = @file_get_contents($url,0,null,0,1);//获取网络资源的字符内容

    if($state){
        
        $random=rand(10,99999990);//防止重复

        $filename = date("dMYHis").$random.'.jpg';//文件名称生成

        ob_start();//打开输出

        readfile($url);//输出图片文件

        $img = ob_get_contents();//得到浏览器输出

        ob_end_clean();//清除输出并关闭

        $size = strlen($img);//得到图片大小

        $fp2 = @fopen('img/'.$filename, "a");

        fwrite($fp2, $img);//向当前目录写入图片文件,并重新命名

        fclose($fp2);

        return $filename;

    }

    else{

        echo 0;

    }

}

可以通过for循环即可,在保存的时候发现了一个bug,当循环到数据时 调用保存方法只保存了一张,这个bug是因为文件名的原因,当

date("dMYHis").'.jpg'
同一段时间命名的图片是一样的导致图片被覆盖

解决办法,通过随机数,上方代码已经修改了

最后完整的php代码

<?php
function curl_get($url){
 
   $header = array(
    //   'Accept: application/json',
     'Accept:text/plain, */*; q=0.01',
    'Accept-Language:zh-CN,zh;q=0.9',
    'Connection:keep-alive',
    'Referer:https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1658123529379_R&pv=&ic=0&nc=1&z=&hd=&latest=&copyright=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&dyTabStr=&ie=utf-8&sid=&word=%E8%BD%A6',
    'Sec-Fetch-Dest:empty',
    'Sec-Fetch-Mode:cors',
    'Sec-Fetch-Site:same-origin',
    'User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
    'X-Requested-With:XMLHttpRequest',
    'sec-ch-ua:Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"',
    'sec-ch-ua-mobile:?0',
    'sec-ch-ua-platform:"Windows"',
    );
    $curl = curl_init();
    //设置抓取的url
    curl_setopt($curl, CURLOPT_URL, $url);
    //设置头文件的信息作为数据流输出
    curl_setopt($curl, CURLOPT_HEADER, 0);
    // 超时设置,以秒为单位
    curl_setopt($curl, CURLOPT_TIMEOUT, 1);
 
    // 超时设置,以毫秒为单位
    // curl_setopt($curl, CURLOPT_TIMEOUT_MS, 500);
 
    // 设置请求头
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    //设置获取的信息以文件流的形式返回,而不是直接输出。
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    //执行命令
    $data = curl_exec($curl);
 
    // 显示错误信息
    if (curl_error($curl)) {
        print "Error: " . curl_error($curl);
    } else {
        // 打印返回的内容
        return $data;
        curl_close($curl);
    }
}

function file_exists_S3($url)

{

    $state = @file_get_contents($url,0,null,0,1);//获取网络资源的字符内容

    if($state){
        
        $random=rand(10,99999990);//防止重复

        $filename = date("dMYHis").$random.'.jpg';//文件名称生成

        ob_start();//打开输出

        readfile($url);//输出图片文件

        $img = ob_get_contents();//得到浏览器输出

        ob_end_clean();//清除输出并关闭

        $size = strlen($img);//得到图片大小

        $fp2 = @fopen('img/'.$filename, "a");

        fwrite($fp2, $img);//向当前目录写入图片文件,并重新命名

        fclose($fp2);

        return $filename;

    }

    else{

        echo 0;

    }

}

if ($_GET) {
$key_word=$_GET['key_word'];
$res=curl_get("https://image.baidu.com/search/acjson?tn=resultjson_com&word=$key_word&rn=3");
$res=json_decode(trim($res),true);
// 新建空数组
$backup=array();
for ($i = 0; $i < count($res['data'])-1; $i++) {

 //保存到本地
 
// echo $res['data'][$i]['thumbURL'];
$picture=file_exists_S3($res['data'][$i]['thumbURL']);
array_push($backup,$picture);
}
echo json_encode($backup);
} else {
die(
        json_encode(
            array(
            'code' => 400,
            'msg' => '参数错误'
        ),480)
);
}

测试流程:
通过对数据进行查询
在这里插入图片描述
2观察对比文件名
在这里插入图片描述

在这里插入图片描述

测试成功!!!本次教程结束!!!顺便关注走一走[滑稽]

相关文章
|
10月前
|
开发者 UED
|
存储 缓存 编解码
【FFmpeg 视频播放】深入理解多媒体播放:同步策略、缓冲技术与性能优化(一)
【FFmpeg 视频播放】深入理解多媒体播放:同步策略、缓冲技术与性能优化
555 0
|
监控 安全 自动驾驶
基于python的室内老人实时摔倒智能监测系统-跌倒检测系统(康复训练检测+代码)
基于python的室内老人实时摔倒智能监测系统-跌倒检测系统(康复训练检测+代码)
|
6月前
|
存储 编解码 UED
拥抱AVIF:提升网站加载速度的最佳实践,附Zola模板
AVIF(AV1图像文件格式)是一种高效、开源且免版税的图片格式,相比JPG和PNG,在视觉相似的压缩水平下,文件大小可减少50%。它支持有损与无损压缩、动画存储、Alpha通道、HDR及宽色域等特性。2024年起,现代浏览器已全面支持AVIF。通过使用HTML `<picture>`标签,可优先加载AVIF图片,同时兼容WebP格式,提升网站性能与用户体验。本文还分享了在Zola静态网站生成器中实现AVIF支持的方法,大幅降低图片文件体积,优化带宽与流量成本,实现技术升级与用户需求的双赢。
163 0
|
9月前
|
存储 关系型数据库 MySQL
从新手到高手:彻底掌握MySQL表死锁
通过本文的介绍,希望你能深入理解MySQL表死锁的概念、原因、检测方法及解决方案,并在实际开发中灵活应用这些知识,提升系统的稳定性和性能。
852 9
|
弹性计算 关系型数据库 MySQL
阿里云ECS使用docker搭建mysql服务
阿里云ECS使用docker搭建mysql服务
628 1
|
机器学习/深度学习 人工智能 数据可视化
号称能打败MLP的KAN到底行不行?数学核心原理全面解析
Kolmogorov-Arnold Networks (KANs) 是一种新型神经网络架构,挑战了多层感知器(mlp)的基础,通过在权重而非节点上使用可学习的激活函数(如b样条),提高了准确性和可解释性。KANs利用Kolmogorov-Arnold表示定理,将复杂函数分解为简单函数的组合,简化了神经网络的近似过程。与mlp相比,KAN在参数量较少的情况下能达到类似或更好的性能,并能直观地可视化,增强了模型的可解释性。尽管仍需更多研究验证其优势,KAN为深度学习领域带来了新的思路。
5071 5
|
存储 C语言 开发者
C标准库-time.h
`&lt;time.h&gt;` 是 C 语言标准库中的头文件,提供了处理日期和时间的功能。它定义了 `time_t`, `tm` 等类型及多种函数,如 `time()` 获取当前时间戳,`localtime()` 和 `gmtime()` 将时间戳转换为本地时间和 UTC 时间,`strftime()` 格式化时间,`mktime()` 将 `tm` 结构转换为时间戳,`nanosleep()` 暂停程序执行等。这些功能帮助开发者高效地进行时间相关的编程工作。
|
机器学习/深度学习 监控 算法
开源计算机视觉库OpenCV详解
开源计算机视觉库OpenCV详解
256 3