Python实现知识付费文档自动化生成及上传

入职了一家外企,平时晚上下班比较早,闲鱼时间除了丰富一下自己的技术,当然会看看直播,玩玩游戏。最近女朋友在考研,我就会帮她找一些资料,然后我看到了百度文库里面很多资料都是付费的,或者需要VIP才能查阅。然后我又看到很多大佬会上传自己的一些专业的资料,很多月入上万的,我在想我能不能也入手一个副业。里面包括课程付费,文档付费,鉴于自己口才不好,最后选择文档付费来研究,方向是试卷资料类型。

我的大体思路是下面这样的:

然后开始完成分模块完成,中间过程简单介绍,不做深入讲解。

爬虫采集中心

主要是采集题库,因为涉及到各个领域,所有分类整理非常重要,甚至还需要人工介入,用到的技术:

  • python
  • numpy
  • bs4
  • requests
  • selenium
  • esclient

大体流程就是取数据 ->数据分析 ->存数据

本地资源库

把分类整理好的资源存入ElasticSearch,为什么选择ElasticSearch呢,因为ElasticSearch采用倒排索引,它的分词查询是非常高效的,当我们在进行同类型,同源题目匹配时,非常有帮助。此处具体怎么处理跳过。

大体过程如下:

题目 ->去重(完整性校验)->存入ES

模板库

此处是我们自己设计的一套模板,包括word,html等模板,此处我们采用了jinjia2这个模板引擎。

Word模板如下

HTML模板如下,当然html最后会被转为PDF:

调度中心(获取ES数据,按模板生成试卷)

这个环节最重要,因为我们有很多模板,有些学科可能会采用不同的模板,因此包括的不同的mapping关系,此处暂不考虑这个模板的管理(后面会计划)。

采用从ES取到数据之后,找到对应模板,使用jinjia2渲染引擎宣传出最后的真实试卷。

def generateByRecord(record):
     # Config
    tplIndex = record['tplIndex']
    subject = record['subject']
    paperNum = record['paperNum']
    paperName = record['paperName']
    school = record['school']
    year  = str(record['year'])+"年"
    prefix = "及答案"
    outputFolder = 'output/' + getFolder()
    examUtil.makeDirIfNotExisted(outputFolder)

    outputFullFolder = 'output/' + getFolder() + '/full'
    examUtil.makeDirIfNotExisted(outputFullFolder)

    # Files
    tplJsonFile = "tpl/" + str(tplIndex) + "/tpl.json"
    tplFolder = "tpl/" + str(tplIndex)
    ruleJsonFile = "exams/" + subject + "/rule.json"
    subjectExamFile = "exams/" + subject + "/final.json"
    
    # Jsons
    tplJson = examUtil.load(tplJsonFile)
    ruleJson = examUtil.load(ruleJsonFile)
    subjectExamJson = examUtil.load(subjectExamFile)

    targets = []

    # get exams
    examPapers = []
    if tplJson and ruleJson and subjectExamJson:
        # Choose Rule
        chooseRuleIndex = record['chooseRuleIndex']
        chooseRule = ruleJson["tpls"][chooseRuleIndex - 1]
        ruleJson["rule"] = chooseRule

        examPapers = getExams(subjectExamJson, ruleJson, paperNum)

        for index, paperExams in enumerate(examPapers):
            tplJson["school"] = school
            tplJson["title"] = year + paperName + "(" + tplJson["bigNum"][index] + ")"
            tplJson["author"] = examUtil.randomName()
            tplJson["exams"] = chooseRule["exams"]
            for cateIndex, cateExams in enumerate(paperExams):
                tplJson["exams"][cateIndex]["contents"] = cateExams
            sourcePath = outputFolder + "/" + tplJson["school"] + tplJson["title"] + ".html"
            destPath = outputFolder + "/" + tplJson["school"] + tplJson["title"] + ".pdf"
            generateHTML(tplFolder, tplJson, sourcePath)
            HTML_PDF2(sourcePath, destPath)
            targets.append(destPath)
            print(destPath + "..................转换完成!")
        fullPath = outputFullFolder + "/" + year + school + paperName + "("+tplJson["bigNum"][paperNum-1]+"套试卷)" + prefix + ".pdf"
        mergePDF(targets, fullPath)

完成版试卷库

完成版的试卷库存放我们生成好的试卷,可以按日期存放如下:

自动发布

在自动发布之前需要进行人工审核,避免错误发生,当然如果前面都很完美,那当然没问题。

最终结果如下:

以上内容目前仍在完善中,项目在进行中····,由于自己工作和时间问题,没法投入大量精力研究。但是这个方向还是很错的。

感兴趣的可以联系我....

相关标签:
  • python
  • selenium
  • 文档付费
0人点赞

发表评论

当前游客模式,请登陆发言

所有评论(0)