一文带你爬取传统古诗词(超级简单!)

目录

  • 一、小小课堂

  • 二、网页分析

    • 2.7.1 拼接URL

    • 2.7.2 内容解析

    • 1. xpath解析

    • 2. 代码实现

    • 3. 运行结果

    • 2.1 确定要爬取的内容对应的url

    • 2.2 分析抓取的主要内容

    • 2.3 获取所有的一级类型(错误版本)

    • 2.4 获取所有的一级类型(修改版本)

    • 2.5 获取二级标题

    • 2.6 获取二级类型下诗词的名称和url

    • 2.7 查询数据

  • 三、完整代码

  • 四、保存结果

一、小小课堂


中国文学源远流长,早在远古时代,虽然文字还没有产生,但在人民中间已经流传着神话传说和民间歌谣等口头文学。随着时间线的推移,先后出现了:诗经(西周)——楚辞(战国)——乐府(汉)——赋(晋)——唐诗——宋词——元曲——明清小说。

现在一提,不知各位想到的是什么。但是本人首先想到的诗歌是《阿房宫赋》、《水调歌头·明月几时有》、《念奴娇·赤壁怀古》、《茅屋为秋风所破歌》等等。可能是因为这些个别的诗歌贼长,在高中时期折磨过我的原因吧-。-

现在有一个新的职业——网络文学作家,他们写小说发布在网上,通过其有趣的故事情节及其丰富的主分线并行等特点吸引大批作者,从而达到挣钱的目的。但是,不知你知道与否,早在我国古代的明清时期,白话小说就已经蓬勃发展了。在那是,出现了“章回体小说”。一提到“章回体小说”,我们就不得不提到四大名著。名著之所以能够成为名著,是与其特点分不开的。它们的特点是分回标目,常取一个或两个中心事件为一回,每回篇幅大致相等,情节前后衔接,开头、结尾常用“话说”“且听下回分解”等口头语,中间穿插诗词韵文,结尾故设悬念吸引读者。除了四大名著之外,还有博主最喜欢的两本书:《儒林外史》、《聊斋志异》。哈哈,博主在此声明,我不是推销小说的啊。只是单纯的有感而发而已。如果各位想要看看博主推荐的书的话,也是可以的。总之你看了也没有任何坏处。

我国古典文学如此之多,在整个世界上也是实属罕见的。那么,作为新世纪国家的创造者,我们因该的做的就是传承好古典文学。古为今用,弘扬社会主义价值观,好让中国文学能够继续更好的继承下去。

现在因该会有读者会说,改进入正题了。????,从现在开始进入正题。

上面说了那么多,虽然看似与本文无关,但是其实是有关系的。想象一下,既然我们要更多的品味古典文学,我们是不是要专门的查看借鉴。但是又由于现在我们的时间都是零碎化的时间快,单独看书又不太现实。现如今网络如此之发达,我们每个人基本上都已经离不开电脑、手机了。那么我们可不可以通过Python爬虫的方式,把这些内容全不爬取出来,然后通过电子设备进行阅读呢?


下面就开始实现此设想。

二、网页分析

从理想到现实的第一步,当然是先找到网站了。

古诗文网:https://www.gushiwen.org/

我们打开网址之后,发现网页如下:

2.1 确定要爬取的内容对应的url

我们先查看网页的结构

1. 先点击更多 查看多有的类型

2. 我们可以看到下图已经把所有的类型显示出来

3. 通过开发者选项确定起始URL

通过查看,我们可以判定我们的起始URL为:https://so.gushiwen.cn/shiwen/

代码:

start_url = "https://so.gushiwen.cn/shiwen/"
base_url = "https://so.gushiwen.cn"

2.2 分析抓取的主要内容


根据上述两图我们先确定爬取的内容:一级类型,二级类型,诗词名称,诗词作者,诗词内容,诗词译文及注释

2.3 获取所有的一级类型(错误版本)

1.分析

2. 尝试xpath解析

3.代码实现

