利用Python爬虫给孩子起个好名字


Posted in Python onFebruary 14, 2017

前言

相信每位家长都有所体会,因为要在孩子出生后两周内起个名字(需要办理出生证明了),估计很多人都像我一样,刚开始是很慌乱的,虽然感觉汉字非常的多随便找个字做名字都行,后来才发现真不是随便的事情,怎么想都发现不合适,于是到处翻词典、网上搜、翻唐诗宋词、诗经、甚至武侠小说,然而想了很久得到的名字,往往却受到家属的意见和反对,比如不顺口、和亲戚重名重音等问题,这样就陷入了重复寻找和否定的循环,越来越混乱。

于是我们再次回到网上各种搜索,找到很多网上给出的“男宝宝好听的名字大全”之类的文章,这些文章一下子给出几百上千个名字,看的眼花缭乱没法使用。而有不少的测名字的网站或者APP,输入名字能给出八字或者五格的评分,这样的功能感觉还挺好的能给个参考,然而要么我们需要一个个名字的输入进行测试、要么这些网站或者APP自身的名字很少、要么不能满足我们的需求比如限定字、要么就开始收费,到最后也找不到一个好用的。

于是我想做这么一个程序:

  1. 主要的功能,是给出批量名字提供参考,这些名字是结合宝宝的生辰八字算出来的;
  2. 自己可以扩充名字库,比如网上发现了一批诗经里的好名字,想看看怎么样,添加进去就能用;
  3. 可以限定名字的使用字,比如有的家族谱有限定,当前是“国”字辈,名字中必须有“国”字;
  4. 名字列表可以给出评分,这样倒排后就可以从高分往低分来看名字;

通过这种方式可以得到一份符合自己孩子生辰八字、自己的家谱限制、以及自己喜好的名字列表,并且该列表已经给出了分数用于参考,以此为基准我们可以挨个琢磨找出心仪的名字。当然如果有新的想法,随时可以把新的名字添加到词库里面,进行重新计算。

程序的代码结构

利用Python爬虫给孩子起个好名字

代码介绍:

  • /chinese-name-score 代码根目录
  • /chinese-name-score/main 代码目录
  • /chinese-name-score/main/dicts 词典文件目录
  • /chinese-name-score/main/dicts/names_boys_double.txt 词典文件,男孩的双字名字
  • /chinese-name-score/main/dicts/names_boys_single.txt 词典文件,男孩的单字名字
  • /chinese-name-score/main/dicts/names_girls_single.txt 词典文件,女孩的双字名字
  • /chinese-name-score/main/dicts/names_grils_double.txt 词典文件,女孩的单字名字
  • /chinese-name-score/main/outputs 输出数据目录
  • /chinese-name-score/main/outputs/names_girls_source_wxy.txt 输出的示例文件
  • /chinese-name-score/main/scripts 一些对词典文件做预处理的脚本
  • /chinese-name-score/main/scripts/unique_file_lines.py 设定词典文件,对词典中的名字去重和去空白行
  • /chinese-name-score/main/sys_config.py 程序的系统配置,包含爬取得目标URL、词典文件路径
  • /chinese-name-score/main/user_config.py 程序的用户配置,包括宝宝的年月日时分性别等设定
  • /chinese-name-score/main/get_name_score.py 程序的运行入口

使用代码的方法:

  1. 如果没有限定字,就找到词典文件names_boys_double.txt和names_grils_double.txt,可以在这里添加自己找到的一些名字列表,按行分割添加在最后即可;
  2. 如果有限定字,就找到词典文件names_boys_single.txt和names_girls_single.txt,在这里添加自己预先中意的单个字列表,按行分割添加在最后即可;
  3. 打开user_config.py,进行配置,配置项见下一节;
  4. 运行脚本get_name_score.py
  5. 在outputs目录中,查看自己的产出文件,可以复制到Excel,进行排序等操作;

程序的配置入口

程序的配置如下:

# coding:GB18030
 
"""
在这里写好配置
"""
 
setting = {}
 
# 限定字,如果配置了该值,则会取用单字字典,否则取用多字字典
setting["limit_world"] = "国"
# 姓
setting["name_prefix"] = "李"
# 性别,取值为 男 或者 女
setting["sex"] = "男"
# 省份
setting["area_province"] = "北京"
# 城市
setting["area_region"] = "海淀"
# 出生的公历年份
setting['year'] = "2017"
# 出生的公历月份
setting['month'] = "1"
# 出生的公历日子
setting['day'] = "11"
# 出生的公历小时
setting['hour'] = "11"
# 出生的公历分钟
setting['minute'] = "11"
# 结果产出文件名称
setting['output_fname'] = "names_girls_source_xxx.txt"

根据配置项setting[“limit_world”] ,系统自动来决定选用单字词典还是多字词典:

  1. 如果设置了该项,比如等于“国”,那么程序会组合所有的单字为名字用于计算,比如国浩和浩国两个名字都会计算;
  2. 如果不设置该项,保持空字符串,则程序只会读取*_double.txt的双字词典

程序的原理

这是一个简单的爬虫。大家可以打开http://life.httpcn.com/xingming.asp网站查看,这是一个POST表单,填写需要的参数,点提交,就会打开一个结果页面,结果页面的最下方包含了八字分数和五格分数。

如果想得到分数,就需要做两件事情,一是爬虫自动提交表单,获取结果页面;二是从结果页面提取分数;

对于第一件事情,很简单,urllib2即可实现(代码在/chinese-name-score/main/get_name_score.py):

post_data = urllib.urlencode(params)
 req = urllib2.urlopen(sys_config.REQUEST_URL, post_data)
 content = req.read()

这里的params是个参数dict,使用这种方式,就进行了POST带数据的提交,然后从content得到了结果数据。

params的参数设定如下:

params = {}
 
 # 日期类型,0表示公历,1表示农历
 params['data_type'] = "0"
 params['year'] = "%s" % str(user_config.setting["year"])
 params['month'] = "%s" % str(user_config.setting["month"])
 params['day'] = "%s" % str(user_config.setting["day"])
 params['hour'] = "%s" % str(user_config.setting["hour"])
 params['minute'] = "%s" % str(user_config.setting["minute"])
 params['pid'] = "%s" % str(user_config.setting["area_province"])
 params['cid'] = "%s" % str(user_config.setting["area_region"])
 # 喜用五行,0表示自动分析,1表示自定喜用神
 params['wxxy'] = "0"
 params['xing'] = "%s" % (user_config.setting["name_prefix"])
 params['ming'] = name_postfix
 # 表示女,1表示男
 if user_config.setting["sex"] == "男":
  params['sex'] = "1"
 else:
  params['sex'] = "0"
  
 params['act'] = "submit"
 params['isbz'] = "1"

第二件事情,就是从网页中提取需要的分数,我们可以使用BeautifulSoup4来实现,其语法也很简单:

soup = BeautifulSoup(content, 'html.parser', from_encoding="GB18030")
 full_name = get_full_name(name_postfix)
 
 # print soup.find(string=re.compile(u"姓名五格评分"))
 for node in soup.find_all("div", class_="chaxun_b"):
  node_cont = node.get_text()
  if u'姓名五格评分' in node_cont:
   name_wuge = node.find(string=re.compile(u"姓名五格评分"))
   result_data['wuge_score'] = name_wuge.next_sibling.b.get_text()
  
  if u'姓名八字评分' in node_cont:
   name_wuge = node.find(string=re.compile(u"姓名八字评分"))
   result_data['bazi_score'] = name_wuge.next_sibling.b.get_text()

通过该方法,就能对HTML解析,提取八字和五格的分数。

运行结果事例

1/1287 李国锦 姓名八字评分=61.5 姓名五格评分=78.6 总分=140.1
2/1287 李国铁 姓名八字评分=61 姓名五格评分=89.7 总分=150.7
3/1287 李国晶 姓名八字评分=21 姓名五格评分=81.6 总分=102.6
4/1287 李鸣国 姓名八字评分=21 姓名五格评分=90.3 总分=111.3
5/1287 李柔国 姓名八字评分=64 姓名五格评分=78.3 总分=142.3
6/1287 李国经 姓名八字评分=21 姓名五格评分=89.8 总分=110.8
7/1287 李国蒂 姓名八字评分=22 姓名五格评分=87.2 总分=109.2
8/1287 李国登 姓名八字评分=21 姓名五格评分=81.6 总分=102.6
9/1287 李略国 姓名八字评分=21 姓名五格评分=83.7 总分=104.7
10/1287 李国添 姓名八字评分=21 姓名五格评分=81.6 总分=102.6
11/1287 李国天 姓名八字评分=22 姓名五格评分=83.7 总分=105.7
12/1287 李国田 姓名八字评分=22 姓名五格评分=93.7 总分=115.7

有了这些分数,我们就可以进行排序,是一个很实用的参考资料。

友情提示

  1. 分数跟很多因素有关,比如出生时刻、已经限定的字、限定字的笔画等因素,这些条件决定了有些名字不会分数高,不要受此影响,找出相对分数高的就可以了;
  2. 目前程序只能抓取一个网站的内容,地址是http://life.httpcn.com/xingming.asp
  3. 本列表仅供参考,看过一些文章,历史上很多名人伟人,姓名八字评分都非常低但是都建功立业,名字确实会有些影响但有时候朗朗上口就是最好的;
  4. 从本列表中选取名字之后,可以在百度、人人网等地方查查,以防有些负面的人重名、或者起这个名字的人太多了烂大街;
  5. 八字分数是中国传承,五格分数是日本人近代发明的,有时候也可以试试西方的星座起名法,并且奇怪的是八字和五个分数不同网站打分相差很大,更说明了这东西只供参考;

本文的代码已上传到github 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或使用python能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python中支持向量机SVM的使用方法详解
Dec 26 Python
Python爬虫番外篇之Cookie和Session详解
Dec 27 Python
使用实现XlsxWriter创建Excel文件并编辑
May 04 Python
Python中应该使用%还是format来格式化字符串
Sep 25 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
May 10 Python
Python何时应该使用Lambda函数
Jul 02 Python
详解python中的time和datetime的常用方法
Jul 08 Python
Python Merge函数原理及用法解析
Sep 16 Python
基于Python的身份证验证识别和数据处理详解
Nov 14 Python
pycharm2021激活码使用教程(永久激活亲测可用)
Mar 30 Python
PyTorch dropout设置训练和测试模式的实现
May 27 Python
Python列表的索引与切片
Apr 07 Python
python 出现SyntaxError: non-keyword arg after keyword arg错误解决办法
Feb 14 #Python
让python 3支持mysqldb的解决方法
Feb 14 #Python
python用装饰器自动注册Tornado路由详解
Feb 14 #Python
利用python程序生成word和PDF文档的方法
Feb 14 #Python
Python中类型检查的详细介绍
Feb 13 #Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
Feb 13 #Python
python cx_Oracle模块的安装和使用详细介绍
Feb 13 #Python
You might like
php中使用$_REQUEST需要注意的一个问题
2013/05/02 PHP
PHP在不同页面间传递Json数据示例代码
2013/06/08 PHP
基于CakePHP实现的简单博客系统实例
2015/06/28 PHP
php通过smtp邮件验证登陆的方法
2016/05/11 PHP
PHP进阶学习之反射基本概念与用法分析
2019/06/18 PHP
自动更新作用
2006/10/08 Javascript
发一个自己用JS写的实用看图工具实现代码
2008/07/26 Javascript
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
HTML中的setCapture和releaseCapture使用介绍
2012/03/21 Javascript
在jquery中combobox多选的不兼容问题总结
2013/12/24 Javascript
实例讲解JS中数组Array的操作方法
2014/05/09 Javascript
jQuery前端框架easyui使用Dialog时bug处理
2014/12/05 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
jquery对复选框(checkbox)的操作汇总
2016/01/13 Javascript
jQuery实现的简单动态添加、删除表格功能示例
2017/09/21 jQuery
去掉vue 中的代码规范检测两种方法(Eslint验证)
2018/03/21 Javascript
使用webpack搭建react开发环境的方法
2018/05/15 Javascript
Node.js 多进程处理CPU密集任务的实现
2019/05/26 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
微信小程序如何实现五星评价功能
2019/10/15 Javascript
微信小程序中限制激励式视频广告位显示次数(实现思路)
2019/12/06 Javascript
python基础教程之序列详解
2014/08/29 Python
python求crc32值的方法
2014/10/05 Python
python使用PyGame播放Midi和Mp3文件的方法
2015/04/24 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
2017/06/15 Python
Python整数与Numpy数据溢出问题解决
2019/09/11 Python
python使用布隆过滤器的实现示例
2020/08/20 Python
Python的scikit-image模块实例讲解
2020/12/30 Python
python 递归相关知识总结
2021/03/03 Python
世界上最好的帽子:Tilley
2016/11/27 全球购物
电子商务专员岗位职责
2013/12/11 职场文书
人力资源部经理助理岗位职责
2014/03/04 职场文书
初中生旷课检讨书范文
2014/10/06 职场文书
工作疏忽检讨书500字
2014/10/26 职场文书
大学生违纪检讨书范文
2015/05/07 职场文书
多台电脑共享文件怎么设置?多台电脑共享文件操作教程
2022/04/08 数码科技