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("\r\n\r\n", $re);// 解析COOKIEpreg_match("/set\-cookie:([^\r\n]*)/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);//这里传入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数组)}
  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与对应的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数组中相关推荐

  1. Python实训day07am【爬取数据接口、webdriver、自动化测试工具selenium】

    Python实训-15天-博客汇总表 目录 1.网络爬虫-课后练习题 1.1.写法1 1.2.写法2 2.Selenium自动化测试工具 2.1.安装工具 2.2.命令行操作 直接爬取HTML (30 ...

  2. python为啥爬取数据会有重复_利用Python来爬取“吃鸡”数据,为什么别人能吃鸡?...

    原标题:利用Python来爬取"吃鸡"数据,为什么别人能吃鸡? 首先,神装镇楼 背景 最近老板爱上了吃鸡(手游:全军出击),经常拉着我们开黑,只能放弃午休的时间,陪老板在沙漠里奔波 ...

  3. 利用linux curl爬取网站数据

    看到一个看球网站的以下截图红色框数据,想爬取下来,通常爬取网站数据一般都会从java或者python爬取,但本人这两个都不会,只会shell脚本,于是硬着头皮试一下用shell爬取,方法很笨重,但旨在 ...

  4. python爬去新浪微博_!如何通过python调用新浪微博的API来爬取数据

    python抓取新浪微博,求教 爬手机端 可以参考的代码, #-*-coding:utf8-*- import smtplib from email.mime.text import MIMEText ...

  5. python爬取内容_Python爬取数据(基础,从0开始)

    1.技术概述 爬虫,就是给网站发起请求,并从响应中提取需要的数据的自动化程序,一般有三个步骤: (1)发起请求,获取响应 (2)解析内容 (3)保存数据 当初学习该技术是因为要做疫情网页,需要准确的疫 ...

  6. 教你如何使用Java代码从网页中爬取数据到数据库中——网络爬虫精华篇

    文章目录 1:网络爬虫介绍 2:HttpClients类介绍 2.1 HttpGet参数问题 2.2 HttpPost参数问题 2.3 连接池技术问题 3:Jsoup介绍 4:动手实践如何抓取网页上数 ...

  7. python 12306查询不到车次_Python3.x 抓取12306车次信息,表格详情显示,让你学会思路,分析网站特点,爬取数据。12306车票查看器!...

    我的例子都比较适合新手,那种老司机请绕道,谢谢! ps 前言 最近学习Python,所以呢?跟大家一样,都是看看官网,看看教程,然后就准备搞一个小东西来试试,那么我使用的例子是实验楼中的12306火车 ...

  8. 使用java爬取数据的三种思路

    目录 一.使用HttpClient 二.使用HtmlUnit ->使用htmlUnit捕获百度搜索页面 三.捕获接口获取数据 一.使用HttpClient HttpClient是一种简单的捕获h ...

  9. Python爬取数据并写入MySQL

    关于爬虫爬取数据并存入MySQL数据库(以东方财富网上的股票数据为例,网页:深南电A(000037)资金流向 _ 数据中心 _ 东方财富网) 第一步,创建数据库中的数据表 import request ...

最新文章

  1. 关于Cocoa Pods的升级安装和使用说明
  2. 重新捡起flask(二)
  3. ubuntu for nvidia-drivers for AI
  4. Java知识系统回顾整理01基础04操作符07Scanner
  5. 快来加入阿里云大学【云学院】班级助理招募—机会稍纵即逝,错过遥遥无期!...
  6. .NET6之MiniAPI(二十九):UnitTest
  7. linux 快速切换ip,linux-如何快速替换IP
  8. 制作 macOS High Sierra U盘USB启动安装盘方法教程 (全新安装 Mac 系统)
  9. 算法(四):图解狄克斯特拉算法
  10. 京东数科主导的首个Apache基金会项目ShardingSphere进入孵化器
  11. tplink无线网卡的linux,ubuntu上tp-link无线网卡驱动安装
  12. FPGA数字IC的Verilog刷题解析基础版02——T触发器(异步复位和同步复位)
  13. 019 Linux tcpdump 抓包案例入门可真简单啊?
  14. 美的程序不可能从修修补补中来。它必须完美的把握住事物的本质,否则就会有许许多多无法修补的特例(转)...
  15. windows删除文件夹时提示:你需要权限来执行此操作
  16. html+css实现京东、英雄联盟静态页面
  17. 银河linux看版本,下载Linux客户端 - 银河云盘 - 银河证券
  18. Android城市列表
  19. 存储管理系统课程设计——C语言实现请求页式存储管理模拟系统
  20. VMware esxcli定时开启虚拟机

热门文章

  1. GitHub学生开发包
  2. Python:实现natural sort自然排序算法(附完整源码)
  3. echarts实现某个市3D地图展示
  4. 读格林斯潘回忆录-9
  5. 3.7 杭电复试题2011
  6. 火山视窗正则表达式类库使用
  7. i386 、x86_64 、ppc是指
  8. ppc64le处理器国产power8服务器CentOS7.2安装open-jdk
  9. 如何修改C盘用户文件夹下的用户名
  10. 花三千万写出的十个 to B创业大坑(上)