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

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

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

<?php
/**
* 星座运势
* author: pengfei
* http://www.xzw.com/fortune/aries/ 今日
* http://www.xzw.com/fortune/aries/1.html 明日
* http://www.xzw.com/fortune/aries/2.html 本周
* http://www.xzw.com/fortune/aries/3.html 本月
* http://www.xzw.com/fortune/aries/4.html 今年
* http://www.xzw.com/fortune/aries/5.html 爱情
*/
define('IN_FTE', true);
require(dirname(__FILE__) . '/includes/init.php');
date_default_timezone_set('Asia/Shanghai');
$json  = new JSON();/*
$constellation = array ('白羊座' => 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('/<div class="c_main">(.*)<\/div>/ism', $data, $div_c_main);preg_match('/<dl>(.*?)<\/dl>/ism', $div_c_main[1], $dl);preg_match('/<dd>(.*?)<\/dd>/ism', $dl[1], $dd);preg_match('/<ul>(.*?)<\/ul>/ism', $dd[1], $ul);$ul = str_replace('<label>', '{label}', $ul[1]);$ul = preg_replace('/<span[^>]*?>/ism', '', $ul);$ul = preg_replace('/<li[^>]*>/ism', '', $ul);$ul = preg_replace('/<\/label>/ism', '', $ul);$ul = preg_replace('/<\/li>/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('/<em style="width:(\d{1,}).*">/ism', $li, $width);if(!empty($width)){$li = explode(":",$li);$li['label'] = preg_replace('/<em[^>]*?>/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_contpreg_match('/<div class="c_cont">(.*?)<\/div>/ism', $data, $cont);$p_cont = preg_replace('/<strong[^>]*?>/ism', '', $cont[1]);$p_cont = str_replace('<span>', '{span}', $p_cont);$p_cont = str_replace('<p>', '{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('<div class="z">', '', $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

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

  1. php 星座运势_PHP纯手写正则爬取星座屋网站星座运势数据

    最终爬取数据结果展示在APP上的效果: 下面就是使用正则实现的代码,是自己一年多前花了半天时间写的.现在想来,如果使用Scrapy或者phpspider只用几行代码就搞定了,不用这么费力气了~ /** ...

  2. 利用node.js写爬虫 爬取某相亲网站全部交友信息

    点击查看爬取世纪佳缘相亲交友信息 利用node.js,写了一个爬虫js.1个小时左右的时间,便爬取了2000多条交友信息,包括网名,年龄,图片,学历,工资等.当然,爬取的速度和网速有很大的关系,也和你 ...

  3. python爬取安居客网站上北京二手房数据

    目标:爬取安居客网站上前10页北京二手房的数据,包括二手房源的名称.价格.几室几厅.大小.建造年份.联系人.地址.标签等. 网址为:https://beijing.anjuke.com/sale/ B ...

  4. Python开发爬虫之BeautifulSoup解析网页篇:爬取安居客网站上北京二手房数据

    目标:爬取安居客网站上前10页北京二手房的数据,包括二手房源的名称.价格.几室几厅.大小.建造年份.联系人.地址.标签等. 网址为:https://beijing.anjuke.com/sale/ B ...

  5. python 安居客 爬虫_Python开发爬虫之BeautifulSoup解析网页篇:爬取安居客网站上北京二手房数据...

    page1 宏星地产租售部 新出!1700南花园, 赠500万红木家具 3800万 106442元/m2 5室2厅 357m2 共3层 2008年建造 夏秋冬 碧水庄园 昌平-沙河-定泗路 ['独栋别 ...

  6. Python3爬取企查查网站的企业年表并存入MySQL

    Python3爬取企查查网站的企业年表并存入MySQL 本篇博客的主要内容:爬取企查查网站的企业年报数据,存到mysql中,为了方便记录,分成两个模块来写: 第一个模块是爬取数据+解析数据,并将数据存 ...

  7. 使用jsoup爬取玩Android网站导航数据

    知识点 - 使用jsoup爬取玩Android网站中的导航数据 - 输出md格式的表格 /*** Created by monty on 2018/3/9.*/ public class WanAnd ...

  8. vue+js纯手写日历(包含农历,节假日)

    vue+js纯手写日历(包含农历,节假日) 使用的js 地址 dataChange.js 插件使用了elementui //完整代码 <template><div><di ...

  9. IOS纯手写代码支持旋屏

    2019独角兽企业重金招聘Python工程师标准>>> 不用ib纯手写代码实现旋屏效果,xcode4.6.3,今天试了一下,可以做到,但是代码量会增加,基本思路是:在 - (void ...

最新文章

  1. E0144 const char * 类型的值不能用于初始化 char * 类型的实体
  2. oracle对日期date类型操作的函数
  3. php查询算法,PHP算法之二分查找
  4. How to apply for the PG studies as a UG
  5. ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  6. packt_Packt和Java Code Geeks提供的$ 5 Java编程书籍!
  7. 关于==和equals的探索
  8. rinetd 安装、配置方法 通过端口转发来访问内网服务
  9. 百度文库资料下载总结技巧
  10. matlab抛物柱面 y 2=2x,求椭圆抛物面2y2+x2=z与抛物柱面2-x2=z的交线关于xOy面的投影柱面和在xOy面上的投影曲线方程...
  11. MicrosoftActiveSync 安装
  12. 学习方法之03复述记忆法,让你不再死记硬背
  13. Elasticsearch 7.10 之 Data tiers
  14. android声音大小锁定,固定音量锁(锁定音量)app
  15. 【网页制作】jQuery操作css实现设置箭头图片
  16. JS实现表格增、删、排序
  17. S5PV210实验板发布
  18. background多背景
  19. ValueError: Invalid parameter
  20. 怎样清除打开方式中的无用项目

热门文章

  1. Shiro 之rememberMe / session
  2. Ue4 UI优化文档整理理解
  3. android锁屏快捷键设置,【Android高级】锁屏功能简单实现
  4. Pytorch提取预训练模型特定中间层的输出
  5. MLCC电容啸叫的机理及解决方案
  6. 北漂五年,分享一下关于我的职场故事
  7. 数据结构期末考试——判断题
  8. 数据分析八大模型:详解PEST模型
  9. Splunk 会议回顾: 大数据的关键是机器学习
  10. cnpm安装 指定版本_vue npm install安装某个指定版本的方法