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

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

/**

* 星座运势

* 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('/

(.*)/ism', $data, $div_c_main);

preg_match('/

preg_match('/

(.*?)/ism', $dl[1], $dd);

preg_match('/

  • (.*?)/ism', $dd[1], $ul);

$ul = str_replace('', '{label}', $ul[1]);

$ul = preg_replace('/]*?>/ism', '', $ul);

$ul = preg_replace('/

]*>/ism', '', $ul);

$ul = preg_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

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

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

    星座屋(http://www.xzw.com/fortune/)运势界面: 最终爬取数据结果展示在APP上的效果: 下面就是使用正则实现的代码,是自己一年多前花了半天时间写的.现在想来,如果使用Scr ...

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

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

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

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

  4. 【手写系列】纯手写实现一个高可用的RPC

    前言 在实际后台服务开发中,比如订单服务(开发者A负责)需要调用商品服务(开发者B负责),那么开发者B会和A约定调用API,以接口的形式提供给A.通常都是B把API上传到Maven私服,然后B开始写A ...

  5. 【手写系列】纯手写实现JDK动态代理

    前言 在Java领域,动态代理应用非常广泛,特别是流行的Spring/MyBatis等框架.JDK本身是有实现动态代理技术的,不过要求被代理的类必须实现接口,不过cglib对这一不足进行了有效补充.本 ...

  6. 超级简单的jQuery纯手写五星评分效果

    超级简单的评分功能,分为四个步骤轻松搞定: 第一步: 引入jquery文件:这里我用百度CDN的jquery: <script src="http://apps.bdimg.com/l ...

  7. SQL纯手写创建数据库到表内内容

    建表啥的只点点鼠标,太外行了,不如来看看我的纯手写,让表从无到有一系列:还有存储过程临时表,不间断的重排序: 一:建数据库 1create Database Show 2 on 3 primary 4 ...

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

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

  9. HTML5期末大作业:商城网站设计——仿唯品会购物商城(5页) 纯手写-高质量 HTML+CSS+JavaScript

    HTML5期末大作业:商城购物网站设计--仿唯品会商城(5页) 纯手写 HTML+CSS+JavaScript 期末作业HTML代码 学生网页课程设计期末作业下载 web网页设计制作成品 常见网页设计 ...

最新文章

  1. 依图创始人朱珑《人民日报》刊文:未来10年是人工智能算力的“超摩尔时代”...
  2. localStorage和sessionStorage
  3. HDU 3665 Seaside
  4. Android安全-SO动态库注入
  5. 库克警告员工不要泄露公司信息:将全力追查
  6. Python之进程、线程、锁
  7. HDOJ(HDU) 1860 统计字符
  8. H桥电机驱动基本原理
  9. Qt: Exception at 0x7ff8082c4f69, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be ...
  10. 用简单英语谈生意-介绍篇
  11. Java 编程练习之:101-200之间的素数
  12. REVIT模型空间句法分析
  13. C语言实现英寸单位与厘米的转换(两种方法)特简单!!!
  14. 华为运营商级路由器配置示例 | 配置LDP方式VPLS示例
  15. ma5671怎么设置_华为MA5671怎样设置POE供电
  16. 关不掉,新版微信这功能引用户怨声载道...
  17. r5 4650g和r5 5600g选哪个好
  18. 伯努利分布期望,方差推导
  19. python爬取斗鱼图片
  20. FPGA(四):高级设计

热门文章

  1. promise详细解释
  2. 微信小程序实现三级联动
  3. echarts河北省json文件最新的_echarts地图边界数据的实时获取与应用,省市区县多级联动【附最新geoJson文件下载】...
  4. vue 使用echarts地图实现全国地图
  5. 基本不等式 学习笔记
  6. 常见硬件术语手册!绝对权威!(转!)十一、扫描仪术语解释
  7. 探案笔记千万融资:剧本杀的喜与忧
  8. 复习日记-HTML+css+js+jquery
  9. tof摄像头手势识别_Time of Flight(飞行时间技术)——三维手势识别
  10. 机房预约系统(C++)