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

2020-10-30 14:17发布

站内文章 / 网络爬虫
1165 0 0

一、小小课堂

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

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

下面就开始实现此设想。

二、网页分析

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

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

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

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

我们先查看网页的结构

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

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

  •  3. 通过开发者选项确定起始URL
    8
    通过查看,我们可以判定我们的起始URL为: https://so.gushiwen.cn/shiwen/

代码:

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

2.2 分析抓取的主要内容

9
10

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

11

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

  •  1.分析
    12

  •  2. 尝试xpath解析
    13
    14

  •  3.代码实现

import requestsfrom 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)1234567891011121314151617181920212223242526272829303132
  •  4. 结果
    15
    不知道,同学们有没有发现此处有问题呢?
    16

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

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

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')12

18

2.5 获取二级标题

  •  1. 解析
    24

  •  2. 代码

    #二级类型类型数据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)123456789
  •  3. 结果
    25

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

 1. xpath解析

  • 26
    27

  •  2. 代码

        #二级类型下诗词的名称和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)1234

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)12345

19

  •  2. 拼接二级标题的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)123456789

28

2.7.2 内容解析

1. xpath解析

  •  1.诗词名称
    20

  •  2.诗词作者
    21

  •  3.诗词内容
    22

  •  4.诗词译文及注释
    23

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)12345678910111213

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

3. 运行结果

29

三、完整代码

# 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 requestsimport timeimport randomimport csvfrom 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_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):
    """查询数据"""

    #一级类型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(&q

四、保存结果

30

转载自:CSDN   作者:不温卜火

原文链接:https://buwenbuhuo.blog.csdn.net/article/details/109306251


Ta的文章 更多 >>

  • 学好R语言绘图,你只需这样一个网站就够了
    0 个评论
  • R语言入门 Chapter05 | 因子
    0 个评论
  • R语言入门 Chapter04 | 数据框
    0 个评论
  • R语言入门 Chapter03 | 列表
    0 个评论
  • R语言入门 Chapter02 | 矩阵与数组
    0 个评论
  • R语言入门 Chapter01 | 向量
    0 个评论
  • 快速入门网络爬虫系列 Chapter16 | 爬虫性能提升
    0 个评论
  • 快速入门网络爬虫系列 Chapter15 | 验证码识别
    0 个评论

热门文章

  • 数字展厅中必不可少的多媒体互动装置盘点
    0 个评论
  • 设计师会被人工智能替代吗? ——关于AI与设计的畅想
    0 个评论
  • string是什么?
    0 个评论
  • 什么是确认测试?软件确认测试有哪些内容?
    0 个评论
  • Java中的字符串是什么
    0 个评论
  • 第三方软件压力测试报告需要哪些资质?大概费用和周期是多少?
    0 个评论
  • 软件测评单位需要哪些资质
    0 个评论
  • 什么是数组
    0 个评论
  • 前端开发的招聘注重学历吗?一份优秀的前端开发工程师简历是怎么样的?
    0 个评论
  • 如何创建Java线程
    0 个评论
收获啦作为免费、公开信息平台,用户进行的所有活动由其自身承担法律责任。如您发现不良信息、侵权内容,请立即联系我们。 Copyright © 2020 收获啦! 京ICP备10005032号-11 京公网安备11010802031459号 电子营业执照   使用协议|免责声明 联系我们 | 标签大全 | 站内公告 | 财富规则

聚圣源欲罢不能tooopen.com鸡年起名打分金刚川下载起名 姓雷男生女黄磊起名博客名马起什么名字好听谷姓女孩起名大全大全金海柳纳杰人才王姓女孩有涵养的起名画笔素材门头起名字测试测试打分结果公司名称大全起名网痴男怨女穿成纯情小言的恶女配创业公司起名免费的起名字的网站牛肉汤汗牛充栋的意思全屋定制起名大全集被照美冥挖了出来怎么给自己起笔名今年的男宝宝起名的建国大业在线观看郑氏起名女孩的名字姓雷男生起名医圣传承通讯店面起名淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化