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

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

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

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

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

前景

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

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

分析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观察对比文件名
在这里插入图片描述

在这里插入图片描述

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

相关文章
|
数据采集 分布式计算 搜索推荐
使用Python实现网页中图片的批量下载和水印添加保存
使用Python实现网页中图片的批量下载和水印添加保存
|
5天前
|
数据采集 前端开发 JavaScript
除了网页标题,还能用爬虫抓取哪些信息?
爬虫技术可以抓取网页上的各种信息,包括文本、图片、视频、链接、结构化数据、用户信息、价格和库存、导航菜单、CSS和JavaScript、元数据、社交媒体信息、地图和位置信息、广告信息、日历和事件信息、评论和评分、API数据等。通过Python和BeautifulSoup等工具,可以轻松实现数据抓取。但在使用爬虫时,需遵守相关法律法规,尊重网站的版权和隐私政策,合理控制请求频率,确保数据的合法性和有效性。
爬取图片,以及对图片筛选,以及切换系统背景图片
爬取图片,以及对图片筛选,以及切换系统背景图片
|
3月前
|
数据采集 前端开发 测试技术
如何爬取瀑布流网页加载的内容
本文探讨了爬取瀑布流网页内容的策略。首先解析了其工作原理——通过Ajax请求动态加载数据,并介绍了利用浏览器开发者工具分析这些请求的方法。随后,文章讲解了如何使用Python模拟这些请求,处理动态加载的内容,并推荐了Selenium等自动化工具以简化流程。最后强调了在爬虫开发过程中需遵守网站规定及道德准则的重要性。
|
Python
一个爬取百度图片的脚本
一个爬取百度图片的脚本
48 1
|
6月前
爬取网络图片
爬取网络图片
94 0
|
6月前
|
搜索推荐
通过图片搜索引擎自动下载图片
通过图片搜索引擎自动下载图片
89 0
|
编译器 C++
C++ 抓取和批量下载网站上的图片或文件
C++ 抓取和批量下载网站上的图片或文件
343 0
|
数据采集
【详细步骤解析】爬虫小练习——爬取豆瓣Top250电影,最后以csv文件保存,附源码
【详细步骤解析】爬虫小练习——爬取豆瓣Top250电影,最后以csv文件保存,附源码
313 0
vba 在网页中抓取指定内容
vba 在网页中抓取指定内容
91 0