import requests
from lxml import etreestart_url = "https://so.gushiwen.cn/shiwen/"
base_url = "https://so.gushiwen.cn"headers = {"user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
}items = []def parse_url(url):"""解析url,得到响应内容"""# time.sleep(random.random())response = requests.get(url=url, headers=headers)return response.content.decode("utf-8")def parse_html(html):"""使用xpath解析html,返回xpath对象"""etree_obj = etree.HTML(html)return etree_objhtml = parse_url(start_url)
etree_obj = parse_html(html)
first_type_name_list = etree_obj.xpath('//div[@class="cont"]/a/text()')
first_type_url_list = etree_obj.xpath('//div[@class="cont"]/a/@href')
print(first_type_name_list)
print(first_type_url_list)

4. 结果

不知道,同学们有没有发现此处有问题呢?

2.4 获取所有的一级类型(修改版本)

我们上述的解析式其实是有问题的,它是吧所有的包括作者也解析出来了,看下图:

正确的写法是这样的

first_type_name_list = etree_obj.xpath('(//a[contains(@href,"/gushi/")]|//a[contains(@href,"/wenyan/")])/text()')
first_type_url_list = etree_obj.xpath('(//a[contains(@href,"/gushi/")]|//a[contains(@href,"/wenyan/")])/@href')

2.5 获取二级标题

1. 解析

2. 代码

    #二级类型类型数据divfor div in div_list:#二级类型名称second_type_name = div.xpath(".//strong/text()")if second_type_name:  # 有的没有二级类型second_type_name = second_type_name[0]else:second_type_name = ""print(second_type_name)

3. 结果

2.6 获取二级类型下诗词的名称和url

1. xpath解析

2. 代码

        #二级类型下诗词的名称和urlpoetry_name_list = div.xpath(".//span/a/text()")poetry_url_list = div.xpath(".//span/a/@href")data_zip = zip(poetry_name_list,poetry_url_list)

2.7 查询数据

2.7.1 拼接URL

1. 拼接一级标题的URL

查询数据的话,首先我们先拼接一级URL

    #一级类型urlurl = base_url + first_type["url"]print(url)first_type_name = first_type["name"]print(first_type_name)

2. 拼接二级标题的URL

        for data in data_zip:#item是一个诗词数据item = {}item["first_type_name"] = first_type_nameitem["second_type_name"] = second_type_nameitem["poetry_name"] = data[0]#诗词urlpoetry_url = base_url+data[1]print(poetry_url)

2.7.2 内容解析

1. xpath解析

1.诗词名称

2.诗词作者

3.诗词内容

4.诗词译文及注释

2. 代码实现

            #诗词作者poetry_author = etree_obj.xpath('//p[@class="source"]')[0].xpath(".//text()")item["poetry_author"] = "".join(poetry_author).strip()#诗词内容poetry_content = etree_obj.xpath('//*[@id="contson45c396367f59"]/text()')item["poetry_content"] = "".join(poetry_content).strip()#诗词译文和注释if etree_obj.xpath('//div[@class="contyishang"]'):#有的没有注释poetry_explain = etree_obj.xpath('//div[@class="contyishang"]')[0].xpath(".//text()")item["poetry_explain"] = "".join(poetry_explain).strip()else:item["poetry_explain"] = ""print(item)

为什么会加上判断语句,是因为网站有反爬机制,通过加上判断机制,才能够正常的循环爬取。

3. 运行结果

三、完整代码

