2011-07
8

双龙出海

By xrspook @ 23:59:25 归类于: 烂日记

今天是个伟大的日子,今天我做了两件貌似简单但实际上都不容易的事情:一、用电子琴录制了Realeza(WWE Alberto Del Rio Theme 2010)并用WIDI生成了MIDI版本;二、努力奋战、冥思苦想2天后,我终于达到了我的目标,完成了大名鼎鼎YARK系列的P25 PHP小程序。

所以,对我来说,这是划时代的一天,心情大好!

一、音乐部分

几个月前我就已经挖出家里的古董电子琴(小学时期的产物)来折腾Realeza了。一般熟练,但我只会右手,和弦对我来说是浮云,正如听音乐我只能辨别出主旋律一样。我一直在奢望自己能学会哪怕一点点左手,但电子琴的变压器不行,大号电池的电量也快没了,我得在电子琴还有声音之前赶快完成录制。

以下是xrspook极其简陋的两个自创版Realeza,请凑合着欣赏:

Realeza(WWE Alberto Del Rio Theme 2010)电子琴版[mp3]

Realeza(WWE Alberto Del Rio Theme 2010)WIDI转化MIDI版[midi]

说明:mp3就是拿着个mic对着电子琴录制的,没啥好说,请原谅我的古董电子琴没有跟电脑对接输出的玩意,毕竟那是1998年以前的产物啊,还只是386、486时代呢。midi嘛,不是我自己写的,是用WIDI把mp3转出的,因为是毋庸置疑的“独奏”,所以捕捉到的绝大多数音都是我的意图,但有几个高音电脑识别出来时一个变2个,没搞懂原因,但错有错着,恰逢那是高潮部分,出现这些我意想不到的小变动反而让音乐更丰满。

二、PHP程序部分

从有思路到PHP完全成型,我用了2天,超过15个小时!累着并快乐着!我这个喜欢折磨自己的人……这不能算折磨,这应该说是定下目标然后努力实现,I’m proud of myself.

先说说这个YARK – P25的整体思路,昨天已经说过,也就是“用正则提取,table输出,然后直接Excel粘贴保存”。昨天傍晚说到,我被正则难住了,但昨天晚上,我却突然惊醒地想出了正解。在WWE P25层层div的网页里成功提取出我需要的排名部分。用的是这条正则,针对的是我需要提取信息的开头和结尾部分做筛选。

1
preg_match_all('/< div class="row(.|\n)*?<div class="clear">/', $data, $log);

这条规则是很有针对性的,可以把WWE P25页面我需要部分嵌套的div全部提取出来,但对其他嵌套div网页无效。这条规则的重点是“(.|\n)”意思是“除换行符以外的任意字符或者换行符”,也就是全包围了。从前提取img的时候“.*?”也就足够了,但提取div不一样,因为换行是习惯性的,之前我正是在换行这个问题上被卡住,看到某个网页的时候被这句很创意的“(.|\n)”激发,最终,琢磨出我的第一次正则。

筛选出的排名部分网页源代码包括神马呢?以下是详细说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<div class="row none"> /* WWE P25页面里,一个选手的所有信息的开始,这里的class可能是row none、row fire、row ice或row (注意row后的空格)*/
	<div class="info dir-up"> /*这里的class可能是info dir-up、info dir-dn或info dir-nm,升降平,你懂的*/
		<div class="direction"></div> /*配合升降平的一个说明*/
		<div class="thisweek"></div> /*本周排位,我需要的第一个信息点*/
		<div class="lastweek"></div> /*上周排位,如果我把每周排位都收集了,某一周的上周排位对我来说当然没啥意义*/
	</div> /*info dir-up结束*/
	<div class="thumb"> /*小头像部分,这里没有我需要的信息*/
		<a href="***"></a><a href="***" class="imagecache imagecache-98x105_thumb imagecache-linked imagecache-98x105_thumb_linked"><img src="***" alt="" title=""  width="98" height="105" /></a> /*用了两层超链接,没搞懂为什么,外层没有class,内层有class,核心部分是小头像图片img,注意,有些选手是没有超链接的,比如说那些Tag Team*/
	</div> /*thumb结束*/
	<div class="thumb_none"> /*这里可能是thumb_none、thumb_ice、thumb_fire或thumb_,对应头像无特效、冰、火以及无头像状态*/
	</div> /*thumb_none结束*/
	<div class="details"> /*选手信息*/
		<h2 class="double-arrow-title"> /*二级标题开始*/
			<a href="***">***</a> /*选手名字+超链,选手名字是我需要的第二个信息点*/
		</h2> /*二级标题结束*/
		<div class="text">***</div> /*这周发生了神马事,我需要的第三个信息点*/
	</div> /*details结束*/
	<div class="clear"></div> /*纯粹的网页需要清浮处理 */
