记一次用PHP做爬虫获取全市高考报考数据

发布于 / PHP / 0 条评论

去年使用了Python的BS4+Requests爬取了这个数据,但是不慎rm -rf / 了,这次使用PHP重新爬取一次。

本文仅供学习交流,不要干坏事哦~

首先打开招生考试信息网的查询页面:

1.JPG

然后输入自己的考生号:

3.JPG

查询结果是这个样子的。右键审查元素:

4.JPG

可以看到使用了iframe直接get后端服务器,返回结果是html。接着开始研究这个iframe。

直接访问:

5.JPG

行不通,网页做了防盗链,一般这样的防盗链都是检测header中的refer值,判断来路页面是不是自己域下的,我们使用PHP的Curl携带refer信息来模拟访问下:

<?php
    //$url和Referer相关敏感信息已删除
    $ch = curl_init($url);    
    curl_setopt ($ch, CURLOPT_HTTPHEADER, array ('Referer:xxxxx') );
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($ch);
    curl_close($ch);
    echo $output;

直接在Windows的cmd里面跑一下:

1.JPG

成了!!

接着想想如何解析这一坨HTML。

因为不会正则表达式,所以用了一种麻烦而且没有技术含量的方法:先删除空格、\t、\n,然后删掉无用的html。

首先删掉无用空格换行符:

function kill1($str) {
  $str=preg_replace('# #', '', $str);
  $str=str_replace("  ","",$str);
  $str=str_replace("\n","",$str);
  $str=str_replace("\r","",$str);
  $str=str_replace("\t","",$str);
  $str=str_replace("\0","",$str);
}

调用这个函数,打印下看看:

1.JPG

接着删掉无用的html就行了。这里有个小问题:怎么把姓名、学校、专业、录取批次给分离开呢?

观察html,这几项中间都隔着html标签,只要把html标签不全删,留下一个符号作为分隔符,使用explode就行了。

继续完善我们的kill函数:

function kill1($str) {
  $str=preg_replace('# #', '', $str);
  $str=str_replace("  ","",$str);
  $str=str_replace("\n","",$str);
  $str=str_replace("\r","",$str);
  $str=str_replace("\t","",$str);
  $str=str_replace("\0","",$str);
  $kill_s  =[
      '<html><HEAD><TITLE>内蒙古普通高校招生录取结果查询系统</TITLE></HEAD><bodyBGCOLOR="#FDF5E6"><divalign=center><CAPTION><STRONGSTYLE="COLOR:BLUE">您查询的录取结果为</STRONG></div><TABLEBORDER=1cellspacing=0align=centertitle=录取结果><TH><PALIGN=CENTER>考生号</TH><TH><PALIGN=CENTER>姓名</TH><TH><PALIGN=CENTER>录取院校</TH><TH><PALIGN=CENTER>录取专业</TH><TH><PALIGN=CENTER>录取批次</TH><TH><PALIGN=CENTER>计划性质</TH><TH><PALIGN=CENTER>录取方式</TH><TH><PALIGN=CENTER>录取时间</TH><TR><TD><PALIGN=CENTER>',
      '</TD><TD><PALIGN=CENTER>2016年</TD></TR></body></html>',
      '/TD><TD><PALIGN=CENTER>',
      
        ];
  $str=str_replace($kill_s,"",$str);
  //return $str;
  $str = mb_convert_encoding($str, "UTF-8", "GBK");
  $arr=explode("<",$str);
  return $arr;
}

调用函数,var_dump一下:

1.JPG

nice!!!

但是,问了同学考号的格式,发现考号不是连续的,所以程序必须判断出不存在的考号,这样的信息不能入库:

2.JPG

考号不存在的信息是这样的。

我们加一段代码:

$boo = is_int(strpos($output1,'未录取'));
if($boo != '1')=>入库
else =>不入库

加上自己使用medoo写的蹩脚的MySQL操作代码,程序就能挑选正确的数据进行解析入库了。

1.JPG

转载原创文章请注明,转载自: 斐斐のBlog » 记一次用PHP做爬虫获取全市高考报考数据
目前还没有评论,快来抢沙发吧~