python做出来的小程序、可以在win10上面运行_超详细,手把手教你用20行Python代码制作飞花令小程序!...
原标题:超详细,手把手教你用20行Python代码制作飞花令小程序!
来源:早起Python
作者:陈熹
飞花令是古时候人们经常玩一种“行酒令”的游戏,是中国古代酒令之一,属雅令。“飞花”一词则出自唐代诗人韩翃《寒食》中 春城无处不飞花 一句。行飞花令时选用诗和词,也可用曲,但选择的句子一般不超过7个字。
在《中国诗词大会》中改良了“飞花令”,不再仅用 花 字,而是增加了 云、 春、月、夜 等诗词中的高频字,轮流背诵含有关键字的诗句,直至决出胜负。
今天,我们就利用 Python 定制一款“飞花令”小程序:给定一个关键字或者关键词,就能够返回许多含有这个关键字的诗句,跟朋友玩再也不怕输了!
网页分析
要利用爬虫完成这项工作需要先选择一个合适的网站,这里我们选择了 古诗文网
在右上角的方框中输入关键词,如酒,就能够返回相应的结果:
我们注意到,返回的结果是一整首诗或词,关键字所在的句子仅为其中一句。后面我们爬取信息时也需要做到过滤。
往下翻页后会发现只能获取前 2 页内容,到第 3 页会出现以下提示:
也就是说要完整获取全部诗文需要下载 App,本文简化问题只爬取前 2 页的内容,后续有机会再分享 App 相关爬虫推文。在翻页的过程中我们注意一下 URL 的改变:
“
第 1 页:https://so.gushiwen.cn/search.aspx?value=酒
第 2 页:https://so.gushiwen.cn/search.aspx?type=title&page=2&value=酒
”
其中经过测试 type=title 可以去除,而page=2 显然是页码,那么 page=1 能否获取到第 1 页呢?
答案是可以的,因此不需要用 requests 的 post 请求,直接 get 下面的 URL 就可到达指定页面:https://so.gushiwen.cn/search.aspx?page=页码&value=关键字
大致分析完就可以写代码了
代码实现
首先导入库,设置请求头
import requests
from lxml import html
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'}
以关键字酒为例,尝试获取第一页全部内容:
import requests
from lxml import html
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'}
html_data = requests.get('https://so.gushiwen.cn/search.aspx?page=1&value=酒', headers=headers).text
print(html_data)
返回的文本中有我们需要的内容,说明组合而成的请求是没有问题的。接下来就可以解析文本获取具体内容了,本文采用 Xpath:
selector = html.fromstring(html_data)
poets = selector.xpath("/html/body/div[2]/div[1]/div[@class='sons']")
for poet in poets:
title = ''.join(poet.xpath("div[1]/p[1]/a/b//text()")).strip()
print(title)
诗人和朝代被分隔至两行,说明之间存在换行符及空格,可以用包含.strip()的列表推导式去除:
for poet in poets:
title = ''.join(poet.xpath("div[1]/p[1]/a/b//text()")).strip()
source = ''.join(poet.xpath('div[1]/p[2]//text()'))
source = ''.join([i.strip() for i in source])
print(title, source)
最后是对诗句的解析。为了获取关键字真正在的句子,我们要通过句号或者问号将整首诗断开成多个完整句:
for poet in poets:
title = ''.join(poet.xpath("div[1]/p[1]/a/b//text()")).strip()
source = ''.join(poet.xpath('div[1]/p[2]//text()'))
source = ''.join([i.strip() for i in source])
contents = ''.join(poet.xpath('div[1]/div[@class="contson"]//text()')).strip().replace('\n', '。').replace('?', '。').split('。')
print(title, source, contents)
对每一首诗逐渐判断是否包含关键字:
for poet in poets:
title = ''.join(poet.xpath("div[1]/p[1]/a/b//text()")).strip()
source = ''.join(poet.xpath('div[1]/p[2]//text()'))
source = ''.join([i.strip() for i in source])
contents = ''.join(poet.xpath('div[1]/div[@class="contson"]//text()')).strip().replace('\n', '。').replace('?', '。').split('。')
content_lst = []
for i in contents:
if '酒' in i:
content = i.strip() + '。'
content_lst.append(content)
# 有的诗可能有两句都包含关键字,这两句诗就都是需求
if not content_lst: # 有可能只有题目中含有关键词,这种诗就跳过
continue
for j in list(set(content_lst)): # 有可能有的诗虽然有两句都包含关键字,但这两句是一样的,需要去重
print(j, title, source)
大部分需求已经满足,最后只需要利用循环结构组装 URL 达到范围多页的目的,同时关键字可以修改为 input 交互输入,代码如下:
import requests
from lxml import html
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'}
def poet_content(keyword,num,url):
html_data = requests.get(url, headers=headers).text
selector = html.fromstring(html_data)
poets = selector.xpath("/html/body/div[2]/div[1]/div[@class='sons']")
for poet in poets:
title = ''.join(poet.xpath("div[1]/p[1]/a/b//text()")).strip()
source = ''.join(poet.xpath('div[1]/p[2]//text()'))
source = ''.join([i.strip() for i in source])
contents = ''.join(poet.xpath('div[1]/div[@class="contson"]//text()')).strip().replace('\n', '。').replace('?','。').split('。')
content_lst = []
for i in contents:
if keyword in i:
content = i.strip() + '。'
content_lst.append(content)
if not content_lst:
continue
for j in list(set(content_lst)):
print(num, j)
print(f'', source)
print('')
num += 1
return num
if __name__ == '__main__':
keyword = input('> 请输入关键词: ')
print('')
num = 1
for i in range(1, 3):
url = f'https://so.gushiwen.org/search.aspx?page={i}&value={keyword}'
num = poet_content(keyword, num, url)
至此,我们就通过 Python 爬虫就成功制作了一款“飞花令”小工具,感兴趣的读者可以自己尝试一下!返回搜狐,查看更多
责任编辑:
python做出来的小程序、可以在win10上面运行_超详细,手把手教你用20行Python代码制作飞花令小程序!...相关推荐
- 超详细,手把手教你用20行Python代码制作飞花令小程序!
大家好,我是涛哥. 飞花令是古时候人们经常玩一种"行酒令"的游戏,是中国古代酒令之一,属雅令."飞花"一词则出自唐代诗人韩翃<寒食>中 春城无处不飞 ...
- 手把手教你用20行Python代码制作飞花令小程序!
飞花令是古时候人们经常玩一种"行酒令"的游戏,是中国古代酒令之一,属雅令."飞花"一词则出自唐代诗人韩翃<寒食>中 春城无处不飞花 一句.行飞花令时 ...
- python小游戏代码大全-20行python代码的入门级小游戏的详解
背景: 作为一个python小白,今天从菜鸟教程上看了一些python的教程,看到了python的一些语法,对比起来(有其他语言功底),感觉还是非常有趣,就随手添了一点内容,改了一个小例程,当着练练手 ...
- 手把手教你搭建美团饿了么电影票外卖cps小程序 附源码
手把手教你搭建美团饿了么电影票外卖cps小程序 附源码 外卖红包项目的优势 1.刚需:吃饭是每日刚需,尤其是城市白领,上班族,宅男宅女,等群体点外卖的需求,需求更是高频率(每天). 2.门槛低:平台门 ...
- python自动生成鸡汤文_用20行Python代码生成鸡汤,打造AI咪蒙指日可待。
作者:Ramtin Alami "Don't think of the overwhelming majority of the impossible." "不要去想不可 ...
- 用20行Python代码生成鸡汤,打造AI咪蒙指日可待
先给大家分享点鸡汤: "Don't think of the overwhelming majority of the impossible." "不要去想不可能之事&q ...
- 手把手教你写网站:Python WEB开发技术实战
摘要:本文详细介绍了Python WEB开发的基础入门.以一个博客站点的开发为例讲解了基于Django框架开发WEB站点的全过程.通过本文的学习可以快速掌握基于Django的Python WEB的开发 ...
- Python的零基础超详细讲解(第七天)-Python的数据的应用
往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...
- 20行 Python 代码爬取王者荣耀全英雄皮肤 | 原力计划
作者 | wangweijun 责编 | Elle 出品 | CSDN 博客 引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王 ...
最新文章
- 理解Android编译命令(转)
- 9-7NOIP模拟赛总结
- 【知识星球】卷积核和感受野可动态分配的分组卷积
- [转]Ubuntu下ROS开发环境搭建(QT+ros_qtc_plugin)
- SnapGene mac 5.3.1 中文分子生物学可视化工具及教程
- 算法:排序算法的比较
- html仿手机界面,javascript新手实例3-仿手机聊天界面(if else运用)
- IEC61850的Read请求报文件MMS PDU解码
- 数据分析工作常见的七种错误及规避技巧
- 第一财经周刊:诺基亚之死
- vue下载文件常用的几种方式
- 程序员常用的计算机编程语言介绍
- 十六国帝王纪元表-20170722
- ❤️肝下25万字的《决战Linux到精通》笔记,你的Linux水平将从入门到入魔❤️【建议收藏】
- MarkDown支持Emoji表情
- EXCEL表格如何实现隔行填充颜色
- Java经典入门教程!大连埃森哲java招聘信息
- element中设置5栏布局
- Web前端零基础入门——HTML5
- easyuefi只能在基于uefi启动的_只需2个命令,就能将win10 BIOS启动方式转换为UEFI,你见过吗!...
热门文章
- jxl.read.biff.BiffException: Unable to recognize OLE stream:
- Linux镜像下载和网络配置配置
- “连环布局”投资几千元,资源整合最短时间内把生意推广到全国!
- 语音对讲功能在GB28181协议国标视频云服务EasyGBS中的项目应用
- Java Web学习day26------Redis基础、Redis数据类型、常用指令、jedis、持久化
- 看到一个有关逻辑思维的视频,挺好的,分享一下
- 安装 HDF5r 包(自用)
- 企业做ISO9001认证需要提供哪些材料
- poj 1305 Fermat vs. Pythagoras(毕达哥斯拉三元组)
- go-rod使用指南:一些经验和坑