继php使用curl爬取数据接口将字符串json转为json再讲返回的html页面取出图片路径和描述插入json数组中
https://blog.csdn.net/weixin_45237065/article/details/109726773
- 爬取接口之前需要能够访问到接口 访问接口需要登录成功后的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;}
- 尝试一下模拟登录 调用一下该方法
//首先得有登录的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("\r\n\r\n", $re);// 解析COOKIEpreg_match("/set\-cookie:([^\r\n]*)/i", $header, $matches);//请求的时候headers 带上cookie就可以了$cookie = explode(';', $matches[1])[0];//此时 模拟登录的cookie已经得到拥有了这个cookie 就有了后续操作的资本登录之后能访问的页面 带上这个cookie 咱都能访问
- 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);//这里传入urlcurl_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);//自动设置referercurl_setopt($curl, CURLOPT_POST, 1);//开启postcurl_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 headercurl_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 200Server: nginxDate: Fri, 20 Nov 2020 07:56:24 GMTContent-Type: application/json;charset=UTF-8Content-Length: 17893Connection: keep-aliveAccess-Control-Allow-Origin: https://operation.edows.cnVary: OriginAccess-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数组)}
- 根据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",
}
- 根据此json数组可以看出 data里面的两条数据 一个id是666 一个id是888
可是这个数据字段也太少了 就描述了一个角色信息(连照片都没有)
经过裤子都脱了你给我看这个?严重思考了一下,发现还有一个接口
$img_url = “https://nglsg.ghs.com/cbyl/slm/getBeautifulGirlImgById”;
根据字面意思可以里面 此接口需要id可以得到 图片 ٩(๑>◡<๑)۶
- 根据身体需要写出 根据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请求得到返回数据 分割出身体部分~~~}
- 测试一下获取图片的接口有没有效 因为这个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与对应的altpreg_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数组中相关推荐
- Python实训day07am【爬取数据接口、webdriver、自动化测试工具selenium】
Python实训-15天-博客汇总表 目录 1.网络爬虫-课后练习题 1.1.写法1 1.2.写法2 2.Selenium自动化测试工具 2.1.安装工具 2.2.命令行操作 直接爬取HTML (30 ...
- python为啥爬取数据会有重复_利用Python来爬取“吃鸡”数据,为什么别人能吃鸡?...
原标题:利用Python来爬取"吃鸡"数据,为什么别人能吃鸡? 首先,神装镇楼 背景 最近老板爱上了吃鸡(手游:全军出击),经常拉着我们开黑,只能放弃午休的时间,陪老板在沙漠里奔波 ...
- 利用linux curl爬取网站数据
看到一个看球网站的以下截图红色框数据,想爬取下来,通常爬取网站数据一般都会从java或者python爬取,但本人这两个都不会,只会shell脚本,于是硬着头皮试一下用shell爬取,方法很笨重,但旨在 ...
- python爬去新浪微博_!如何通过python调用新浪微博的API来爬取数据
python抓取新浪微博,求教 爬手机端 可以参考的代码, #-*-coding:utf8-*- import smtplib from email.mime.text import MIMEText ...
- python爬取内容_Python爬取数据(基础,从0开始)
1.技术概述 爬虫,就是给网站发起请求,并从响应中提取需要的数据的自动化程序,一般有三个步骤: (1)发起请求,获取响应 (2)解析内容 (3)保存数据 当初学习该技术是因为要做疫情网页,需要准确的疫 ...
- 教你如何使用Java代码从网页中爬取数据到数据库中——网络爬虫精华篇
文章目录 1:网络爬虫介绍 2:HttpClients类介绍 2.1 HttpGet参数问题 2.2 HttpPost参数问题 2.3 连接池技术问题 3:Jsoup介绍 4:动手实践如何抓取网页上数 ...
- python 12306查询不到车次_Python3.x 抓取12306车次信息,表格详情显示,让你学会思路,分析网站特点,爬取数据。12306车票查看器!...
我的例子都比较适合新手,那种老司机请绕道,谢谢! ps 前言 最近学习Python,所以呢?跟大家一样,都是看看官网,看看教程,然后就准备搞一个小东西来试试,那么我使用的例子是实验楼中的12306火车 ...
- 使用java爬取数据的三种思路
目录 一.使用HttpClient 二.使用HtmlUnit ->使用htmlUnit捕获百度搜索页面 三.捕获接口获取数据 一.使用HttpClient HttpClient是一种简单的捕获h ...
- Python爬取数据并写入MySQL
关于爬虫爬取数据并存入MySQL数据库(以东方财富网上的股票数据为例,网页:深南电A(000037)资金流向 _ 数据中心 _ 东方财富网) 第一步,创建数据库中的数据表 import request ...
最新文章
- 关于Cocoa Pods的升级安装和使用说明
- 重新捡起flask(二)
- ubuntu for nvidia-drivers for AI
- Java知识系统回顾整理01基础04操作符07Scanner
- 快来加入阿里云大学【云学院】班级助理招募—机会稍纵即逝,错过遥遥无期!...
- .NET6之MiniAPI(二十九):UnitTest
- linux 快速切换ip,linux-如何快速替换IP
- 制作 macOS High Sierra U盘USB启动安装盘方法教程 (全新安装 Mac 系统)
- 算法(四):图解狄克斯特拉算法
- 京东数科主导的首个Apache基金会项目ShardingSphere进入孵化器
- tplink无线网卡的linux,ubuntu上tp-link无线网卡驱动安装
- FPGA数字IC的Verilog刷题解析基础版02——T触发器(异步复位和同步复位)
- 019 Linux tcpdump 抓包案例入门可真简单啊?
- 美的程序不可能从修修补补中来。它必须完美的把握住事物的本质,否则就会有许许多多无法修补的特例(转)...
- windows删除文件夹时提示:你需要权限来执行此操作
- html+css实现京东、英雄联盟静态页面
- 银河linux看版本,下载Linux客户端 - 银河云盘 - 银河证券
- Android城市列表
- 存储管理系统课程设计——C语言实现请求页式存储管理模拟系统
- VMware esxcli定时开启虚拟机