资讯专栏INFORMATION COLUMN

PHP纯手写正则爬取星座屋网站星座运势数据

golden_hamster / 1661人阅读

摘要:星座屋运势界面最终爬取数据结果展示在上的效果下面就是使用正则实现的代码,是自己一年多前花了半天时间写的。

星座屋(http://www.xzw.com/fortune/)运势界面:

最终爬取数据结果展示在APP上的效果:

下面就是使用正则实现的代码,是自己一年多前花了半天时间写的。现在想来,如果使用Scrapy或者phpspider只用几行代码就搞定了,不用这么费力气了~

 array("aries", "03/21-04/19"),
        "金牛座" => array("taurus", "04/20-05/20"),
        "双子座" => array("gemini", "05/21-06/21"),
        "巨蟹座" => array("cancer", "06/22-07/22"),
        "狮子座" => array("leo", "07/23-08/22"),
        "处女座" => array("virgo", "08/23-09/22"),
        "天秤座" => array("libra", "09/23-10/23"),
        "天蝎座" => array("scorpio", "10/24-11/22"),
        "射手座" => array("sagittarius", "11/23-12/21"),
        "魔羯座" => array("capricorn", "12/22-01/19"),
        "水瓶座" => array("aquarius", "01/20-02/18"),
        "双鱼座" => array("pisces", "02/19-03/20")
);*/

$constellation = isset($_REQUEST["xingzuo"]) && !empty($_REQUEST["xingzuo"]) ? trim($_REQUEST["xingzuo"]) : null;
$category = isset($_REQUEST["category"]) && !empty($_REQUEST["category"]) ? intval($_REQUEST["category"]) : null;

$all_xingzuo = array(
    "aries",
    "taurus",
    "gemini",
    "cancer",
    "leo",
    "virgo",
    "libra",
    "scorpio",
    "sagittarius",
    "capricorn",
    "aquarius",
    "pisces"
    );
$all_category = array(0,1,2,3,4,5);
if(!in_array($constellation, $all_xingzuo) || !in_array($category, $all_category)){
    exit("Params error");
}

$domain = "http://www.xzw.com/fortune/";
$apiUrl = "";
if($category){
    $apiUrl = $domain.$constellation."/".$category.".html";
} else {
    $apiUrl = $domain.$constellation."/";
}

