Python程序给宝宝起名?

出于好玩,想用Python程序给小孩起名。
思路是这样的,先穷举出全部常用汉字,生成单字名及双字名,将生成的名字放到「姓名测试网站」进行打分,按得分对名字进行排序,以便筛选。
具体实施起来有几个关键点:
1、常用汉字的生成
python3生成汉字,这儿有两种思路,一种是生成Unicode编码的全部汉字,共计20927个。

ming_list=[]
    for i in range(0x4e00, 0x9fbf):
        ming=chr(i)

另一种是生成GBK2312编码的常用汉字,共计6763个。

 ming_list=[]
    for i in range(0x4e00, 0x9fbf):
        ming=chr(i)
        try:
            ming_gb = ming.encode('gb2312')  # 汉字转 gb2312
            ming_list.append(ming)
        except:
            pass

这里采用第二种方式,过滤掉不常用的生僻字。
2、提升程序效率
此处用多线程解决问题已经不好用了,6763*6763有45738169种组合,每秒完成3次请求,大概需要45738169/3/60/60/24=176.46天。
这么慢肯定接受不了,这里我们就要用到rabbitMQ和pika了。核心思想是,主程序只管分派任务,将45738169个名字分发下去,其他机器(窗口)从任务池里取任务并执行。这种思路的好处是,理论上机器可以无限增加,工作效率与机器数量成正比,各机器之间互不影响,某机器掉线不影响整体。
核心代码:
任务分发端:

import pika
print('send....start....')
for i in range(1000):
    connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))#任务分发
    channel = connection.channel()
    channel.queue_declare(queue='ming',durable=True)
    channel.basic_publish(exchange='',
                          routing_key='ming',
                          body=str(i),
                          properties=pika.BasicProperties(
                              delivery_mode=2,  # make message persistent
                          ))
    print('send:',i)
    connection.close()# 关闭连接

做任务端:

import pika
import queue
import threading
GlobalQueue = queue.Queue()#全局变量,队列
class myThread (threading.Thread):
    def __init__(self, threadID):
        threading.Thread.__init__(self)
        self.threadID = threadID
    def run(self):
        while True:
            ming = GlobalQueue.get().decode()#取出数据,一直监听
            print('线程:',self.threadID,'取出的值:',ming)
def callback(ch, method, properties, body):
    #print('recived:', body)
    GlobalQueue.put(body)
    #time.sleep(0.2)
    ch.basic_ack(delivery_tag=method.delivery_tag)
def Main():
    connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
    channel = connection.channel()
    channel.queue_declare(queue='hehe5', durable=True)
    channel.basic_qos(prefetch_count=1)  # 确认发送消息个数
    channel.basic_consume(callback, queue='hehe5', no_ack=False)
    print('waiting')
    thread = []
    for i in range(4):
        thread.append(myThread(i))
    for i in range(4):
        thread[i].start()
    channel.start_consuming()
if __name__ == '__main__':
    Main()

 
3、网页汉字乱码问题
一般情况,request得到response后,用apparent_encoding编码即可。
response.encoding = response.apparent_encoding
但有些网站的meta里声明的格式和实际格式有差异,这时候需要手动去指定。
response.encoding = 'gb2312'
4、汉字url构造问题
无论网站是采用POST还是GET方式,汉字转化成URL都需要先编码。
最简单的将中文转为url:

from urllib.parse import quote
ming_url=quote('中文')

其结果为:%E4%B8%AD%E6%96%87


如结果是%D6%D0%CE%C4这种形式,则:

from urllib.parse import quote
ming='中文'
ming = ming.encode('gb2312')
ming_url=quote(ming)
print(ming_url)


如结果是%u的形式,如%u4e2d%u6587,则:

import json
def rep(s):
    s_j = json.dumps(s)#python 转 json
    s_p = s_j.replace('\\u', '%u')#\u 转%u
    s_p=s_p.replace('\"','')#去掉双引号
    return s_p
print(rep('中文'))

最快捷的方法,就是先使用在线工具查看编码格式,然后再选择的对应转换方式。

基本上,这几个坑排过之后,就没太大问题了。
最终,程序大概跑了40万条左右的时候,我中止了。
我是这样想的,孩子的名字,还是要自己来起。虽然我一直不擅长干这事,无论是公司的名字,产品的名字,还是孩子的名字,但是,电脑发热也太严重了吧啊!