入职了一家外企,平时晚上下班比较早,闲鱼时间除了丰富一下自己的技术,当然会看看直播,玩玩游戏。最近女朋友在考研,我就会帮她找一些资料,然后我看到了百度文库里面很多资料都是付费的,或者需要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)
完成版试卷库
完成版的试卷库存放我们生成好的试卷,可以按日期存放如下:
自动发布
在自动发布之前需要进行人工审核,避免错误发生,当然如果前面都很完美,那当然没问题。
最终结果如下:
以上内容目前仍在完善中,项目在进行中····,由于自己工作和时间问题,没法投入大量精力研究。但是这个方向还是很错的。
感兴趣的可以联系我....
发表评论
所有评论(0)