爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)

不温卜火 等级 477 0 0

  大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行更新,博客主页:https://buwenbuhuo.blog.csdn.net/爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)

PS:由于现在越来越多的人未经本人同意直接爬取博主本人文章,博主在此特别声明:未经本人允许,禁止转载!!!

目录


爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)


推荐

爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)
  ♥各位如果想要交流的话,可以加下QQ交流群:974178910,里面有各种你想要的学习资料。♥

  ♥欢迎大家关注公众号【不温卜火】,关注公众号即可以提前阅读又可以获取各种干货哦,同时公众号每满1024及1024倍数则会抽奖赠送机械键盘一份+IT书籍1份哟~♥
爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)

一、小小课堂

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

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

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

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

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

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

爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)
下面就开始实现此设想。

二、网页分析

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

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

我们打开网址之后,发现网页如下:
爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)

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

我们先查看网页的结构

    1. 先点击更多 查看多有的类型
      爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)
    1. 我们可以看到下图已经把所有的类型显示出来
      爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)
    1. 通过开发者选项确定起始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.分析
    爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)
    1. 尝试xpath解析
      爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)
      爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)
  • 3.代码实现
import requests
from lxml import etree

start_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_obj


html = 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) 
    1. 结果
      爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)
      不知道,同学们有没有发现此处有问题呢?
      爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)

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. 解析
      爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)
    1. 代码
 #二级类型类型数据div
    for 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) 
    1. 结果
      爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)

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

爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)

    1. xpath解析
      爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)
      爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)
    1. 代码
 #二级类型下诗词的名称和url
        poetry_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

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

爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)

    1. 拼接二级标题的URL
 for data in data_zip:
            #item是一个诗词数据
            item = {}
            item["first_type_name"] = first_type_name
            item["second_type_name"] = second_type_name
            item["poetry_name"] = data[0]
            #诗词url
            poetry_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
