前言
不久前,我在哔哩哔哩更新了一则制作疫情监控接口的视频,当然,那期视频说的东西比较简单,如果想了解可以去看。 点击前往
当然,因为我之前没给大家教一些基础的东西,大家看着表示很迷,这期视频也不理想,所以,我把自己进阶接口源码发到这里吧。【我都怕自己忘了怎么写】
爬取准备
做一个这样的接口,我们肯定不能去自己产生这样的数据然后发布,这样显然是不合适的,但是,我们可以去爬取一些权威的网站,来给自己做接口。
接口选择
这里,我们选择的是搜狗的,因为他不仅仅可以返回疫情的信息,还可以返回疫情地图,这是非常棒的。另外,搜狗的数据更新也是很快,为了让大家能以最快速度获取到信息,这次我们选搜狗接口。
这些是对搜狗疫情页面源码的分析,下面源码会提到怎么样去获取这个json
源代码解释
全国疫情数据返回接口
本代码又其改进 新增市区精确
最初代码作者 https://imwcr.cn/
<?php
//函数部分 类似正则表达式但更精确的取中间字符串
//因为搜狗的json在网页源码当中,所有需要找个函数把不必要的东西去掉,只留下json
function getSubstr($str, $leftStr, $rightStr)
{
$left = strpos($str, $leftStr);
//echo '左边:'.$left;
$right = strpos($str, $rightStr,$left);
//echo '<br>右边:'.$right;
if($left < 0 or $right < $left) return '';
return substr($str, $left + strlen($leftStr), $right-$left-strlen($leftStr));
}
//ssl获取网页源码
function curl_get_https($url)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
$tmpInfo = curl_exec($curl);
curl_close($curl);
return $tmpInfo;
}
//搜狗接口地址
$url="http://sa.sogou.com/new-weball/page/sgs/epidemic";
$data=curl_get_https($url);//获取数据
$data=getSubstr($data,"window.__INITIAL_STATE__ =","</script>");
//解析分析
$data = json_decode($data, true);
//返回时间数据
echo $data["data"]["domesticStats"]["times"]."\r\n";
//对腾讯接口处理
$json_string = file_get_contents("https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5");
$json = json_decode($json_string, true);
$json = $json['data'];
$json = json_decode($json, true);
$json_time = $json['lastUpdateTime'];
//将腾讯和搜狗的数据结合,弥补搜狗数据片面不足
//输出所有数据
//这个是图片地址输出
echo "±img=".$data["data"]["mapStats"]["mapUrl"]."±";
//信息输出
echo "全国累计确".$data["data"]["domesticStats"]["diagnosed"];
echo " (较昨日+".$data["data"]["domesticStats"]["yesterdayIncreased"]["diagnosed"].")\r\n";
echo "当前疑似".$data["data"]["domesticStats"]["suspect"];
echo " (较昨日+".$data["data"]["domesticStats"]["yesterdayIncreased"]["suspect"].")\r\n";
echo "全国累计死亡".$data["data"]["domesticStats"]["death"];
echo " (较昨日+".$data["data"]["domesticStats"]["yesterdayIncreased"]["death"].")\r\n";
echo "全国累计救治".$data["data"]["domesticStats"]["cured"];
echo " (较昨日+".$data["data"]["domesticStats"]["yesterdayIncreased"]["cured"].")\r\n";
echo "境外输入:".$json['chinaTotal']['importedCase'].
"\n无症状感染者:".$json['chinaTotal']['noInfect'].
"\n疫情防控靠大家,联防联控 构筑群防群治抵御疫情的严密防线。";
如你看到的,我们可以对这个接口进行一个简单的json,就能获取到我们需要的值/
省区数据接口
$data=curl_get_https($url);//获取数据
$data=getSubstr($data,"window.__INITIAL_STATE__ =","</script>");
$data = json_decode($data, true);
$area=array();
$area=$data["data"]["area"];
$so = $_GET["type"];
$dq = $_GET["dq"];
//地区划分
//这里是在做什么?这里,我们把数据给一个临时的遍历函数,让它去匹配['provinceName']的值在哪些子项里会满足用户搜索的省区$_GET["type"]的参数值
$data = array_filter($area, function($t) use ($so) { return $t['provinceName'] == $so; });
//提取第一个数据
$data=array_shift($data);
//将这个数组的值输出
echo $catdir_so."信息\n";
echo "现存确诊".$data["currentConfirmedCount"]."\r\n";
echo "累计确诊".$data["confirmedCount"];
echo " (较昨日+".$data["yesterdayIncreased"]["confirmedCount"].")\r\n";
echo "累计死亡".$data["deadCount"];
echo " (较昨日+".$data["yesterdayIncreased"]["deadCount"].")\r\n";
echo "累计救助".$data["curedCount"];
echo " (较昨日+".$data["yesterdayIncreased"]["curedCount"].")\r\n";
echo "\n疫情防控靠大家,联防联控 构筑群防群治抵御疫情的严密防线。";
这个实际上我们使用了一个至关重要的函数array_filter(),回调函数过滤数组中的元素,这就为我们省去了很多功夫,你不必再去对数据截取分析,而是直接用函数来返回这些值,这样能大幅提高开发效率和接口的处理速度。
我们的思想是,先把数据抽出来,然后去写一个函数,这个函数来把每个列表子项的一个元素,去对比你设计传入函数的元素,直到全部筛选出来,然后返回这些素组,这时,我们只需要利用返回的数组,去解析返回数据,等于我们直接拿到了需要的数据文件。
市区精确 改进新增
//大区查询
$area = array();
$area = $data["data"]["area"];
$so = $_GET["type"];
$data = array_filter($area, function ($t) use ($so) {
return $t['provinceName'] == $so;
});
$data = array_shift($data);
if (!empty($data)) {
echo $catdir_so . "信息\n";
echo "现存确诊" . $data["currentConfirmedCount"] . "\r\n";
echo "累计确诊" . $data["confirmedCount"];
echo " (较昨日+" . $data["yesterdayIncreased"]["confirmedCount"] . ")\r\n";
echo "累计死亡" . $data["deadCount"];
echo " (较昨日+" . $data["yesterdayIncreased"]["deadCount"] . ")\r\n";
echo "累计救助" . $data["curedCount"];
echo " (较昨日+" . $data["yesterdayIncreased"]["curedCount"] . ")\r\n";
echo "\n疫情防控靠大家,联防联控 构筑群防群治抵御疫情的严密防线。";
} else {
echo "请输入省名 市区查询";
}
文末
这个教程就到这里了,因为我php懂的太浅,没办法细说,大家就多看源码,去理解,那么这篇文章就到这里啦!!!
发表回复