PHP爬虫 爬取污染数据实例

PHP爬虫 爬取污染数据实例

标签(空格分隔): PHP HTML 爬虫


抓取的目标页面 http://www.pm25.com/city/shenzhen.html

抓取后输出的Json数组:
http://1.enigma2015.sinaapp.com/WebBots/lib/data2json.php
检查Json格式是否正确:http://web.chacuo.net/formatjson
此处输入图片的描述

可以被正常解析,格式无误。
思路:
1.获取页面
2.从页面提取出需要的值
3.为不同类型的值分别创建数组,并将获得的值按顺序依次填入相应数组
4.新建字符串,利用PHP的拼接符“.”将各个数组和自定义字符串拼接成合法Json字符串
5.输出字符串

开始!
我们先打开目标网页,确定我们需要抓取的数据。
这里我希望抓取的数据有:监测站点位置,AQI值,空气质量,PM2.5的值,和PM10的值。
然后用浏览器看源代码(“审查元素”),找到这些数据所在的代码块。观察其专属的标签属性。
不难发现:
所有的“监测站点”都放在了标签内
所有的“空气质量”都放在了标签内
所有的“AQI”值,PM2.5,PM10都放在了标签内
如下所示:

<a class="pjadt_location" href="/city/mon/aqi/深圳/荔园.html" title="查看荔园详细数据">荔园</a>
<em class="pjadt_quality_bglevel_1">优</em>
<span class="pjadt_aqi">39<i class=""></i></span>
<span class="pjadt_pm25">25 <em>μg/m³</em><i class=""></i></span>
<span class="pjadt_pm10">39 <em>μg/m³</em><i class=""></i></span>

想要抓取和解析的话,需要用到LIB_parse.php 解析库和 LIB_http.php PHP/CURL库

这里用到的函数有:
http_get 获取页面
parse_array 根据首末字符串截取出字符串,返回数组
remove 根据首末字符串删除字符串,返回字符串
implode 将数组转换为字符串
关键步骤:
找到所需数据所在标签的共同点
找到冗余标签的共同点
合理分块 再分别处理
具体步骤如下:

<?php 
//引入解析库和PHP/CURL解析库
include("LIB_parse.php");
include("LIB_http.php");
//下载页面
$web_page = http_get($target="http://www.pm25.com/city/shenzhen.html", $referer="");
//获取meta标签,并将其原封不动输出,用于保证编码格式和原网页一致
$meta_tag_array = parse_array($web_page['FILE'], "<meta", ">");
for($xx=0; $xx<count($meta_tag_array); $xx++){
echo $meta_tag_array[$xx]."\n";
}
//获取所有span标签,存入数组
$span_tag_array = parse_array($web_page['FILE'], "<span class=", "span>");
//获取所有带有pjadt_location属性的a标签,存入数组
$str_location = parse_array($web_page['FILE'], "<a class=\"pjadt_location","</a>");
//将数组转换为字符串
$str_location1 = implode($str_location);
//移除无用属性
$str_location2 = remove($str_location1, "class=\"pjadt_location\" h", "数据\"");
//找到字符串中所有a标签 存入location数组
$location = parse_array($str_location2, "<a","a>");
//移除标签 保留文本、数据
for($xx=0; $xx<11; $xx++){
$location_real[$xx] = remove($location[$xx], "<", ">");
}
$str_quality = parse_array($web_page['FILE'], "<em class=\"pjadt_quality","</em>");
$str_quality1 = implode($str_quality);
$str_quality2 = remove($str_quality1, "class=\"pjadt_quality", "_1\"");
$quality_temp = parse_array($str_quality2, "<em","em>");
//移除标签 保留文本、数据
for($xx=0; $xx<11; $xx++){
$quality[$xx] = remove($quality_temp[$xx], "<", ">");
}
$str0 = implode($span_tag_array);
$str1 = remove($str0, "<em", "em>");
$str2 = remove($str1, "<span class=\"pjadt_pm10\">PM1", "span>");
$str3 = remove($str2, "<span class=\"pjadt_pm25\">PM2", "span>");
$stri = remove($str3, "<i", "i>");
$aqi_temp = parse_array($stri, "<span class=\"pjadt_aqi\">","span>");
for($xx=0; $xx<11; $xx++){
$aqi[$xx] = remove($aqi_temp[$xx], "<", ">");
}
$pm25_temp = parse_array($stri, "<span class=\"pjadt_pm25","span>");
for($xx=0; $xx<11; $xx++){
$pm25[$xx] = remove($pm25_temp[$xx], "<", ">");
}
$pm10_temp = parse_array($stri, "<span class=\"pjadt_pm10","span>");
for($xx=0; $xx<11; $xx++){
$pm10[$xx] = remove($pm10_temp[$xx], "<", ">");
}
for($xx=0; $xx<count($aqi); $xx++){
$str[$xx] = "{\"location\":\"".$location_real[$xx]."\", \"AQI\":\"".$aqi[$xx].""."\", \"Quality\":\"".$quality[$xx].""."\", \"PM25\":\"".$pm25[$xx]."\", \"PM10\":\"".$pm10[$xx]."\"}";
}
//生成日期、时间,时间戳在生成json字符串的时候会被加入
$timeStamp = time();
$date = date("y-m-d",$timeStamp) ;
$time = date('H:i:s',time());
if( count($location) == 0 || count($aqi) == 0 || count($quality) == 0 || count($pm25) == 0 || count($pm10) == 0 ) 
{
$state_code = 1;
}else{
$state_code = 0;}
$infoStr = "\"info\":{\"state_code\":\"".$state_code."\", \"date\":\"".$date."\", \"time\":\"".$time."\"}";
$str_final = "{".$infoStr."\"Shenzhen\":[";
for($xx=0; $xx<(count($aqi)/2); $xx++){
$str_final = $str_final.$str[$xx];  
}
echo $str_final = $str_final."]}";
$mysql = new SaeMysql();
//将数据存入SAE数据库
for($xx=0; $xx<11; $xx++){
 $sql = "INSERT INTO `PollutionData`
      (`date`,`time`,`location`,`AQI`,`quality`,`PM25`,`PM10`) VALUES
      ('$date', '$time' , '$location_real[$xx]', '$aqi[$xx]','$quality[$xx]','$pm25[$xx]','$pm10[$xx]')";
      //执行插入数据的操作
      $mysql->runSql($sql);    
      }
      //数据库反馈是否成功录入信息
      if($mysql->errno() != 0 )
     {
        echo "<br/>录入失败<br/>";
        die( "错误:<br/>" . $mysql->errmsg() );
        }
        else
        {
        echo "<br/>数据录入成功!<br/>";
        }
        $mysql->closeDb();
        ?>

参考资料:《Webbots、Spiders和Screen Scrapers技术解析与应用实践》

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页