我是靠谱客的博主 动人香菇,最近开发中收集的这篇文章主要介绍继php使用curl爬取数据接口将字符串json转为json再讲返回的html页面取出图片路径和描述插入json数组中,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

https://blog.csdn.net/weixin_45237065/article/details/109726773

  1. 爬取接口之前需要能够访问到接口 访问接口需要登录成功后的cookie cookie只有登录之后才有 所以开始模拟登录

此为模拟登录的方法 需要参数 登录的url地址 登录的参数

/*
* 模拟post请求
根据
登录地址
登录参数
模拟登录
*/
private function MoNi_Login($url, $params = [])
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
//注意此USERAGENT
在浏览器上复制一串放上去
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36');
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($ch, CURLOPT_URL, $url);
// 执行 结束
$response = curl_exec($ch);
if ($response === FALSE) {
return false;
}
curl_close($ch);
return $response;
}
  1. 尝试一下模拟登录 调用一下该方法
	//首先得有登录的url地址
$url = "https://wqnmlgb.omg.amc/login";
//
模拟登录参数
$login_post_data = [
'username' => 'FBI',
'password' => 'open_the_door',
'rememberMe' => true
];
// 根据参数模拟登录
模拟登陆成功后
得到cookie
$re = $this->MoNi_Login($url, $login_post_data);
//返回值得到了
有响应头和响应体
根据这个响应数据
得到模拟登录的cookie 后面要用到
// 解析HTTP数据流
list($header, $body) = explode("rnrn", $re);
// 解析COOKIE
preg_match("/set-cookie:([^rn]*)/i", $header, $matches);
//请求的时候headers 带上cookie就可以了
$cookie = explode(';', $matches[1])[0];
//此时
模拟登录的cookie已经得到
拥有了这个cookie
就有了后续操作的资本
登录之后能访问的页面
带上这个cookie 咱都能访问
  1. cookie已经得到 访问其他接口获取返回数据
/**
//
根据 模拟登录成功的 cookie
请求 接口
* @param $url
接口地址
* @param $post_data
请求参数
* @param $cookie
模拟登录有效cookie
*/
private function post_data($url, $post_data, $cookie, $location = 0, $reffer = null, $origin = null, $host = null)
{
$post_data = is_array($post_data) ? http_build_query($post_data) : $post_data;
//产生一个urlencode之后的请求字符串,因为我们post,传送给网页的数据都是经过处理,一般是urlencode编码后才发送的
//请求头
$header = array( //头部信息,上面的函数已说明
'Accept:application/json, text/javascript, */*; q=0.01',
'Accept-Encoding:gzip, deflate, br',
'Accept-Language:zh-CN,zh;q=0.9',
'Connection:keep-alive',
'Content-Type:application/x-www-form-urlencoded; charset=UTF-8',
'Host: operation.edows.cn',
);
$curl = curl_init();
//这里并没有带参数初始化
curl_setopt($curl, CURLOPT_URL, $url);//这里传入url
curl_setopt($curl, CURLOPT_HTTPHEADER, $header)
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);//对认证证书来源的检查,不开启次功能
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);//从证书中检测 SSL 加密算法
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36');
//模拟用户使用的浏览器,自己设置,我的是"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0"
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, $location);
curl_setopt($curl, CURLOPT_AUTOREFERER, 1);//自动设置referer
curl_setopt($curl, CURLOPT_POST, 1);//开启post
curl_setopt($curl, CURLOPT_ENCODING, "gzip");
//HTTP请求头中"Accept-Encoding: "的值。支持的编码有"identity""deflate""gzip"。如果为空字符串"",请求头会发送所有支持的编码类型。
//我上面设置的是*/*
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);//要传送的数据
curl_setopt($curl, CURLOPT_COOKIE, $cookie);//以变量形式发送cookie,
// 因为上面获取的cookie用的是变量储存的
并没有用文件格式储存
//curl_setopt($curl, CURLOPT_COOKIEJAR, 'cookie.txt');//存cookie的文件名,
//curl_setopt($curl, CURLOPT_COOKIEFILE, 'cookie.txt');//发送
curl_setopt($curl, CURLOPT_TIMEOUT, 30);//设置超时限制,防止死循环
curl_setopt($curl, CURLOPT_HEADER, 1);
//需要 返回response header
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//
执行完毕
$result = curl_exec($curl);
// 此时这个result
已经是该次访问接口返回的信息
if (curl_errno($curl)) {
echo 'Curl error: ' . curl_error($curl);
exit();
}
//因为返回的信息会包括请求头
就是类似这样的返回信息 然后我只想要json数据
> HTTP/1.1 200
Server: nginx
Date: Fri, 20 Nov 2020 07:56:24 GMT
Content-Type: application/json;charset=UTF-8
Content-Length: 17893
Connection: keep-alive
Access-Control-Allow-Origin: https://operation.edows.cn
Vary: Origin
Access-Control-Allow-Credentials: true
//对返回的结果进行字符串处理
用curl自带的curl_getinfo()方法获取头的长度,然后使用substr来分割字符串
if (curl_getinfo($curl, CURLINFO_HTTP_CODE) == '200') {
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$header = substr($result, 0, $headerSize);
//响应头
$body = substr($result, $headerSize);
//响应体
}
curl_close($curl);
return $body;
//这个body就是完整的一个json返回体了(但是是字符串格式的 并不是json数组)
}
  1. 根据cookie爬取接口方法以完毕 测试一下

