2022-11
22

我想用Python

By xrspook @ 10:24:39 归类于: 烂日记

几天前我开始看关于把Python跟Excel结合的书。其实那些书一年多前我已经已经买了,只是一直都放在那里,甚至还没开封。因为同期购买的还有一大堆Power BI的书,所以Python跟SQL我都还没有开封。现在之所以开封是因为突然想到想抓取一下网上的官方新冠疫情数据。之前我没想过要自己抓取,后来发现各大门户网站的看板都只有几个月的数据。顶多只能看到今年8月,之前的就没有办法了,要怎么抓取那些数据,然后以我想要的方式展示出来,显然依靠看板是不行的。那个东西不是给我这种较真的人去看的,只是给大伙看一下今天的情况怎么样,近期的情况怎么样,而且都只是了解个大概而已。新冠疫情的数据应该是官方的,当然是找国家卫计委和各省的卫健委。国家卫健委的东西我感觉我暂时用不上,原因是颗粒度就只是到省份而已。我之所以要收集这些新冠疫情的数据,是因为我想看一下新冠疫情和我单位的业务到底有没有关系,是否因为新冠疫情的零星散发导致广东省又或者是东莞市周边的各种防疫政策突然严格起来,甚至出现区域封控,最终导致我库的业务量大受影响。因为总的来说,和我库发生业务的那些单位大都是拉到周边,跨省的偶尔也会有,但不多。相对于之前来说,今年的装卸船都没有那么繁忙,所以新冠疫情数据主要看广东省,尤其是深圳、广州、惠州、佛山这几个地方大概就差不多了。因为从东莞疾控发布的消息来看,东莞是非常看重跟它接壤的那些地市的疫情情况的。我的真实感受是广州卫健委那边还没官方宣布消息,东莞卫健委这边就已经在官方公众号上发布要对广州采取加码防控。

广东卫健委的网站,我感觉挺漂亮,没什么多余的东西,开的速度也很快。我研究了一番那个网站的源代码,好像没找出是基于什么做出来,但我总感觉从那个网址的展示形式看来非常有可能是基于WordPress的网站。从网站的头部信息看来,写脚本的那个人很用心,因为他把信息整理得非常整齐,不同类别的还会特意用个空行分隔开,css也是整理得很漂亮。那个网站如果在不同的终端查看,估计会是不一样的效果,会有针对平板或者手机之类的版本。网站做得这么细致,里面也有不少的javascript,所以会不会有反爬技术还真很难说。最终发现如果我用最初级的爬虫去抓取数据,仅仅能爬到网页头的搜索,然后就戛然而止了。或许用上一些高端的手段能把网站爬下来。但我需要的不过是其中一段少则百余字,多则几百字的东西而已。尝试太凶猛,卫健委把我的IP给封了,我连看都看不了,问题更大。所以最终我采取的措施是在Firefox浏览器上安装一个叫download them all的插件,批量下载他们的网页。在做这些事之前,我已经试过手动下载其中一个网页,然后用Python正则提取我想要的东西。事实证明批量下载网页是可行的,Python正则抓取信息也是可行的。最终问题就归结为抓取到了某些信息以后,怎么才可以让那些信息以我想要的方式表达出来。最终我要什么效果,要什么样的颗粒度,实际上我没想好,但起码离线的网页已经在手,就没什么好纠结了。

于是这也带出了我翻出那些Python跟Excel结合的书,找一下灵感。

2020-11
24

2020只剩下一个月了

By xrspook @ 9:35:11 归类于: 烂日记

昨天当我重新配置VSCode的时候,我发现python的东西我好像都已经忘干净了。之前几个月,我花了那么多时间去研究折腾,现在,除了最核心的东西,格式上的问题我好像全部都忘干净了,大概研究一下就可以重新上手,但现在如果叫我写脚本,我会彻底一片空白。同样一片空白的还有我的git的文件夹。换了个硬盘,要重新配对上显然不容易了。当时放到网络上的东西只是一部分,最根本的那些我还没往上面放。所以这就意味着其实我的电脑还是要装一个git的,然后把那些东西整理好以后往上放。什么时候才做呢?我自己也没想好。之所以没想好,大概是因为我还有一个羁绊。

今年我们已经写了两篇统计分析,但无论写多少,年底还是得有一篇对应2020整年的分析。那个东西该怎么写?如果按照从前的套路,直接在从前的数据上面更新数据,肯定没什么难度,但是我要做的显然不仅仅是那些,因为每一年的状况都会略有不同,最重要的我觉得是把握那些不同点,但我也明白不同点只是一部分而已,整体的思路还是得延续从前的风格,但从前的风格是不是一定就靠谱呢?具体的细节我还没想好要怎么整,整体的规划,暂时也没有一个很确切的想法。现在我我的状态是想做又不想做,摇摆中。情况就像我想逃避,但我又非常明白这根本逃避不了。还剩下一个月的时间。这个东西必须得整出来,我知道其实一个月的时间很充裕了。要解决一个细节上的问题,几天就足够。但毕竟这不是我一个人做的事,所以我不能把那算得那么死。应该用什么样的风格?应该用什么样的图表去表达呢?今年前两个分析,跟之前的风格不一样,因为都是专题类的,要凸显出某些东西,而这一次,全年的分析显然侧重点不在那里。这是我重新接手统计的第四年。印象之中,前几年我好像从来没有在这个问题上费过多少心。现在,数据的整理已经常规化,所以我会在细节问题上纠结。从前如果要做一个年底的分析,我大概是到年末的时候才开始整理数据,但现在每个月末我都会整理。所以总的来说,我的查询表相对而言已经比较固定完善,但这也说不准什么时候我又蹦出来有一些新想法,是之前的那些数据收集方式无法覆盖到的。在2020年里搞定这些事,接下来的那两个月不过是等过年而已,没有烦恼。秋普已经过去,剩下最后一个比较大型的就只有绩效考核。如果你问我,春秋普查慌一点还是绩效考核慌一点,其实我都无所谓。如果我说两个我都不慌的话不知道有没有人会相信,因为实际上,那些检查要求做的事,在日常工作中我已经都做了。

我的方糖12月28就可以完成最后一次的打卡,如果能坚持到那一天的话,方糖2就算是被我白嫖到了。理论上,在那一天之前,我就应该完成今年的统计分析的绝大部分,剩下的只有更新最后几天的数据而已。

纠结要做什么的时候是最浪费时间的。

2020-10
10

当年,为什么

By xrspook @ 10:20:34 归类于: 烂日记

不知道从哪里看来这么一个评价,中国的程序员在实用技术上的开发是一流的,但美国的程序员在基础理论上的研究生一流的。可能原话不是这么表述,但大概是这么个意思吧。我也是一个专注于使用技术上的人。我没有一个确切精通的东西,但要做到精通某个东西其实已经是一个很高的境界了,显然起码暂时来说我不是那种人。我会偏向于用某些思路去解决问题,但当某些思路是在不能解决某些问题的时候我的脑洞会再次打开,慢慢地转移到别的地方去,之所以有这种转变,是因为我发现别的东西在解决某个问题的时候更加靠谱好使。所以,总的来说我并不局限于只用某个工具解决问题。

大学的时候我不知道为什么我们要学C语言而不学习其它编程语言。大概理工科的学生都要学习编程语言这种东西吧,不知道学设计的要不要呢?反正农学和经管的好像不用。至今我都不知道为什么非得在我们的大学课程里安排这么一个必修课。学计算机的学生也必须学C语言吗?还是说他们学的是其它?又或者他么是在学了C语言以后再学其它?为什么我搞不懂必须学C语言最根本的在于C语言必须在DOS下执行,还得先编译再运行。除了在软件里写码以外,我最经常用的写码工具是Windows自带最传统的记事本,要不干脆不在电脑上写,直接在草稿纸上写。如果当时已经流行像VSCode那样的编辑器,大概我就不用走那么多弯路了。编辑器能够提醒你语法有否出错,即便语法不错,程序能不能运行最根本的是整体的思路。跟python比起来,C语言的语法更为严谨,之前没有声明过的东西不能用,花括号这种东西必不可少。后来我明白到大概当年要求我们必须学习C语言不是要我们真的懂得用那个东西搞出些什么,而是让我们对编程思维这种东西有所了解。因为是在DOS这种环境下运行,学习的时候就自然不会带入太多额外的脑洞,让东西写着写着就跑偏到别的事情上。如果当年学习的是python,大概我的很多同学就不会觉得编程语言除了用来应付考试就一无是处了。编程能快准狠地解决我们平时遇到的很多问题,但体会到这个又是过了好多年后的事了。话说回来,如果一开始就让我们知道那么多,是不是好事呢?

有时我挺庆幸我读书的时候网络远没有现在发达,起码智能手机还没有。没有随手拿来的智能手机就不会有假期拍照和录小视频的作业,同时也没有每天限定多长时间得在某个app上完成某些作业的任务。对成年人来说,游戏是消遣,对孩子来说,手机app完成作业是学校作业的无限延伸。从前,离开学校就算解放了,但现在,因为有app的约束,哪里都是天眼的管辖范围。app上的数据家长在看,老师在看,虽然其实完全遵照那个去做实际上也不会太难,但哪个孩子没有叛逆心。手边没有智能设备,的确让我的从前少了很多照片和视频记录,但也正是因为从前的照片都在胶卷上,需要晒到相纸上,重新掏出实物让人更容易触摸到从前,岁月的颜色和味道都留在了那里。

我的人生让我有了我去选择的权利,而不只是成为别人想我成为的那个。

2020-09
19

我喜欢Excel

By xrspook @ 20:53:41 归类于: 烂日记

Excel的一般公式,我比较熟练,一些高级公式的叠加,我需要找教程套用,但起码我知道那是可以做到的。一般的数据透视表,是我一直以来用得相对来说最顺溜的东西,至于高级的数据透视表,也就是超级数据透视表我几乎不了解它的高级用法。在数据的筛选查询方面,之前我用的是公式,而近期,我知道了有Power Query这种神器。在这之前,我已经知道可以SQL语言查询。去年我开始系统学习了Excel VBA。这让我大大提升了某些工作的效率。当然这是非常有针对性的。对我来说,要开发一个VBA脚本需要好些时间,并不是一写就能用的那种类型,期间要经过不少修改。所以其实总的来说,对Excel的了解我还是比较全面的。

也正是因为有这样的经历,所以当我遇到某些综合性的问题的时候,当别人把目光主要集中在某个他们很熟悉的版块的时候,我会凭借我的直觉找问题,而不局限于他们觉得出问题的那个地方。比如在把SQL查询跟VBA结合的时候,别人会把精力放在SQL查询有没有写错上面。SQL有没有写错,其实我根本没看,对我来说那些东西太长了,看不懂,而且那个人写的VBA脚本缩进很有问题,看得我很郁闷,所以我就更加没有心情在那里琢磨。那既然能计算出一个正确答案,说明那个查询语句应该没什么问题。也正是因为写脚本的人的那堆东西格式比较混乱,所以我有理由怀疑那是拼凑起来的脚本,因为居然在脚本的开头连变量的定义都没有。为什么VBA里没有进行规范的变量定义,后面也居然可以照样使用呢?这让我有点惊讶,毕竟这是个VBA,不是python。C语言里,如果不先进性变量定义,后面根本用不了。在我记忆之中,VBA的变量在使用之前是需要先定义的。最终我发现是那个人的脚本之所以出错,是因为某些语句的套用搞错了,为什么他会把那个东西放在里?我觉得大概是因为他没有明白他一开始做的那个with是什么意思。但如果你问我为什么他把那堆东西套在里面会出错,而且是某些地方出错,不是全部出错,我回答不出来。理论上这种错误能在恰当的调试中体现出来,但实际上,VBA的调试句子我还用得不算很熟练。或者你会说,这是因为我的VBA学习还不够系统化,但我觉得我已经用了学习VBA最靠谱的那本书了。可以肯定的是,一些很基础的调试方式我还没掌握,如果我学会了那些东西,我可以大大提升我的调试效率,把错误定位得更精准。VBA脚本这种东西,我觉得最根本的是必须得理解。如果纯粹是各种套用,基础功能的确可以快速实现,但是当遇到的问题比较综合的时候,就会出现一些他们完全料想不到的状况。那种状况有可能与脚本本身的内容无关,与脚本的结构有关。

相对来说,Excel里我用得最弱的是高级公式的套用。如何用一个非常复杂的公式解决一些高端的问题是我一直以来都不大上心,或者说记得不够好的部分。非常复杂的公式,尤其是数组公式,虽然能解决一些神一般的问题,但问题是,其实那些公式需要耗费大量资源,所以在处理大数据的时候,非常有可能出状况。我是一个实用主义者,能做到某个功能,但是做起来的效率不高不好,我为什么要选择那种只是看上去很炫酷的方式呢?情况就像用VBA解决同一问题的时候,如果只是在工作表层面处理和先用内存数组处理再在工作表层面表达,效率千差万别。

Excel对我来说,除了要最终结果,过程也得追求高效和方便。

2020-08
14

