ホームページ >バックエンド開発 >Python チュートリアル >Python クローラーを使用して子供に良い名前を付けます

Python クローラーを使用して子供に良い名前を付けます

高洛峰
高洛峰オリジナル
2017-02-20 10:13:241669ブラウズ

はじめに

生まれてから2週間以内に名前を付けなければならないので(出生証明書が必要)、最初は私と同じようにパニックになった人も多いと思います。漢字がたくさんあるので、どんな文字を選んでも名前にできると思ったのですが、どう考えてもそれは適当ではないことが後でわかりました。そこで、辞書を調べたり、ネットで検索したり、唐や宋の詩や宋書、さらには武侠小説まで調べてみました。名前の発音が難しい、親戚の名前とアクセントが同じなど、自分の家族の名前についての疑問が生じます。このようにして、検索と否定を繰り返し、ますます混乱していきます。

そこで、再びインターネットでさまざまな検索を行ったところ、「男の子の良い名前の包括的なリスト」などの多くの記事がインターネット上で見つかりました。これらの記事では、一度に何百、何千もの名前が挙げられていましたが、混乱しすぎて使用できませんでした。 。名前を入力すると 8 文字または 5 文字の評価が得られるウェブサイトやアプリがたくさんありますが、この機能は非常に優れており、参考にすることができます。または、これらの Web サイトやアプリの名前は非常に少なく、修飾語などのニーズを満たせないか、有料になり、最終的には役立つものが見つかりません。

そこで、次のようなプログラムを作成したいと思いました:

  1. 主な機能は、バッチ名の参照を提供することです。これらの名前は、赤ちゃんの生年月日に基づいて計算されます。

  2. 名前ライブラリを拡張できます。たとえば、インターネット上の歌の本で素敵な名前を見つけました。それらを追加して使用できます。

  3. たとえば、一部の家系図には制限があり、現在、名前には「国」という単語が含まれている必要があります。そのため、名前リストにはスコアが付けられます。反転後、名前を高スコアから低スコアまで見ることができます


  4. このようにして、お子様の生年月日、家系図の制限、および一致する名前のリストが表示されます。あなたの好みに合わせて、リストにスコアが付けられています。これに基づいて、好みの名前を見つけることができます。もちろん、新しいアイデアがあれば、いつでも新しい名前を語彙に追加して再計算できます。

プログラムのコード構造

コードの紹介: Python クローラーを使用して子供に良い名前を付けます

/chinese-name-score コードルートディレクトリ

  • /chinese-name-score/main code directory

  • / chinese-name-score/main/dicts 辞書ファイル ディレクトリ

  • /chinese-name-score/main/dicts/names_boys_double.txt 辞書ファイル、男の子の 2 文字の名前

  • /chinese-name-score /main /dicts/names_boys_single.txt 辞書ファイル、男の子の 1 文字の名前

  • /chinese-name-score/main/dicts/names_girls_single.txt 辞書ファイル、女の子の 2 文字の名前

  • /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-スコア /main/user_config.py 赤ちゃんの年齢、月、日、時間、性別などを含むプログラムのユーザー設定。

  • /chinese-name-score/main/get_name_score.py の実行中の入り口プログラム


  • 使用法コード 方法:

修飾語がない場合は、辞書ファイル names_boys_double.txt と names_grils_double.txt を見つけて、ここで見つけた名前リストをいくつか追加し、行ごとに分割して、

  1. 場合は、修飾語がある場合は、辞書ファイル names_boys_single.txt と names_girls_single.txt を見つけて、事前に好きな単一の単語のリストを行ごとに分割して追加します。最後に、

  2. user_config.py を開き、項目を構成します。次のセクションを参照してください。

  3. スクリプト get_name_score.py を実行します。出力ディレクトリで、出力ファイルをコピーできます。 Excel に変換し、並べ替えなどの操作を実行します。

  4. プログラムの構成入口

  5. プログラムの構成は次のとおりです:

# 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"

構成項目に従って、システムが自動的に決定します。単一文字辞書を使用するか、複数文字辞書を使用するか:

  1. 如果设置了该项,比如等于“国”,那么程序会组合所有的单字为名字用于计算,比如国浩和浩国两个名字都会计算;

  2. 如果不设置该项,保持空字符串,则程序只会读取*_double.txt的双字词典

程序的原理

这是一个简单的爬虫。大家可以打开http://www.php.cn/网站查看,这是一个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("p", 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 クローラーを使用して子供に良い名前を付けます相关文章请关注PHP中文网!

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。