1.在线demohttp://demo.blueyian.top/mara...完整代码包请上gayhub。如果觉得有用,可以给个star:)地址:https://github.com/KongYian/m...2、截图2.1、首页2.2、查询结果3、实现3.1、分析目标网站我们的目标是http://www.runchina.org.cn/po...那么我们先来分析一下这个网站是如何实现结果查询的。尝试多次输入自己的查询信息,打开F12观察NetWork和Application中的数据,我们可以简单判断查询的大致流程如下图所示:在试错和检验的过程中,我们会发现这个网站的CRSF和其他保护没有任何问题,除了一个+-*/验证码,其余都是裸接口。3.2.流程在实际流程中,我把第一步和第二步放在一起作为一个接口(命名为——interface1)。获取验证码图片和PHPSESSIONID,代码如下:关键操作在代码注释--.*)/",$line,$sessionArr);fclose($handle);$session=trimall($sessionArr['right'],'');$sessionString="PHPSESSID=".$会话。';$res=curlLogin($query_url,$cookie_file,$sessionString);preg_match_all('/Set-Cookie:(.*);/iU',$res,$out);$tmp=implode(';',$out[1]);$cookieString=$sessionString.$tmp;//这个变量包围着第二次请求中使用的cookie值echojson_encode(['data'=>$cookieString]);exit;functiontrimall($str)//删除空格{$oldchar=array(""," ","\t","\n","\r");$newchar=array("","","","","");返回str_replace($oldchar,$newchar,$str);}functionshowAuthcode($authcode_url,$cookieFile){$curl=curl_init();curl_setopt($curl,CURLOPT_URL,$authcode_url);curl_setopt($curl,CURLOPT_COOKIEJAR,$cookieFile);//将获取的cookie以文件的形式保存curl_setopt($curl,CURLOPT_USERAGENT,'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.84Safari/537.36');curl_setopt($curl,CURLOPT_HEADER,0);curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);$img=curl_exec($curl);curl_close($curl);$fp=fopen("../image/verifyCode.jpg","w");//获取验证码的图片fwrite($fp,$img);fclose($fp);}functioncurlLogin($url,$cookiefile,$session){$headers=["Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8","Accept-Encoding:gzip,deflate","Accept-Language:zh-CN,zh;q=0.9","Connection:keep-alive","Cookie:".$session,"Host:www.runchina.org.cn","Upgrade-Insecure-Requests:1","User-Agent:Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.84Safari/537.36",];$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);curl_setopt($ch,CURLOPT_ACCEPT_ENCODING,"gzip,deflate,sdch");curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);curl_setopt($ch,CURLOPT_USERAGENT,"Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/49.0.2623.221Safari/537.36SE2.XMetaSr1.0");curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,30);curl_setopt($ch,CURLOPT_COOKIEFILE,$cookiefile);//将请求验证码接口获取的cookie作为本次请求的set-cookie,获取新的cookie文件,但是这里我们没有以文件的形式存储而是直接输出,这样就避免了多次的消耗文件输入输出curl_setopt($ch,CURLOPT_NOBODY,true);curl_setopt($ch,CURLOPT_HEADER,true);$contents=curl_exec($ch);curl_close($ch);return$contents;}我们从接口1拿到了要用的cookieString和验证码的图片,我们来模拟一下表单的提交。模拟提交代码如下:$query_url="http://www.runchina.org.cn/portal.php?mod=score&ac=personal";$idnum=$_POST['idnum'];$name=$_POST['name'];$code=$_POST['code'];$cookie=$_POST['cookie'];$params=['idnum'=>$idnum,'name'=>$name,'captcha_code'=>$code];$https=query($query_url,$params,$cookie);函数查询($query_url,$params,$cookie){$headers=["Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8","Accept-Encoding:gzip,deflate","Accept-Language:zh-CN,zh;q=0.9","Connection:keep-alive","Cookie:".$cookie,"Host:www.runchina.org.cn","Upgrade-Insecure-Requests:1","User-Agent:Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.84Safari/537.36",];$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$query_url);curl_setopt($ch,CURLOPT_POSTFIELDS,http_build_query($params));curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,10);curl_setopt($ch,CURLOPT_TIMEOUT,30);curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);$resp=curl_exec($ch);curl_close($ch);return$resp;}functiontrimall($str)//去除空格{$oldchar=array(""," ","\t","\n","\r");$newchar=array("","","","","");returnstr_replace($oldchar,$newchar,$str);}变量$https就是我们请求的结果,如果正确就是一个结果页面,如果没有数据或者出错就是没有数据,拿到页面之后我们就可以操作dom了,这里我用的是'simple_html_dom',大家可以google怎么吃。下面是我操作的工具代码:require_once'simple_html_dom.php';$htmlDom=str_get_html($https);$out=[];foreach($htmlDom->find('.myScoretbodytr')as$kk=>$e){if($kk!=0){foreach($e->childrenas$k=>$child){switch($k){案例0:$out[$kk]['date']=$child->纯文本;中断;案例1:$out[$kk]['name']=trimall($child->plaintext);break;案例2:$out[$kk]['type']=trimall($child->plaintext);break;情况3:$out[$kk]['raceNetTime']=$child->plaintext;如果(strpos($out[$kk]['raceNetTime'],'PB')!==false){$out[$kk]['pbColor']='pink';}else{$out[$kk]['pbColor']='';}休息;案例4:$out[$kk]['raceTrueTime']=$child->plaintext;break;//案例5:$out[$kk]['raceDetailTime']=trimall($child->innertext);休息;}}}}//释放资源对象,会占用大量内存$htmlDom->clear();unset($htmlDom);最后我们得到的数据结构如下:对于前端来说,用起来很乱,vue、jq、layer、girlUI都用到了。这是一个真正的演示...放一些JS代码: