利用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之wxPython应用实例
Sep 28 Python
【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
Nov 19 Python
Python之py2exe打包工具详解
Jun 14 Python
Python学习入门之区块链详解
Jul 25 Python
Python编程二分法实现冒泡算法+快速排序代码示例
Jan 15 Python
查看django执行的sql语句及消耗时间的两种方法
May 29 Python
Python实现识别图片内容的方法分析
Jul 11 Python
PyQt5使用QTimer实现电子时钟
Jul 29 Python
pandas 中对特征进行硬编码和onehot编码的实现
Dec 20 Python
python Popen 获取输出,等待运行完成示例
Dec 30 Python
Django 解决上传文件时,request.FILES为空的问题
May 20 Python
Python如何解决secure_filename对中文不支持问题
Jul 16 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
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
dedecms模板标签代码官方参考
2007/03/17 PHP
发布一个迷你php+AJAX聊天程序[聊天室]提供下载
2007/07/21 PHP
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
PHP实现的数独求解问题示例
2017/04/18 PHP
js 获取radio按钮值的实例
2013/08/17 Javascript
jqueyr判断checkbox组的选中(示例代码)
2013/11/08 Javascript
Nodejs使用mysql模块之获得更新和删除影响的行数的方法
2014/03/18 NodeJs
js读取cookie方法总结
2014/10/31 Javascript
js实现图片漂浮效果的方法
2015/03/02 Javascript
Nodejs express框架一个工程中同时使用ejs模版和jade模版
2015/12/28 NodeJs
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
详解Angularjs 如何自定义Img的ng-load 事件
2017/02/15 Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
2017/05/03 Javascript
基于Node.js模板引擎教程-jade速学与实战1
2017/09/17 Javascript
简单实现vue验证码60秒倒计时功能
2017/10/11 Javascript
JavaScript中的高级函数
2018/01/04 Javascript
解决layer弹层遮罩挡住窗体的问题
2018/08/17 Javascript
详解vuex commit保存数据技巧
2018/12/25 Javascript
vue指令之表单控件绑定v-model v-model与v-bind结合使用
2019/04/17 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
vscode中的vue项目报错Property ‘xxx‘ does not exist on type ‘CombinedVueInstance<{ readyOnly...Vetur(2339)
2020/09/11 Javascript
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
微信小程序弹窗禁止页面滚动的实现代码
2020/12/30 Javascript
python爬虫基本知识
2018/03/05 Python
Python----数据预处理代码实例
2019/03/20 Python
python中字符串数组逆序排列方法总结
2019/06/23 Python
浅谈Python_Openpyxl使用(最全总结)
2019/09/05 Python
Waterford加拿大官方网站:世界著名的水晶杯品牌
2016/11/01 全球购物
大学生学年自我鉴定
2014/02/10 职场文书
2014年教师节座谈会发言稿
2014/09/10 职场文书
就业协议书范本
2014/10/08 职场文书
2015年简历自我评价范文
2015/03/11 职场文书
大学生自我鉴定怎么写
2019/05/07 职场文书
深入详解JS函数的柯里化
2021/06/09 Javascript
详解Redis在SpringBoot工程中的综合应用
2021/10/16 Redis