垃圾评论,滚!

By xrspook @ 10:33:52 归类于: 烂日记

习惯了用python以后要我写php的代码,我各种不习惯。为什么变量前面要加个“$”?为什么要写“{}”这种东西?为什么居然可以乱七八糟不缩进?python估计是不用数组表示东西的,但实际上,在历遍的过程里有数组,而php这东西貌似不像python那样分列表和元组,字符串是肯定有的,字典可能也有,但这个我不确定。在计算某个东西长度的时候还得纠结到底我要分解到什么程度,我不就是要计算一下数组里元素有多少嘛。可能是我使用的方式不对,print_r的确把数组表达出来了,但一坨东西各种嵌套,你给我个缩进好不好,我都分不清谁是谁了。python里计算长度用len(),我已经用得很熟练很爽了,到php里变成了count(),如果数组里还有数组,也要算出长度还得加参数。不得不说,数组这个东西挺让我头痛。记得从前学C语言的时候我就挺烦数组这个东西,我感觉自己一直没学好。当我接触了python,让我明白到其实数组不就是那些东西,为什么就非得用索引号把他们定位表示呢?直接把数据按照数组的排列方式直接表达出来是可以,json就是这么玩的,那是一个混合长度的数组,同样的事情也可以发生在python的列表、字典和元组里。好像在C语言里数组的长度得一开始就设定好,现在看来,我觉得这样不好,因为有些东西的确是很难一开始就想清楚的,搞太小了,放不下,搞太大了浪费空间。学习各种编程语言让我明白到原来某些我觉得参不透的东西其实可能没必要一定用那种思路。

之所以要死磕php,因为我有点讨厌WordPress里的垃圾评论。虽然官方自带的Akismet插件已经免去了我很多烦恼,但还是会有些漏网之鱼,所以我的垃圾评论列表里总有东西,看着心烦。那些垃圾评论虽然不在前台显示,但是在导出数据里会看到,浪费我的空间。对付垃圾评论的方法有很多,插件大法是最适合小白使用的,WordPress自带的规则也能让评论不被摆上台面,但我想做到的是根本不让那些东西写入我的数据库,没有写入就不需要删除,不适合的东西直接滚,减轻数据库的负担。虽然呢,我的小网站向来没什么流量,不会负载超标之类,但每当网站很慢,发布个文章都等半天都开不完的时候我就会暗暗觉得是不是被垃圾评论拖累了。综上所述,所以我选择的垃圾评论对抗大法是“Akismet + 自定义代码”。Akismet这个东西是安装完WordPress以后自带的官方工具,启用、填API就好。自定义代码需要在WordPress模板的functions.php里加入一些东西。网上有很多教程,但哪个才最适合自己得自己试过才知道。评论里可控的参数可以参考comments.php。我的防垃圾评论自定义代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function refused_spam_comments($incoming_comment) { 	
	preg_match_all('/http/', $incoming_comment['comment_content'], $link); // 有两条或以上超链接的,滚!
	if(count($link[0])>1) {
		wp_die("垃圾评论!!!"); 		 
	}
	$ruattern = '/[А-я]+/u'; // 俄语的,滚!暂时我还没见过大批量日语、泰语、阿拉伯语的
	if(preg_match($ruattern, $incoming_comment['comment_content'])){
		wp_die( "垃圾评论!!!" );
	}
	$name = '/Henrylix/i'; // 中文广告
	if(preg_match($name, $incoming_comment['comment_author'])){
		wp_die( "垃圾评论!!!" );
	}
	$mail  = '/(jjgfqijpo)|(.ru)/i'; // 其它广告
	if(preg_match($mail, $incoming_comment['comment_author_email'])){
		wp_die( "垃圾评论!!!" );
	}
	return($incoming_comment);
} 
add_filter('preprocess_comment', 'refused_spam_comments');

WordPress自带的评论规则里有超链接超两条就自动不显示,自动落入待审核的垃圾评论,但这样我还得去清啊,直接不让进更好,貌似我没有在其它防垃圾评论代码里见过这条。很多教程里“wp_die”那里用的是“err”,我不知道其他人怎样,反正“wp_die”我用得挺好,前台后台都正常,但“err”前台后台都不行。有些人这样,有些人那样,是不是跟不同的WordPress版本有关呢?这个自定义代码只是暂时的,我还得根据垃圾评论继续调整,debug的过程永无止境。

我感觉会了代码,人生才算是有了主动权。

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