python写诗【随机生成】【庆祝鱼油3,鱼币福利~】
本帖最后由 青出于蓝 于 2022-11-29 08:48 编辑本作品基于requests爬取网络古诗文,再生成新诗句
写了两个py程序,难度并不大
效果图
https://xxx.ilovefishc.com/album/202107/15/112707o5qj0pp50uffftp4.png
https://xxx.ilovefishc.com/album/202107/15/112711locfxnj8zo2dnftt.png
写了两个文件
第一步:获取网址
爬取古诗文需要两个库requests和re,导入:
import requests
import re
咱们目标网站是 https://so.gushiwen.cn/gushi/tangshi.aspx
我们要从这个唐诗三百首的总页里爬取每一首诗的网址(headerds防反爬)
url="https://so.gushiwen.cn/gushi/tangshi.aspx"
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0"}
html=requests.get(url,headers=headers).text
hh=re.findall("/shiwenv_[\d\D]{17}",html)
每一首诗的网址(后半部分)都放到了名叫hh的列表里
至此,网址获取完了,进入第二步——爬取诗词{:5_91:}
第二步:爬取诗词
上一步把每一首诗后半部分的网址保存到了hh列表里,所以我们要用for循环遍历整个列表,然后加上前半部分形成完整的网址,从而顺利爬取网页源码
for fff in hh:
url="https://so.gushiwen.cn"+fff
html=requests.get(url,headers=headers).text
re匹配出来并不全是诗句,而且多余部分还很多,所以我又在基础上匹配了一次
第二次出来的结果仍然不全是诗句,我们只取中间的诗句部分,保存为e
for i in re.findall("<meta name=\"description\" content=\"[\d\D]+。\" />",html):
for c in re.findall("t=\"[\d\D]+\"",i):
e=c
好啦,第二步完成了。在这里e只是循环里的一个字符串,第三步中我们回答他加工保存~
第三步:分词并保存
分词需要用到一个很厉害的库,名叫jieba(需要下载滴),导入它
import jieba
jieba分词有三个模式:精确模式、全模式、搜索引擎模式,具体可以查阅相关资料,这里用的精确模式,会返回一个列表
aa=jieba.lcut(e)
诗句里不仅仅有汉字,还有一些标点(怕取出来的东西还有括号啥的),所以我们要过滤一下,过滤后保存到f列表里(前面命名过)
for d in aa:
if d!=","and d!="。"and d!=":"and d!="!"and d!="?"and d!="("and d!=")"and d!="("and d!=")" and d!=":"and d!=" ":
f.append(d)
我们需要的数据就有了,最后我们需要保存这个列表f为一个json文件,名为data.json,这里不一定非要用json,pwl等也可以
with open("data.json",mode='w',encoding="utf-8") as fd:
fd.write(json.dumps(f,ensure_ascii=False))
在这里,别忘了导入json库
import json
至此,第三步结束了,第一个程序也结束了,源码在目录最后,大伙可以参考源码进行学习
第四步:导入数据,用户输入
先导入需要的库:
import json
读入json文件要用loads方法
with open("data.json",'r',encoding="utf-8") as f:
data = json.loads(f.read())
程序做了个与用户的互动,程序生成几句诗,每句诗生成几个字,这都是用户来输入的。我们把这两个数据命名为d和e
d=int(input("杂诗几句?"))
e=int(input("一句几字?"))
至此,第四步完成了,还是很简单滴{:5_108:}
第五步:形成诗句并输出
第三步时jieba把诗句分词,分出来的词长短不一,有的3字,有的2字,有的1字。我们如何把它们组合成固定的字数呢?
这里我们必须认识到两点: 1,我们爬了320首古诗,词汇量很大,不用担心词用完了,找不到1字词了
2,就算词语全用完了, 古诗中词语可以重复呀
综上所述,如果用户想要5言诗,不会出现到4个字时死活匹配不到1个字的词语的情况
所以我们只需要粗暴形成诗句,随机匹配,如果诗句字数不就那就再匹配,到了就输出,超了就pass
然后我们每次形成一句诗,d就-1
2套循环就可以搞定!!!
思路明确,代码也就好写了,直接上!
while d:
f=""
while True:
c=random.randint(0,len(data)-1)
if len(f)+len(data)>e:
pass
else:
f+=data
if len(f)==e:
print(f,end=" ")
break
d-=1
我们完成了目标,第五步完成了,整个程序结束了~
(源码在目录最后一页)
这里是源码:
**** Hidden Message *****
本帖最后由 青出于蓝 于 2021-7-15 15:35 编辑
写代码不容易,还望大伙多评点分 {:5_95:} @lijiachen @叙白 @永远的渣滓 @shriek @不二如是
厉害! 看看 挺有趣的{:5_95:} 厉害 厉害 Get鱼币
没有?{:10_269:} 太强了,膜大佬,{:10_254:} 厉害了 123 66666
强 厉害 支持 强强强 牛