</div> /*row none结束*/

这段内容重复25次就是一个P25的完整排名信息。

第一次正则只是个开始,是把偌大一个网页的信息进行初步挖掘。其实也不能算一个网页,自从WWE 2011年头改版后,网页构成发生了巨大变化,比如说到处都有“LOAD MORE”的标志,你必须点击才能看更多内容,以P25的页面为例,我们看到的是:

http://us.wwe.com/inside/power25

但实际上,一共需要载入5个页面才能看到全部25个排名:

http://us.wwe.com/inside/power25
http://us.wwe.com/inside/power25?page=1
http://us.wwe.com/inside/power25?page=2
http://us.wwe.com/inside/power25?page=3
http://us.wwe.com/inside/power25?page=4

每个页面只有5个排名。这也就能解释为什么浏览WWE网页的速度会比从前快了,因为一次性加载的信息减少,信息加载随着浏览进程的推进而逐步增加,对于那些纯粹路过的人来说省事多了。

这5个页面的结构是一样的,对我这个需要提取信息的人来说WWE的这个“改进”完全是件坏事!一开始,我是这样提取页面信息的:

1
2
3
4
5
6
7
8
9
$data0 = get_content($_POST['url'])$data1 = get_content($_POST['url']).'?page=1'$data2 = get_content($_POST['url']).'?page=2'$data3 = get_content($_POST['url']).'?page=3'$data4 = get_content($_POST['url']).'?page=4';
 
/*经历N步操作,N步操作的工作量都是×5,我甚至都在考虑要不要来个for语句来减轻修改数字的压力了*/
 
$data = array_merge($data0[0], $data1[0], $data2[0], $data3[0], $data4[0]);

但后来,我发现完全可以这样嘛:

1
$data = get_content($_POST['url']).get_content($_POST['url'].'?page=1').get_content($_POST['url'].'?page=2').get_content($_POST['url'].'?page=3').get_content($_POST['url'].'?page=4');

如此一来,5个页面的信息也就能一次性地聚合到一起,快、准、狠!

我好像扯远了,回到第一次正则提取的内容。我昨天的思路是对其进行XML数组化,但很遗憾,XHTML网页不是XML,当信息传入外包的XML数组化程序时失败告终。于是,我就只能靠自己继续正则了。

上文已经提到,在第一次正则后的内容里,我有3个需要提取的信息点,它们分别是:

1
2
3
<div class="thisweek"></div> /*本周排名*/
<h2 class="double-arrow-title"><a href="***">***</a></h2> /*选手名字*/
<div class="text">***</div> /*发生事件*/

一次正则后选手名字里有超链,头像里也有超链,“h2”本是选手名字的唯一标记,但由于中间多了个超链,万恶,所以,我也很万恶地一句正则把我不喜欢的东西全部干掉。

