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

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

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

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/* * 模拟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. 尝试一下模拟登录 调用一下该方法
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//首先得有登录的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已经得到 访问其他接口获取返回数据
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/** // 根据 模拟登录成功的 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爬取接口方法以完毕 测试一下
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 数据接口 地址 $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访问接口返回的返回体

复制代码
1
2
3
4
5
6
7
8
9
10
11
{ "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获取图片的方法
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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 直接遍历获取
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
将上面拿到的 $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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
因为 根据 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);
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
[{ "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再讲返回内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部