# encoding: utf-8
'''@software: Pycharm@file: 古诗词.py@Version:1.0'''
"""
https://www.gushiwen.cn/
https://so.gushiwen.cn/shiwen/
"""
import requests
import time
import random
import csv
from lxml import etreestart_url = "https://so.gushiwen.cn/shiwen/"
base_url = "https://so.gushiwen.cn"headers = {"user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
}items = []def parse_url(url):"""解析url,得到响应内容"""# time.sleep(random.random())response = requests.get(url=url, headers=headers)return response.content.decode("utf-8")def parse_html(html):"""使用xpath解析html,返回xpath对象"""etree_obj = etree.HTML(html)return etree_objdef get_first_type():"""获取所有的一级类型"""first_type_list = []html = parse_url(start_url)etree_obj = parse_html(html)first_type_name_list = etree_obj.xpath('(//a[contains(@href,"/gushi/")]|//a[contains(@href,"/wenyan/")])/text()')first_type_url_list = etree_obj.xpath('(//a[contains(@href,"/gushi/")]|//a[contains(@href,"/wenyan/")])/@href')data_zip = zip(first_type_name_list, first_type_url_list)for data in data_zip:first_type = {}first_type["name"] = data[0]first_type["url"] = data[1]first_type_list.append(first_type)return first_type_listdef get_data(first_type):"""查询数据"""#一级类型urlurl = base_url + first_type["url"]first_type_name = first_type["name"]#向一级类型url发送请求获取二级类型数据html = parse_url(url)etree_obj = parse_html(html)div_list = etree_obj.xpath('//div[@class="typecont"]')#二级类型类型数据divfor div in div_list:#二级类型名称second_type_name = div.xpath(".//strong/text()")if second_type_name:  # 有的没有二级类型second_type_name = second_type_name[0]else:second_type_name = ""#二级类型下诗词的名称和urlpoetry_name_list = div.xpath(".//span/a/text()")poetry_url_list = div.xpath(".//span/a/@href")data_zip = zip(poetry_name_list,poetry_url_list)for data in data_zip:#item是一个诗词数据item = {}item["first_type_name"] = first_type_nameitem["second_type_name"] = second_type_nameitem["poetry_name"] = data[0]#诗词urlpoetry_url = base_url+data[1]html = parse_url(poetry_url)etree_obj = parse_html(html)#诗词作者poetry_author = etree_obj.xpath('//p[@class="source"]')[0].xpath(".//text()")item["poetry_author"] = "".join(poetry_author).strip()#诗词内容poetry_content = etree_obj.xpath('//*[@id="contson45c396367f59"]/text()')item["poetry_content"] = "".join(poetry_content).strip()#诗词译文和注释if etree_obj.xpath('//div[@class="contyishang"]'):#有的没有注释poetry_explain = etree_obj.xpath('//div[@class="contyishang"]')[0].xpath(".//text()")item["poetry_explain"] = "".join(poetry_explain).strip()else:item["poetry_explain"] = ""print(item)# 保存save(item)def save(item):"""将数据保存到csv中"""with open("./古诗词.csv", "a", encoding="utf-8") as file:writer = csv.writer(file)writer.writerow(item.values())def start():first_type_list = get_first_type()for first_type in first_type_list:get_data(first_type)if __name__ == '__main__':start()

四、保存结果

此程序还有一点小问题,就是由于网站存在有JS加密。有一部分无法正常保存下来。不过没关系,后期再进行改进!

正文结束!!!!

欢迎关注公众号:Python爬虫数据分析挖掘

记录学习python的点点滴滴;

回复【开源源码】免费获取更多开源项目源码;

公众号每日更新python知识和【免费】工具;

本文已同步到【开源中国】、【腾讯云社区】、【CSDN】;

