青出于蓝 发表于 2021-7-15 12:59:16

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 12:59:17

本帖最后由 青出于蓝 于 2021-7-15 15:35 编辑

写代码不容易,还望大伙多评点分

hornwong 发表于 2021-7-15 13:00:02

{:5_95:}

青出于蓝 发表于 2021-7-15 13:00:29

@lijiachen @叙白 @永远的渣滓 @shriek @不二如是

hornwong 发表于 2021-7-15 13:00:33

厉害!

散仙萌 发表于 2021-7-15 13:19:09

看看

fengo0 发表于 2021-7-15 13:38:28

挺有趣的{:5_95:}

Vanityasd 发表于 2021-7-15 14:09:29

厉害

shriek 发表于 2021-7-15 14:13:08

厉害

xiaosi4081 发表于 2021-7-15 14:37:53

Get鱼币

xiaosi4081 发表于 2021-7-15 14:38:53

没有?{:10_269:}

WUT—WXL 发表于 2021-7-15 14:52:51

太强了,膜大佬,{:10_254:}

罗巴乔 发表于 2021-7-15 15:07:08

厉害了

编程好难啊1 发表于 2021-7-15 15:10:56

123

robinyunhao 发表于 2021-7-15 18:32:45

66666

Henry777 发表于 2021-7-15 19:34:55

还能踢两年 发表于 2021-7-15 19:55:01

厉害

我是小白别骗我 发表于 2021-7-15 20:16:18

支持

Kayko 发表于 2021-7-15 20:48:24

强强强

Kayko 发表于 2021-7-15 20:49:06

页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: python写诗【随机生成】【庆祝鱼油3,鱼币福利~】