<进击的虫师>如何让程序"懂很多"?

简介: 聊聊?最近在做一个有意思的小项目, 在一个聊天对话中, 你向电脑提出问题, 他会自动分词,然后根据关键字, 自动答复你对所有的关键字做出解释, 工作量实在太大, 即使能解释, 数据库容量也不够最后, 想到了实时爬虫.
聊聊?

最近在做一个有意思的小项目, 在一个聊天对话中, 你向电脑提出问题, 他会自动分词,然后根据关键字, 自动答复你
对所有的关键字做出解释, 工作量实在太大, 即使能解释, 数据库容量也不够
最后, 想到了实时爬虫...

如何分词?

目前比较好用的分词器 结巴(jieba)

今天早上吃了葱油饼和豆腐脑

爬哪里?

现成的百度百科


百度百科

爬什么?

那要看用户问什么了, 爬虫最好是实时的, 这样就能根据用户的提问, 直接获取关键词数据


效果演示

如何让程序变得更聪明(优化程序)?

每次爬完一个关键词后, 做一个本地备份, 既能避免百度策略临时变更带来的灾难, 也便于根据用户习惯, 优化程序


本地数据

爬不到怎么办?

对于用户问到, 但百度百科未收录的关键词, 会自动记录到log日志里面,便于后期改进词库


log

实时爬取百度百科

import os
import sys
import requests
from lxml import etree
import re
import time

# 从本地获取数据
def getLocalData(keyword):
    # 获取/baikeInfo下的所有文件名
    print("尝试查询本地数据信息")
    fileNames = os.listdir('./baikeInfo/')
    # 查询本地是否存在缓存数据
    latestCreateTime = ''
    for fileName in fileNames:
        # 文件关键字
        fileName0 = fileName.split("_")[0]
        # 文件创建时间
        fileName1 = fileName.split("_")[1].split('.')[0]
        # 如果当前文件名与目的文件名一致的话
        if fileName0 == keyword:
            # 如果时间缓存变量为空, 则存储当前时间戳
            if latestCreateTime == '':
                latestCreateTime = fileName1
            # 如果时间缓存变量不为空, 则比较时间戳, 如果当前时间更晚, 则更新时间戳
            elif int(fileName1) > int(latestCreateTime):
                latestCreateTime = fileName1
    # 创建需要读取的文件名
    NeedFileName = ''
    result = ''
    # 如果时间戳为空, 则说明文件不存在
    if latestCreateTime == '':
        return "未收录本词条"
    else:
        NeedFileName = keyword+"_"+latestCreateTime+'.txt'
        NeedFileNamePath = './baikeInfo/'+NeedFileName
        with open(NeedFileNamePath, 'r') as f:
            result = f.read()

    return result

# 从网络获取数据
def getInfo(keyword):
    headers = {
        # 设置用户代理头(为狼披上羊皮)
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
    }
    target_url = "https://baike.baidu.com/item/"+ str(keyword)
    result = ""

    try:
        # 尝试驱动爬虫获取实时数据
        try:
            data = requests.get(target_url, headers = headers)
            data_etree = etree.HTML(data.content)
            content_list = data_etree.xpath('//div[@class="lemma-summary"]/div[@class="para"]')
            # 如果不存在这个词条
            if len(content_list) == 0:
                return "未收录本词条"
            for content in content_list:
                # 递归抽取子节点数据
                result +=content.xpath('string(.)')
        # 如果无法获取响应数据, 则尝试读取本地数据, 做出响应
        except Exception as e:
            result = getLocalData(keyword)
            return result
    # 如果本地没有数据, 也无法从互联网获取, 则返回未收录词条
    except Exception as e:
        result = "未收录本词条"
        return result
    # 数据清洗, 移除类似[1][2]之类的标记字符
    result_list, num = [r for r in re.subn(r'\[\d{0,3}\]', '', result)]
    # 数据清洗, 移除多余的空格字符
    result = ''
    for r in result_list:
        result += str(r).strip()
    return result

# 保存数据, 并通过log记录未收录的的词条
def saveData(fileName, info):
    # 记录用户未查找到的词条, 结束函数
    if info == "未收录本词条":
        if os.path.exists("./log/"):
            pass
        else:
            os.makedirs("./log/")
        with open("./log/log.txt", "a") as f:
            newlog = time.strftime("%Y年%m月%d日%H时%M分%S秒")+"  "+"未找到关键词:"+fileName+"\n"
            f.write(newlog)
            return

    # 尝试创建baikeInfo文件夹    
    if os.path.exists("./baikeInfo/"):
        pass
    else:
        os.makedirs("./baikeInfo/")
    # 获取当前的年月日时分秒
    # 将数据保存到baikeInfo中, fileName.txt
    file_path = "./baikeInfo/" + fileName +"_"+ time.strftime("%Y%m%d%H%M%S") +'.txt'
    # 存储数据
    with open(file_path, "w+") as f:
        f.write(info)