听说这样学习古诗词才是正确的!相关推荐

  1. 如何自学python数据分析-良心整理!学习Python数据分析的正确姿势

    学习 Python 数据分析的正确姿势 如果你是通过学习给程序员设计的 Python 课程来学习 Python 数据分析,那就大错特错了.很多数据分析师在开始学习 Python 数据分析之前就被引导学 ...

  2. 程序员抱怨:父母没文化没见识,当初努力学习远离看来是正确的

    不知道从什么时候开始,老家与父母就成了这一代职场人的一种「精神酷刑」,两代人的代沟冲突总会发展成鸡同鸭讲.长辈间的话题,我们不感兴趣.我们所专注的东西对他们来说又过于陌生和遥不可及,最终只剩下沉默,甚 ...

  3. 打油诗---------听说名字要长才有人看

    半夜三更, 睡不着觉. 打开电脑, 写篇文章. 我要是说这是篇打油诗会被揍吧,呵呵. 前不久报名去了LAMP兄弟连.http://www.lampbrother.net(话说SEO就是这么弄吧).因为 ...

  4. 宝宝的学前教育主要学什么才是正确的?

    文章来源: http://www.jiatingjiaoyuzhidaoshi.com/1222.html​ 所谓学前教育就是孩子在0至6岁的这个阶段,你对孩子进行了怎样的教育. 而在这个期间又可以分 ...

  5. 云计算的认识和看法_【云计算】如何理解云计算才是正确的?

    原标题:[云计算]如何理解云计算才是正确的? 云计算是什么?你可能会从别人那里得到十几中不同的答案,这对帮助你更好的理解云计算一点好处也没有,在日常工作接触云计算时你会发现,云计算包括很多不同的应用程 ...

  6. 可变车道怎么走不违章_可变车道怎么才能正确通行?老司机来告诉你什么才是正确的走法。...

    在我们日常生活中驾驶汽车出行是非常普遍的事情,很多司机都知道不同车道的不同作用,比如直行车道.左转车道.调头车道,但是遇到可变车道就不会走了,可变车道就是两侧的车道线内带有锯齿状的线,作用也是非常大, ...

  7. python语言自学-零基础小白学习Python编程语言的正确姿势(纯干货)

    原标题:零基础小白学习Python编程语言的正确姿势(纯干货) 敢问有哪种编程语言集简洁.优雅.简单.全能于一身?Python绝对算的上是一个.举个例子,比如完成同一个任务,C语言需要写1000行代码 ...

  8. 下面中???该如何填写,才可以正确执行强制类型转换? int (*monthp)[31]; monthp = (???)malloc(31);

    例子:下面中???该如何填写,才可以正确执行强制类型转换? int (*monthp)[31]; monthp = (???)malloc(31); 在这里int (*monthp)[31];是一个套 ...

  9. latex 中表格怎么指定编号_在医学论文中,应用表格怎么用才是正确的?

    表格是记录数据或事物分类的一种有效表达方法,具有清晰准确的特点,是医学论文的重要组成部分.有些作者在制作时,常常出现表格不规范的情况.为了避免出现这种情况,建议在医学论文中应用表格时,有必要先了解一下 ...

最新文章

  1. 【紧急】支付宝全面停止微信合作
  2. 还款每个月90.85元, 到 2012年10月,2012 11月 2256元,共 5799.25元
  3. iOS更改状态栏前景色背景色
  4. python好找工作么-python和django掌握到什么水平才好找工作?
  5. mysql-5.6.16-win32_mysql-5.6.16-win32免安装配置方法
  6. 使用jQuery来实现一个简单的ajax请求
  7. php curl nginx post 空_【青藤云安全研究】绕过php的disable_functions(上篇)
  8. Linux Matlab服务器进一步改造成Application Server(应用程序服务器)
  9. Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
  10. SC2disease:人类疾病的单细胞转录组的人工收集数据库
  11. 7.CCNA第七天-探索数据转发
  12. 大佬们用代码写的故事,代码你打算写到几岁?
  13. opengl光照效果之点光源
  14. 基于有道API的命令行词典(golang版)
  15. word 2016样式设置及样式集保存
  16. Python库collections中的计数器(Counter)
  17. 天刃_张志刚_SEO优化技巧
  18. 2021高考成绩查询怎么查小分,2021微信哪个小程序可以查成绩 高考成绩怎么查
  19. java老师和学生(java老师学生类合集)
  20. 来自帅气博主的c语言文案

热门文章

  1. centos使用rpmforge-release
  2. docker部署tf-serving
  3. 计算机操作系统和进程
  4. Android 9.0 适配指南
  5. Tarjan 求有向图的强连通分量
  6. 双机双工是什么意思?与双机热备有什么区别?
  7. 计算机ps作品大赛奖品,全国创新杯说课大赛计算机应用基础类一等奖作品:ps动态图像制作说课课件...
  8. zsh 使用scp传输文件时使用通配符报错
  9. 支持动态属性的标签库 [ 04-12-30 | 刘冬 ]
  10. apache 配置跨域