header("Content-type: text/html; charset=utf-8");
function getFortuneData($url){
    $fortune_data = array();
    $data = file_get_contents($url);
    $data = mb_convert_encoding($data, "utf-8", "gbk");
    preg_match("/
(.*)
/ism", $data, $div_c_main); preg_match("/
(.*?)
/ism", $div_c_main[1], $dl); preg_match("/
(.*?)
/ism", $dl[1], $dd); preg_match("/
    (.*?)
/ism", $dd[1], $ul); $ul = str_replace("/ism", "", $ul); $ul = preg_replace("//ism", "", $ul); //$ul = preg_replace("/s+/","",$ul); $ul_arr = explode("{label}", $ul); array_shift($ul_arr); foreach ($ul_arr as $key => &$li) { //preg_match_all("/([x81-xfe][x40-xfe])+/", $li, $matches);//转换编码 $matches[1][0]表示":" preg_match("//ism", $li, $width); if(!empty($width)){ $li = explode(":",$li); $li["label"] = preg_replace("/]*?>/ism", "", $li[0]); $li["value"] = sprintf("%0.2f", floatval($width[1]/80)); unset($li[0]); unset($li[1]); //$val[1] = $width[1]/16; } else { $li = explode(":",$li); $li["label"] = $li[0]; $li["value"] = $li[1]; unset($li[0]); unset($li[1]); } } $fortune_data["ul"] = $ul_arr; //获取c_cont preg_match("/
(.*?)
/ism", $data, $cont); $p_cont = preg_replace("/]*?>/ism", "", $cont[1]); $p_cont = str_replace("", "{span}", $p_cont); $p_cont = str_replace("

", "{p}", $p_cont); $p_cont = preg_replace(""<[/!]*?[^<>]*?>"si","",$p_cont); $p_cont = preg_replace("/s+/","",$p_cont); //$p_cont = preg_replace(""([rn])[s]+"","",$p_cont); $p_cont = str_replace("

", "", $p_cont); $p_cont_arr = explode("{p}",$p_cont); array_shift($p_cont_arr); foreach ($p_cont_arr as $key => $val) { $temp = explode("{span}", $val); $temp_arr["label"] = $temp[0]; $temp_arr["value"] = $temp[1]; $fortune_data["cont"][] = $temp_arr; unset($temp); } return $fortune_data; } $write_result = "";//写入状态 默认为空表示不写入 $local_data = ""; $result = array(); $fileName = !empty($category) ? $constellation."-".$category.".php" : $constellation.".php"; $fortune_data_path = "fortune_data/".$fileName; if(file_exists($fortune_data_path)){ $local_data = @file_get_contents("fortune_data/".$fileName); } if (!empty($local_data)) { $filemtime = filemtime($fortune_data_path); //判断缓存时间是否在当天内产生 $todayStart = mktime(0, 0, 0, date("m"), date("d"), date("Y")); if($filemtime < $todayStart){ //缓存过期 $data = getFortuneData($apiUrl); $write_result = write_fortune_cache($data, $fileName); if(empty($data)){ $result["result"] = -1; $result["msg"] = "数据抓取失败!"; $result["write_result"] = $write_result; $result["data"] = array(); exit($json->encode($result)); } } else { $data = unserialize($local_data); } $result["result"] = 0; $result["msg"] = "success"; $result["write_result"] = $write_result; $result["data"] = $data; exit($json->encode($result)); } else { $data = getFortuneData($apiUrl); if(!empty($data)){ $write_result = write_fortune_cache($data, $fileName); $result["result"] = 0; $result["msg"] = "success"; $result["write_result"] = $write_result; $result["data"] = $data; exit($json->encode($result)); } else { $result["result"] = -1; $result["msg"] = "数据抓取失败!"; $result["write_result"] = $write_result; $result["data"] = array(); exit($json->encode($result)); } } function write_fortune_cache($data, $fileName){ $fp = fopen("./fortune_data/".$fileName, "w+") or die("fortune_data/".$fileName."不存在!"); $fw = fwrite($fp, serialize($data)); if($fw){ $write_result = "success"; } else { $write_result = "fail"; } fclose($fp); return $write_result; } ?>

End

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

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

相关文章

  • PHP手写正则爬取星座网站星座运势数据

    摘要:星座屋运势界面最终爬取数据结果展示在上的效果下面就是使用正则实现的代码,是自己一年多前花了半天时间写的。 星座屋(http://www.xzw.com/fortune/)运势界面:showImg(https://segmentfault.com/img/bV5Qou?w=693&h=518); 最终爬取数据结果展示在APP上的效果:showImg(https://segmentfaul...

    honhon 评论0 收藏0
  • 持续更新免费的API,做一个API的搬运工

    摘要:为了方便广大的开发者,特此统计了网上诸多的免费,为您收集免费的接口服务,做一个的搬运工,以后会每月定时更新新的接口。将长段中文切词分开。 为了方便广大的开发者,特此统计了网上诸多的免费API,为您收集免费的接口服务,做一个api的搬运工,以后会每月定时更新新的接口。有些接口来自第三方,在第三方注册就可以成为他们的会员,免费使用他们的部分接口。 百度AccessToken:针对HTTP ...

    Shihira 评论0 收藏0
  • Java 正则表达式

    摘要:正则表达式是从字符串最头部开始匹配,一直到结束,需要匹配整个串匹配的时候返回包含正则匹配的串为找到所有匹配的串代表整个表达式星座运势匹配创建对象现在创建对象星座运势星座运势参考资料 Java 正则表达式 java.util.regex.Pattern java.util.regex.Matcher Match match 是从字符串最头部开始匹配,一直到结束,需要匹配整个串 Strin...

    zebrayoung 评论0 收藏0
  • 用Python爬取了几千条相亲文案,终于发现了告别单身的秘密

    摘要:写在最后近年来,随着人们思想观念的改变,相亲也逐渐得到年轻人的接受与认可,特别是对于那些圈子比较窄,接触不到异性的人而言。 前不久,小编刷到这样一条短视频,1.7亿...

    keke 评论0 收藏0
  • 用JAVA做一个爬虫程序——Gecco

    摘要:是一个开源的简单的爬虫框架主要是通过将获取的网页信息封装成来进行爬取信息。作者也是一个新手。这篇文章只是提供一个入门的思路。开启多少个线程抓取隔多长时间抓取次部分。是用来抓取元素的连接是指获取得到的内容。并且这个类需要实现。 Gecco是一个开源的简单的java爬虫框架主要是通过将获取的网页信息封装成HtmlBean来进行爬取信息。作者也是一个新手。这篇文章只是提供一个入门的思路。如果...

    Tony 评论0 收藏0

发表评论

0条评论

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