# 程序入口
def getInput():
    wd = ''
    try: 
        wd = sys.argv[1]
    except:
        wd = "人工智能"
    result = getInfo(wd)
    if len(result)>0:
        saveData(wd,result)
    print(result)
    if result == "未收录本词条":
        return False
    return result

def main():
    result = getInput()
    return result

if __name__ == '__main__':
    main()

为程序加入彩蛋?

彩蛋很容易加, 可以先写好一个字典, 里面放入一些关键词, 并放入彩蛋, 当分词器得到用户关键词时,先查字典, 如果能匹配到彩蛋, 就在最终的结果里面加入彩蛋信息,

本篇文章彩蛋:

文章点赞过50, 作者会上线程序的彩蛋版本,并将彩蛋链接更新到文章底部!

目录
相关文章
|
设计模式 机器学习/深度学习 SQL
软考高级系统架构设计师通关经验分享
为什么考系统架构设计师是国家设立的计算机技术与软件专业技术资格考试(简称软考)中的一个高级科目,属于工程师高级职称系列,具有一定含金量。浙江省每年通过软考高级的人数约为1000+人,其中系统架构设计师科目的通过人数约为200+人。从学习角度来说,通过准备系统架构设计师的考试的过程,可以查漏补缺,并且了解一些系统架构设计相关的基础知识,实现一定程度上的自我提升;从目的性的角度来说,通过考试,可以在一
9100 3
软考高级系统架构设计师通关经验分享
|
3月前
电子好书发您分享《低代码开发师(中级)实战教程》
电子好书发您分享《低代码开发师(中级)实战教程》
49 1
电子好书发您分享《低代码开发师(中级)实战教程》
|
2月前
|
前端开发 JavaScript 搜索推荐
专业与传统相融,程序员特有祝福:通过前端代码送上新春祝福
新春佳节即将来临,忙了一年,作为程序员,当然要用属于程序员独有的方式来给大家送上新春祝福。在这个喜庆的时刻,让我们以技术的视角来送上一份特别的新春祝福,作为程序员,我们可以用代码和技术,为了大家带来一份独特而有趣的祝福,为了给节日增添一份属于技术人特有的魅力,以前端开发的视角来送上一份特别的新春祝福。作为前端开发者,通过编写前端代码可以创造出丰富多样的视觉效果,可以利用HTML、CSS和JavaScript等编写代码来呈现出直观的新春祝福效果,为大家呈现出生动直观的新春祝福。那么本文以前端程序员的视角,结合前端专业知识送上新春祝福,希望在新的一年里,大家的生活充满幸福和技术的收获。
34 1
专业与传统相融,程序员特有祝福:通过前端代码送上新春祝福
|
3月前
|
人工智能 搜索推荐 开发者
社区供稿 | 大模型恋爱神器!16种MBTI自由定制,北大ChatLaw团队出品
北大团队新作,让大模型拥有个性!而且还是自定义那种,16种MBTI都能选。
|
4月前
|
分布式计算 Java 大数据
震精,京东T8工程师每天熬夜到天明,竟只是为一套编程实战文档
大数据开发工程师系列共六本,包括Java面向对象编程、Java核心API编程、Java Web开发实战、MySQL数据库开发实战、SSM企业级框架实战、Hadoop & Spark大数据开发实战,一套比较全面的开发工程师书籍。
|
11月前
|
机器学习/深度学习 前端开发 搜索推荐
2023大淘宝技术工程师推荐书单
今天是4月23日了,是联合国教科文组织规定的“世界读书日”。 大淘宝技术的工程师们精心挑选出7本技术类书籍, 有机器学习方面的、推荐系统方面的,分布式领域的,等等。每一位工程师都根据自己真实的阅读心得写了推荐语,希望能帮大家更快挑选到对自己有用的书籍。
177 0
|
存储 安全 数据库
软件评测师笔记(十二)—— 口令攻击相关
软件评测师笔记(十二)—— 口令攻击相关
158 0
|
存储
软件评测师笔记(五)—— 计算题
软件评测师笔记(五)—— 计算题
316 0
|
数据采集 程序员 Python
后浪派业余摊主的入门指导
后浪派业余摊主的入门指导
147 0
后浪派业余摊主的入门指导
|
运维 自然语言处理 安全
人人网校园开发者大赛:来看看校园极客都开发出了哪些有意思的作品?
人人网作为大学生喜爱的社交网站,在校园里有着广泛的使用人群和影响力。由人人网主办的校园开发者大赛面向全国各高校在校大学生,鼓励大家通过实践提升产品设计、技术应用与创新的能力。
495 0
人人网校园开发者大赛:来看看校园极客都开发出了哪些有意思的作品?