'''
  @author 李华鑫
  @create 2020-10-08 9:42
  Mycsdn:https://buwenbuhuo.blog.csdn.net/
  @contact: 459804692@qq.com
  @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 etree

start_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_obj

def 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_list

def get_data(first_type):
    """查询数据"""

    #一级类型url
    url = 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"]')
    #二级类型类型数据div
    for 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 = ""
        #二级类型下诗词的名称和url
        poetry_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_name
            item["second_type_name"] = second_type_name
            item["poetry_name"] = data[0]
            #诗词url
            poetry_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加密。有一部分无法正常保存下来。不过没有关系,等到后期博主会更新破解JS的博文。
爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)

美好的日子总是短暂的,虽然还想继续与大家畅谈,但是本篇博文到此已经结束了,如果还嫌不够过瘾,不用担心,我们下篇见!


爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)

  好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
  如果我的博客对你有帮助、如果你喜欢我的博客内容,请“点赞” “评论”“收藏”一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
  码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦!

爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)
爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)

本文转自 https://buwenbuhuo.blog.csdn.net/article/details/109306251,如有侵权,请联系删除。

收藏
评论区

相关推荐

爬虫入门经典(九) | 简单一文教你如何爬取扇贝单词
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
爬虫入门经典(十一) | 一文带你爬取传统古诗词(超级简单!)
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
爬虫入门经典(二十一) | 破解CSS加密之爬取大众点评
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
python算法
640?wx_fmtjpeg(https://imghelloworld.osscnbeijing.aliyuncs.com/c8238ed70f9664b61ce91f80786ca26f.png) 来源 | CSDN(ID:CSDNnews ) 本文是一些机器人算法(特别是自动导航算法)的Python代码合集。 其主要特点有以下
被“词云”包围的冰冰会更好看吗?安排
(https://imghelloworld.osscnbeijing.aliyuncs.com/b299933deefc692934e8cc6141ab3894.png) 大家好,我是小五🐶 昨天「凹凸数据」发了一篇张同学投稿的文章《用Python爬取王冰冰vlog弹幕并制作词云(https://mp.weixin.qq.com/
商业数据分析从入门到入职(9)Python网络数据获取
@toc 前言本文主要讲Python最常见的应用之一——网络数据获取,即爬虫:先介绍了网页和网络的基础知识,为从网页中获取数据打好基础;接下来以两个案例介绍从网络中获取数据和处理数据的不同方式,以进一步认识Python爬虫和数据处理。 一、网络和网页基础知识 1.数据来源数据源有很多,可以从数据库中获取,可以从文件中获取,也可以从
用python爬取4332条粽子数据进行分析,再送15盒粽子给大家
↑ 点击上方 “凹凸数据” 关注 + 星标  文章干货!有福利 !  端午节快要到了,甜咸粽子之争也快要拉开帷幕。 小五准备用Python爬取淘宝上的粽子数据并进行分析,看看有什么发现。(顺便送大家一波福利)爬虫爬取淘宝数据,本次采用的方法是:Selenium控制Chrome浏览器自动化操作\[1\]。其实我们还可以利用Ajax接口来构造链接,但是非常
Python网络爬虫与信息提取
title: Python网络爬虫与信息提取date: 20201210 01:00:23tags: Pythoncategories: 学习笔记 写在前面 不知道写啥其实说实话[TOC] 网络爬虫之规则 安装requests库cmd 命令行打开输入pip3 install requests,等待即可简单测试,爬一下bkjwpythonimport requ
《Python3网络爬虫开发实战》
提取码:1028内容简介 · · · · · ·本书介绍了如何利用Python 3开发网络爬虫,书中首先介绍了环境配置和基础知识,然后讨论了urllib、requests、正则表达式、Beautiful Soup、XPath、pyquery、数据存储、Ajax数据爬取等内容,接着通过多个案例介绍了不同场景下如何实现数据爬取,后介绍了pyspider框架、S
创建免费ip代理池
     反爬技术越来越成熟,为了爬取目标数据,必须对爬虫的请求进行伪装,骗过目标系统,目标系统通过判断请求的访问频次或请求参数将疑似爬虫的ip进行封禁,要求进行安全验证,通过python的第三方库faker可以随机生成header伪装请求头,并且减缓爬虫的爬取速度,能很好的避过多数目标系统的反扒机制,但对一些安全等级
3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”!
1\. 为"你"而写 这篇文章,是专门为那些 "刚学习" Python爬虫的朋友,而专门准备的文章。希望你看过这篇文章后,能够清晰的知道整个 "爬虫流程"。从而能够 "独立自主" 的去完成,某个简单网站的数据爬取。好了,咱们就开始整个 “爬虫教学” 之旅吧!2\. 页面分析 ① 你要爬取的网站是什么?首先,我们应该清楚你要爬去的网站是什么?由于这里我们想要
爬取软件工程师相关信息
爬取有关软件工作的信息 import reimport requestsfrom pymysql import connectfrom bs4 import BeautifulSoup 定义数据库的连接函数conn connect(user"root", password"root", host"localhost", database"python",
手把手教你使用XPath爬取免费代理IP
大家好,我是霖hero。前言 可能有人说,初学者Python爬虫爬数据太难啦,构造正则表达式的时候,太烦琐了,眼睛都看花了,而且前一秒还可以愉快地爬取,下一秒IP就被封了,这还爬个屁啊,不爬了。哎,不要着急,这篇文章我们教你如何使用XPath来爬取快代理中的免费代理IP,告别眼花,告别IP被封的烦恼。XPath首先我们来简单了解一下XPath,想要了解更多
实战|手把手教你用Python爬取存储数据,还能自动在Excel中可视化!
大家好,在之前我们讲过如何用Python构建一个带有GUI的爬虫小程序,很多本文将迎合热点,延续上次的NBA爬虫GUI,探讨如何爬取虎扑NBA官网数据。 并且将数据写入Excel中同时自动生成折线图,主要有以下几个步骤。本文将分为以下两个部分进行讲解 在虎扑NBA官网球员页面中进行爬虫,获取球员数据。 清洗整理爬取的球员数据,对其进行可视化。
手把手教你用Pycharm连接远程Python环境
前言本次咱们来操作一下如何在Pycharm上,使用远程服务器上的Python环境。 为什么这样做?这个要从我的一次经历说起,有一次我帮朋友爬取一些东西,由于类别不同,分了几次爬取,这一次我写好规则之后,依然正常爬取,由于我本人比较善良,加上数据量目测并不是太多,并没有使用代理ip,并且将scpay的速度控制的比较慢,一般爬取时,一般也就几分钟而已,泡一杯咖