php 星座运势_PHP纯手写正则爬取星座屋网站星座运势数据
最终爬取数据结果展示在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('/
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('/
$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_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纯手写正则爬取星座屋网站星座运势数据相关推荐
- PHP纯手写正则爬取星座屋网站星座运势数据
星座屋(http://www.xzw.com/fortune/)运势界面: 最终爬取数据结果展示在APP上的效果: 下面就是使用正则实现的代码,是自己一年多前花了半天时间写的.现在想来,如果使用Scr ...
- 利用node.js写爬虫 爬取某相亲网站全部交友信息
点击查看爬取世纪佳缘相亲交友信息 利用node.js,写了一个爬虫js.1个小时左右的时间,便爬取了2000多条交友信息,包括网名,年龄,图片,学历,工资等.当然,爬取的速度和网速有很大的关系,也和你 ...
- IOS纯手写代码支持旋屏
2019独角兽企业重金招聘Python工程师标准>>> 不用ib纯手写代码实现旋屏效果,xcode4.6.3,今天试了一下,可以做到,但是代码量会增加,基本思路是:在 - (void ...
- 【手写系列】纯手写实现一个高可用的RPC
前言 在实际后台服务开发中,比如订单服务(开发者A负责)需要调用商品服务(开发者B负责),那么开发者B会和A约定调用API,以接口的形式提供给A.通常都是B把API上传到Maven私服,然后B开始写A ...
- 【手写系列】纯手写实现JDK动态代理
前言 在Java领域,动态代理应用非常广泛,特别是流行的Spring/MyBatis等框架.JDK本身是有实现动态代理技术的,不过要求被代理的类必须实现接口,不过cglib对这一不足进行了有效补充.本 ...
- 超级简单的jQuery纯手写五星评分效果
超级简单的评分功能,分为四个步骤轻松搞定: 第一步: 引入jquery文件:这里我用百度CDN的jquery: <script src="http://apps.bdimg.com/l ...
- SQL纯手写创建数据库到表内内容
建表啥的只点点鼠标,太外行了,不如来看看我的纯手写,让表从无到有一系列:还有存储过程临时表,不间断的重排序: 一:建数据库 1create Database Show 2 on 3 primary 4 ...
- vue+js纯手写日历(包含农历,节假日)
vue+js纯手写日历(包含农历,节假日) 使用的js 地址 dataChange.js 插件使用了elementui //完整代码 <template><div><di ...
- HTML5期末大作业:商城网站设计——仿唯品会购物商城(5页) 纯手写-高质量 HTML+CSS+JavaScript
HTML5期末大作业:商城购物网站设计--仿唯品会商城(5页) 纯手写 HTML+CSS+JavaScript 期末作业HTML代码 学生网页课程设计期末作业下载 web网页设计制作成品 常见网页设计 ...
最新文章
- 依图创始人朱珑《人民日报》刊文:未来10年是人工智能算力的“超摩尔时代”...
- localStorage和sessionStorage
- HDU 3665 Seaside
- Android安全-SO动态库注入
- 库克警告员工不要泄露公司信息:将全力追查
- Python之进程、线程、锁
- HDOJ(HDU) 1860 统计字符
- H桥电机驱动基本原理
- Qt: Exception at 0x7ff8082c4f69, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be ...
- 用简单英语谈生意-介绍篇
- Java 编程练习之:101-200之间的素数
- REVIT模型空间句法分析
- C语言实现英寸单位与厘米的转换(两种方法)特简单!!!
- 华为运营商级路由器配置示例 | 配置LDP方式VPLS示例
- ma5671怎么设置_华为MA5671怎样设置POE供电
- 关不掉,新版微信这功能引用户怨声载道...
- r5 4650g和r5 5600g选哪个好
- 伯努利分布期望,方差推导
- python爬取斗鱼图片
- FPGA(四):高级设计
热门文章
- promise详细解释
- 微信小程序实现三级联动
- echarts河北省json文件最新的_echarts地图边界数据的实时获取与应用,省市区县多级联动【附最新geoJson文件下载】...
- vue 使用echarts地图实现全国地图
- 基本不等式 学习笔记
- 常见硬件术语手册!绝对权威!(转!)十一、扫描仪术语解释
- 探案笔记千万融资:剧本杀的喜与忧
- 复习日记-HTML+css+js+jquery
- tof摄像头手势识别_Time of Flight(飞行时间技术)——三维手势识别
- 机房预约系统(C++)