1
$log[0] = preg_replace('/< a [^>]*>|< \/a>|<img [^/>]*>|\t|\r|\n/', '', $log[0]);
1
2
3
< a [^>]*>|< \/a> /*干掉所有超链*/
<img [^/> /*干掉所有图片*/
\t|\r|\n /*干掉所有制表符、回车和换行符*/

二次正则过后,提取内容变得简洁。

必须提醒:在PHP里正则针对的都是字符串,所以,如果源数据已经是数组的话,请自行拆解。否则会报错,并且会暴露出当前运行脚本的完整路径,这可是安全性的问题啊,详见这里

然后呢,因为一次正则我只提取到< div class="clear">显然后面仍应该有< /div>< /div>

才能让这个提取内容闭合完整。所以我加了这么一句:

1
$log[0] = str_replace('< div class="clear">', '<div class="clear"></div>< /div>', $log[0]);

到此为止,经过2次正则,1次字符串替换后,那坨东西符合我要求了,我可以进行第3、4、5次正则完成我的最终提取。

1
2
3
preg_match_all('/< div class="thisweek">([^< ]*)/', $log[0][$i], $rank[$i]);
preg_match_all('/<h2[^>]*>([^< ]*)/', $log[0][$i], $name[$i]);
preg_match_all('/< div class="text">([^< ]*)/', $log[0][$i], $text[$i]);

好吧,到此为止,整个分析、剥离过程完满结束,就只剩下按要求的规范化输出。就是把我提取到的东西table化,略。

整个过程的部分源程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
function get_content($url) /*网址转化为网页内容*/
{
	$ch = curl_init();
	curl_setopt ($ch, CURLOPT_URL, $url);
	curl_setopt ($ch, CURLOPT_HEADER, 0);
	ob_start();
	curl_exec ($ch);
	curl_close ($ch);
	$string = ob_get_contents();
	ob_end_clean();
	return $string;
}
 
/*数据传入开始*/
 
$_POST['url'] = str_replace("www.wwe.com", "us.wwe.com", $_POST['url']);
$data = get_content($_POST['url']).get_content($_POST['url'].'?page=1').get_content($_POST['url'].'?page=2').get_content($_POST['url'].'?page=3').get_content($_POST['url'].'?page=4');
 
/*数据传入结束*/
 
/*正则提取及替换开始*/
 
$data = str_replace("&amp;", '&', $data);
preg_match_all('/<div class="row(.|\n)*?<div class="clear">/', $data, $log);
$log[0] = preg_replace('/< a [^>]*>|< \/a>|<img [^/>]*>|\t|\r|\n/', '', $log[0]);
$log[0] = str_replace('< div class="clear">', '<div class="clear"></div></div>', $log[0]);
 
for($i=0;$i < count($log[0]);$i++)
{
	preg_match_all('/<div class="thisweek">([^< ]*)/', $log[0][$i], $rank[$i]);
	preg_match_all('/<h2[^>]*>([^< ]*)/', $log[0][$i], $name[$i]);
	preg_match_all('/<div class="text">([^< ]*)/', $log[0][$i], $text[$i]);
}
 
/*正则提取及替换结束*/
 
/*table格式化开始*/
 
echo '< table>< col>';
for($i=0;$i < count($log[0]);$i++)
{
	echo '<tr>';
	echo '<td>'.$rank[$i][1][0].'</td>';
	echo '<td>'.$name[$i][1][0].'</td>';
	echo '<td>'.$text[$i][1][0].'</td>';
	echo '';
}
echo '';
 
/*table格式化结束*/

截图是必须的

这就是YARK – P25的威力!你或许会问,就那么一大坨东西有神马用呢?呵呵,真正用法需要把它们贴到Excel。

关于复制那一大坨信息的Excel粘贴也有讲究。

首先,打开Excel,然后选择“编辑 – 选择性粘贴”,然后在“方式”里选择“文本”,按“确定”。最后简单调节表格列距以及单元格格式后,你就能得到如下图的效果:

你一定会问,为神马要如此折腾“粘贴”而不用“Ctrl+V”?呵呵,这和我的用途有关,你完全可以在“选择性粘贴”里用默认的“HTML”方式,结果跟直接用“Ctrl+V”一样,所有粘贴数据都全部挤在1个单元格里,这显然不符合我的设想,如果最后得出这样一个结果的话,我之前所做的事情都白费了。

为什么一定要以现在这个各信息分离的Excel形式呈现呢?因为,我做这么多事情的目的就是能更快更直接地提取我需要的信息,做P25的每周统计。

统计!统计是我的目的!!!!

还记得2天前我做的“ADR前46周的WWE P25”?那可花费了我半天的时间打开一个个网页,一段段信息复制粘贴并最终形成图表。如果,我要对WWE所有选手都这般干的话简直是天方夜谭,但我的确想获取那些信息,知道那个趋势,该怎么办呢?所以我有了弄YARK – P25的念头,并付诸行动,最终华丽地成功了!

YARK – P25在此!聪明的你肯定知道怎么用的。

往后,随着icon化的日益加剧,我真的可能不再看WWE的摔角而转投其他联盟,但我会记住WWE的,不单是因为他们把我引入摔角门,更重要的是为了提取信息,我从他们的网页我自学到了很多,他们的网页严谨规范,虽然可能不是最好的,但我已经从中领会到很多,难道这还不够么?!

哇咔咔,今天的blog很技术,有心人,你们会懂的。

2011-07
7

抓头 – 嵌套div的正则提取

By xrspook @ 17:50:04 归类于: 烂日记

很傻很天真的以为用正则可以轻易提取出div里的层层嵌套div,结果囧得厉害。div的开头通常都带有class或id,唯一,且容易辨认,但div的结尾,清一色的“/div”,真会搞死人。网络上流传的提取div版本貌似都不太可行。在一坨里提取一堆只是第一步,第二部还得把提取到的内容xml数组化。

其实呢,我也有想过一开始就对所有内容xml数组化,不过,信不信由你,从最开始那层<>到我要提取的那些内容少说也有15层,而且如果那些网页设计者好心加一层或减一层,我又得慢慢摸到底哪里出问题了。所以,用xml数组化是个思路,但“解剖”源数据的工作量不少且维护困难。毕竟,这不是5层,这是15层+啊!怨念那些穿那么多层衣服的网页。

正则难提取嵌套div,xml太郁闷,咋办呢?

我还有一个很天真的办法,手动选取要提取部分的代码然后贴到程序里提取。这么一来就解决了难提取困难的问题,当然啦,都手动干了,还有什么难不难的,这个办法很低级,但一定可行。

怎么办呢,怎么办呢?!

应该是我想得还不够深入,再花点时间动动脑筋好好琢磨琢磨吧。

今天很坏地想到用正则提取,table输出,然后直接Excel粘贴保存,早上还在兴奋这个伟大思路,下午就发现正则把我卡死,生活真是个悲喜剧。

别囧,我有的是时间,一定可以的!

2011-07
6

我们只是在DO OUR BEST

By xrspook @ 20:43:55 归类于: 烂日记

伟人啊!伟人啊!一大早起来就遇到伟人了!!!!

对,没错,你看到的是10张乐谱,完全不知道sunfruitfish老人家是怎么弄出来的。这对一个音乐控来说是一个平常事,但对xrspook来说,这简直就是胜迹!上帝突然间大大地关照我了。

必须说,sunfruitfish我爱你!请受我一拜~~~

而且,必须继续说明,这份乐谱是今天凌晨接近5点发过来的QQ离线文件,我感动得内牛满面啊同志~~~

不可能人人都是完美的全才,于是我们要区分轻重,自己擅长的东西要狠狠地、猛烈地燃烧小宇宙,把自己不擅长的东西留给那些精通的盆友。阴阳搭配,世界就和谐了。

于是今天我把心一横做了件一直都想做但一直没有做的事。

上图展示的数据只有日期和排名,但我想做到的是展示出时间、排名以及导致某排名发生的事情(当指向某点时显示所发生的事情),显然,简单的Excel无能为力,但一定有东西能轻松实现这个效果,因为这是普通calendar应具备的基本功能。虽然暂时实现不了,但数据收集是必须的,因此,今天我一个个网页点进去,对过去46周的数据进行了搜刮。

46周了,已经46周了!52周就是一年,已经过去了88%,时间是魔鬼。看到一个这样的走势图,真让人感慨。

统计工作先得有总体思路,这是保证统计工作质量的前提,专业术语称之为“统计设计”;然后是数据收集,这是统计工作的基础,专业术语称之为“统计调查”;接着是对数据分组、汇总,专业术语称之为“统计整理”;最后是结果的分析汇报,专业术语称之为“统计分析”。简单来说是个从定性到定量再到定性的过程。好吧,我承认这段话我是开着“统计基础知识”教材弄出来的,不过,在过去2年里,我的确就是这么干的,虽然有时并不是干全套。

关于ADR前46周的WWE P25,不知道你有没有发现:

1、从进入main roster第一周开始就上P25。
2、最低排名是21(第1周2010-08-20),最高排名是2(第25周2011-02-04,第26周2011-02-11,赢了Royal Rumble后)
3、只有一次排名在20开外。
4、排名15或以下的次数是8,即17.4%。
5、2010-10-25至2011-04-30,连续29周保持在前十,占63.0%。
6、排名第四、第六、第十五各4周,占26.1%。
7、最后一点,也是最重要的一点,你必须知道的一点,他有11周排名第7,占23.9%,7是频率最高的排名数,且远远抛离其它数字。

最终,得出一个神马结论呢?如果POWER25里前十算是一线和二线顶级的话,他会是一线减二线加的常客,他会登顶,但那只是一个peek,偶然事件。2011年4月底被draft到Raw是一个沉痛打击,他正是从第37周(2011-04-30)后开始跌出前十的,而且之后一直徘徊在15附近,至今已经9个周。要知道,他进入Smackdown日起,仅用了8个周就入围前十了。如果把第37周算在Raw的话,他在Raw的10个周里,只有可怜的1次上前十(10%),但在Smackdown里他上前十的次数是28(77.8%)!

当然了,这都只是数字,数字来源于事实,事实发生在过去,未来会怎样,我们或许可以通过以前的经验获知,但人是万能的,当奇迹要发生时完全不需要知照和理由。奇迹和运气不一样,奇迹发生需要你事先已经准备妥当,当机会碰上TOTAL PACKAGE的你时,奇迹降临是理所当然的。

DO OUR BEST,这是我们唯一可以做且偶尔必须做的。

2011-07
5

第四次Triple Threat

By xrspook @ 17:59:23 归类于: 烂日记

昨晚9点多就猫回宿舍了,因为实在是困。洗完澡等头发干的时候看圣斗士,北欧篇我没看过,看了几集,实在无聊,因为角色都super化了,所以最好看还是一开始的银河战争篇,起码那时候东西还都是比较贴近事实的,还有天龙 vs. 天马,他们都不是打不死的怪物,并不是一味吹嘘什么燃烧爆发小宇宙。打不死真的很讨厌,大概我是得了摔角综合症了,黑各种小强们。看电视本是愉快的事情,但看到10点多的时候“那堵墙”又没电了,要看下去只有一个办法——拔掉空调,把电视插座拖板挪到那里取电。真郁闷,跳闸万恶!我只有两个选择,要不开空调,要不开电视,我选择了后者,为了弥补深深不忿,我看到11点多才把空调插回去关电视睡觉。我很手尾地把电视拖板插回那堵没电的墙,凌晨3、4点的时候又突然有电了,电视自己开,电视不是电脑显示屏,不会休眠,于是很郁闷地,我又不得不迷迷糊糊地去切断电视的电源。

今天是单位内部的什么“拖拉机”大赛,事不关己,高高挂起。我选择了做做统计的习题,遇到不会的,上网搜答案,居然还被我发现我正在做的习题原来叫做“2010年统计从业资格考试培训教材学习指导”也就是和教材配套的习题集了。网络盛行的是各种配备答案的电子版,比如说这里这里,但有些章节居然要收费!不满意,非常不满意!最后,还居然被我找到了完整版的.doc文件,手舞足蹈,终于不用被老师那些不知什么时候才公布的答案牵着鼻子走了!

必须分享——2010年统计从业资格考试培训教材学习指导(习题+答案)

今天是我第四次看Alberto Del Rio的Triple Threat Match:第一次是2010-10-29 Smackdown,对手是Edge和Rey Mysterio;第二次是2011-05-09 Raw,对手是The Miz和Rey Mysterio;第三次是2011-06-20 Raw,对手是CM Punk和Rey Mysterio;这一次,也就是第四次是2011-07-01 Raw,对手是R-Truth和Rey Mysterio。不得不说,Raw的Triple Threat来得还真密集!ADR和619是烂兄烂弟,每次Triple Threat ADR总离不开619。3人赛,2人不变,第三人的水平决定了整个比赛的质量。记得第一次看,X因素是Edge的时候,那个惊艳啊!第三次看,X因素是CM Punk的时候,那个精彩啊!但回想那场The Miz为X因素以及这次以R-Truth为X因素的?惨不忍睹。Triple Threat的重点是出其不意的3人连技,那个突如其来的第三者让比赛有趣,虽然传统规矩是场上只有2人在你死我活,第三个躺一边凉快去,Single Match的加强版,但这样的比赛不会好看,而今天的第四场正是这种状态,我能毫不费劲地说出他们接下来要做什么,这情何以堪呢?!

Triple Threat Match,Fatal 4 Match,Battle Royal,Elimination Match,Steel Cage Match,TLC Match,Ladders Match,Best 2 Out Of 3 Fall Match,Handicap Match……这都只是形形色色特殊规则赛的一小部分,不过,从不懂到懂,从没见过到见过N次,这就是成长。不一定每个新的尝试都会成功,但起码不能在尝试之前就有输了该怎么办的打算。

插一图,2011-06-27 Raw Roulette的特殊规则轮盘

有些事,急不来,等着瞧吧。

PS:今天把WP升级到3.2,后台界面好丑哦~~~~ 严重不习惯那些万恶的雅黑字体!

2011-07
4

直面薄弱点

By xrspook @ 17:41:56 归类于: 烂日记

昨晚,看着妈一次又一次地重复那句或许她真没听清的“The girl is drinking.”我深表惭愧,因为我也遇到过这种问题,语音,特别是单词发音是最让我头痛的,随着课程的推进,我都是偷工减料地打擦边球逃离。一个60岁+的老人家尚且在不断努力,我这个落荒而逃算什么?!可耻啊!所以,我开始把Rosetta Stone的发音课程重做,必须把那些侥幸读对了的单词全部实打实地消化掉。

成功并非来自于一帆风顺而是建立在经受挫折并爬起来后。

maestro,“tro”这个发音实在郁闷。“t”和“d”都是什么“舌尖齿背塞辅音”,其中“t”是清辅音,“d”是浊辅音,也就是一个声带振动,一个不振动。理论是这么回事,但实操碰到的钉子不少。该如何突破这个该死的障碍呢?首先,得相信自己,我肯定可以的。

明天是所谓的单位“打牌日”,一天都举行“拖拉机”比赛,我这个神马都不懂的表示毫无压力,哪里凉快哪里躲就是了。

下下周就是MITB,但这周Raw过后,WWEC #1 contender将会有2个,这如何是好?难道下周的Raw会如我所愿在CM Punk离开WWE之前给我来一场dream match,从而确定MITB上那个唯一的WWEC #1 contender?忐忑、纠结、抓头……为什么MITB的WWEC不能来一场triple thread呢?为什么MITB Raw/Smackdown ladder match的名单如此快就确定了呢?虽然,最后时刻修改是完全可以的。不过,与其在MITB上看一场triple match,我更愿意在下周Raw上演一场我期盼多时的dream match。既然CM Punk自称(也的确是)best wrestler就应该让他打出一场great match,而MITB上,对手是John Cena,你是绝对不能有任何期待的,所以,我把最后一搏就赌在下周Raw上了,但你懂的,Raw是偶像剧,剧情远远大于摔角本身,对Raw的比赛哪怕一丁点的期待都会让你竹篮打水。

风生水起的新手期后的平缓期真要命。

© 2004 - 2026 我的天 | Theme by xrspook | Power by WordPress