资讯专栏INFORMATION COLUMN

使用php-curl模拟登陆中国田径协会查询自己的马拉松成绩

wenshi11019 / 2105人阅读

摘要:以下是我操作的具体代码释放资源对象,会很占用内存最后我们得到的数据结构如下前端的话,用的很乱,妹子都用了,正真的放一些代码吧每一项都要填写未查询到成绩再试试吧服务器开小差啦稍后再试

1、线上demo

http://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、流程

在实际做的过程中,我将第一步和第二步放在一起作为了一个接口(命名为-- 接口1)。获取验证码图片和PHPSESSIONID,代码如下:
其中关键操作在代码注释中--

.*)/",$line,$sessionArr);
fclose($handle);
$session = trimall($sessionArr["right"]," ");
$sessionString = "PHPSESSID=".$session.";";
$res = curlLogin($query_url,$cookie_file,$sessionString);

preg_match_all("/Set-Cookie:(.*);/iU",$res,$out);
$tmp = implode(";",$out[1]);

$cookieString = $sessionString.$tmp; //此变量围第二次请求使用的cookie值
echo json_encode(["data"=>$cookieString]);
exit;

function trimall($str)//删除空格
{
    $oldchar=array(" "," ","	","
","
");
    $newchar=array("","","","","");
    return
        str_replace($oldchar,$newchar,$str);
}

function showAuthcode( $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 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/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);
}

function curlLogin($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 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/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 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0");
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
    //用请求验证码接口获取的cookie作为本次请求的set-cookie 获取新的cookie文件,但是这里我们没有以文件形式存储而是直接输出,这样避免了多次文件IO的消耗。
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_setopt($ch, CURLOPT_HEADER, true);
    $contents = curl_exec($ch);
    curl_close($ch);
    return $contents;
}

我们从接口一获取到了要用的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);

function query($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 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/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;
}

function trimall($str)//删除空格
{
    $oldchar=array(" "," ","	","
","
");
    $newchar=array("","","","","");
    return
        str_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(".myScore tbody tr") as $kk => $e) {
    if($kk != 0){
        foreach ($e->children as $k => $child) {
            switch ($k){
                case 0: $out[$kk]["date"] = $child->plaintext ;break;
                case 1: $out[$kk]["name"] = trimall($child->plaintext) ;break;
                case 2: $out[$kk]["type"] = trimall($child->plaintext) ;break;
                case 3:
                    $out[$kk]["raceNetTime"] = $child->plaintext ;
                    if(strpos($out[$kk]["raceNetTime"],"PB") !== false){
                        $out[$kk]["pbColor"] = "pink";
                    }else{
                        $out[$kk]["pbColor"] = "";
                    }
                    break;
                case 4:$out[$kk]["raceTrueTime"] = $child->plaintext ;break;
//                case 5: $out[$kk]["raceDetailTime"] = trimall($child->innertext) ;break;
            }
        }
    }
}
//释放资源对象,会很占用内存
$htmlDom->clear();
unset($htmlDom);

最后我们得到的数据结构如下:

前端的话,用的很乱,vue,jq,layer,妹子UI都用了,正真的demo...
放一些JS代码吧:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26242.html

相关文章

  • 使用php-curl模拟登陆中国田径协会查询自己拉松成绩

    摘要:以下是我操作的具体代码释放资源对象,会很占用内存最后我们得到的数据结构如下前端的话,用的很乱,妹子都用了,正真的放一些代码吧每一项都要填写未查询到成绩再试试吧服务器开小差啦稍后再试 1、线上demo http://demo.blueyian.top/mara...完整的代码包请上gayhub取用。觉得有用的可以给个star :)地址:https://github.com/KongYia...

    zorpan 评论0 收藏0
  • 应对恶劣网络环境,为php-curl设置超时限制,防止服务器卡死

    摘要:引发什么问题了呢最核心的问题是香港处在国际网络环境,访问大陆服务器时经常会出现网络抖动的现象,非常无解。其中,负责配置,则负责执行即真正发送请求。 挖洋货这项目,因为没有公司的名头,也就无法备案,所以前端机放在阿里云香港ECS,另配一台阿里云杭州ECS来跑crontab——执行爬虫、保存图片到阿里云OSS等。最近觉得杭州ECS有点多余了(原本还有个杭州RDS的,统一搬到香港RDS了),...

    Faremax 评论0 收藏0
  • 二鱼和我,武汉,黑客拉松

    摘要:文中提到的每一位,都是为武汉黑客马拉松,为武汉的互联网贡献着自己的那份热情。武汉公司员工基本全体出动,全程参与,提供支持。今年的武汉黑客马拉松是第二届,因为有二鱼的这份执着,第二届武汉黑客马拉松才得以举办。 这个标题,不讲章法,我想从个人的视角来还原一下,一周前的黑客马拉松和我们对她的那份执着。文中提到的每一位,都是为武汉黑客马拉松,为武汉的互联网贡献着自己的那份热情。 我们我(吉佳盛...

    RobinQu 评论0 收藏0
  • 二鱼和我,武汉,黑客拉松

    摘要:文中提到的每一位,都是为武汉黑客马拉松,为武汉的互联网贡献着自己的那份热情。武汉公司员工基本全体出动,全程参与,提供支持。今年的武汉黑客马拉松是第二届,因为有二鱼的这份执着,第二届武汉黑客马拉松才得以举办。 这个标题,不讲章法,我想从个人的视角来还原一下,一周前的黑客马拉松和我们对她的那份执着。文中提到的每一位,都是为武汉黑客马拉松,为武汉的互联网贡献着自己的那份热情。 我们我(吉佳盛...

    Jonathan Shieber 评论0 收藏0
  • 微软“三朵云”在华团聚,能否改变云市场格局?

    摘要:月日微软宣布,其智能云的第三项核心服务,由世纪互联运营的智能商业云平台月日正式商用。至此,微软智能云三驾马车在中国团聚。在不少业内人士眼中,三朵云的遥相呼应,彼此共振尤其是的空降,将成为扰动中国云端格局的最重要一股变量。时至今日,已很少有人怀疑,就像第二次工业革命后人们用用电量衡量一个区域的文明程度一样,如今用云量已成为判断一家企业智能化水准的关键指标。根据Canalys报告显示,2018年...

    whlong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<