❤️❤️❤️❤️❤️❤️ 🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,欢迎加入人工智能交流群(看我的动态),更多周边福利等你🥳🥳🥳
✨✨欢迎订阅本专栏或者关注我,大家一起努力每天一题算法题✨✨
❤️❤️❤️ 最后,希望我的这篇文章能对你的有所帮助!
愿自己还有你在未来的日子,保持学习,保持进步,保持热爱,奔赴山海! ❤️❤️❤️
前景
今天接到一个单子,需求如图,大致的意思就是通过搜索引擎图片进行搜索,将缩略图保存到本地,并返回一维数组
于是我们通过对__图片的抓取
分析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=©right=&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=©right=&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=©right=&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观察对比文件名
、
测试成功!!!本次教程结束!!!顺便关注走一走[滑稽]