//
数据接口
地址
$url = "https://gnlm.cnmb.com/omg/xlhl/mdlist";
//模拟接口请求参数
$params = [
'page' => 1,
'limit' => 20,
'mlgb' => 'i’m mlxg'
];
$body = $this->post_data($url, $params, $cookie);
这样就得到了返回值
但是是字符串类型的.....
需要一个步骤
// 将 字符串类型json
转换为
json数组
$json_data = json_decode($body, true);
这样就转换成了json数组格式

欣赏一下返回的json 经过模拟登录拿到的cookie访问接口返回的返回体

{
"code":1001,
"count":2,
"data":[
{"id":666,"role":"美女"},
{"id":888,"role":"猛男"}
],
"message":"我的json数组
总条数请看count/数据请看data",
}
  1. 根据此json数组可以看出 data里面的两条数据 一个id是666 一个id是888
    可是这个数据字段也太少了 就描述了一个角色信息(连照片都没有)
    经过裤子都脱了你给我看这个?严重思考了一下,发现还有一个接口
    $img_url = “https://nglsg.ghs.com/cbyl/slm/getBeautifulGirlImgById”;
    根据字面意思可以里面 此接口需要id可以得到 图片 ٩(๑>◡<๑)۶
  1. 根据身体需要写出 根据id获取图片的方法
private function getBeautifulGirlImgById($img_url, $cookie, $location = 1)
{
$header = array(
'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Accept-Encoding:gzip, deflate, br',
'Accept-Language:zh-CN,zh;q=0.9',
'Connection:keep-alive',
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $img_url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36');
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, $location);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
curl_setopt($curl, CURLOPT_ENCODING, "gzip");
curl_setopt($curl, CURLOPT_HTTPGET, 1);
curl_setopt($curl, CURLOPT_COOKIE, $cookie);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
//对返回的结果进行字符串处理
用curl自带的curl_getinfo()方法获取头的长度,然后使用substr来分割字符串
if (curl_getinfo($curl, CURLINFO_HTTP_CODE) == '200') {
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$header = substr($result, 0, $headerSize);
//响应头
$body = substr($result, $headerSize);
//响应体
}
curl_close($curl);
return $body;
相同操作
根据接口地址和cookie请求得到返回数据
分割出身体部分~~~
}
  1. 测试一下获取图片的接口有没有效 因为这个json里面有两条id 直接遍历获取
将上面拿到的 $json_data
得到其中的data数据
$data = $json_data['data'];
// 遍历根据id 再次请求图片接口获取
图片插入json数组中
for ($i = 0; $i < count($data); $i++) {
$id = $data[$i]['id'];
//得到 图片的请求url
$img_url = "https://nglsg.ghs.com/cbyl/slm/**getBeautifulGirlImgById**";
$imgContent = $this->getImg($img_url, $cookie);
此时
迫不及待的查看这个 $imgContent
看看图片的内容
发现里面是整个的html代码
此时又要进行处理...................
将html中提取出
img 里的 src
alt

如何使用php从HTML提取img src,标题和alt?

http://codingdict.com/questions/12653
https://blog.csdn.net/t1174148618/article/details/106610214


因为 根据 id 得到的
图片 不止一张
所以需要遍历
// 根据接口返回的HTML页面
截取出
image与对应的alt
preg_match_all('/<img[^>]+>/i', $imgContent, $result);
$ret = array();
for ($j = 0; $j < count($result[0]); $j++) {
preg_match_all('/(id|alt|title|src)=("[^"]*")/i', $result[0]	[$j], $field);
foreach ($field[1] as $l => $v) {
$ret[$j][$v] = str_replace('"', '', $field[2][$l]);
}
}
//此时
这个
$ret
已经是有很多行图片的数组了

!!!但是还要给他提取出src中的图片路径!!!
for ($k = 0; $k < count($ret); $k++) {
if ($ret[$k]['alt'] == "beautifulgirl") {
$data[$i]['beautifulgirl'] = $ret[$k]['src'];
} elseif ($ret[$k]['alt'] == "beautifulgirlbody") {
$data[$i]['beautifulgirlbody'] = $ret[$k]['src'];
} elseif ($ret[$k]['alt'] == "果图") {
$data[$i]['fruitsImg'] = $ret[$k]['src'];
} elseif ($ret[$k]['alt'] == "niceB") {
$data[$i]['NBImg'] = $ret[$k]['src'];
}
}
}
此时再来打印出这个
$data
已经插入了图片字段
return json($data);
[{
"id":666,
"role":"女",
"beautifulgirl":"https://nglsg.ghs.com/cbyl/slm/nglsp666.jpg",
"fruitsImg":"https://nglsg.ghs.com/cbyl/slm/fruitsImg.jpg"},
{
"id":888,
"role":"猛男",
"NBImg":"https://nglsg.ghs.com/cbyl/slm/cowsB.jpg",
"beautifulgirlbody":"https://nglsg.ghs.com/cbyl/slm/FBIopenthedoor.jpg"
}]

大功告成,插入json中成功!

最后

以上就是动人香菇为你收集整理的继php使用curl爬取数据接口将字符串json转为json再讲返回的html页面取出图片路径和描述插入json数组中的全部内容,希望文章能够帮你解决继php使用curl爬取数据接口将字符串json转为json再讲返回的html页面取出图片路径和描述插入json数组中所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部