Python爬取古诗词

一、需求

爬取网址https://www.gushiwen.org/

需求:

(1)获取侧边栏【类型】信息;
(2)获取每个类型中古诗文详情页信息;
(3)提取详情页数据:古诗文名、作者、朝代、类型、内容、译文及注释;
(4)将数据保存到 csv 文件;

二、代码实现

import requests
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()

三、运行结果

在这里插入图片描述
保存数据:
在这里插入图片描述

  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
爬虫是一种按照一定规则,自动抓万维网信息的程序或者脚本。它可以通过定义好的规则,自动抓网络上的信息,并对抓下来的数据进行筛选和提,从而获得我们需要的信息。爬虫并不是Python的专利,使用其他编程语言也可以实现爬虫功能,但Python提供了许多方便的库,使得开发爬虫变得更加简单。\[1\] 在爬取古诗词网的例子中,使用了Python的requests库和BeautifulSoup库来进行网页请求和解析。首先,通过发送HTTP请求获网页的HTML内容,然后使用BeautifulSoup库对HTML进行解析,提出需要的信息,如标题、朝代作者内容。最后,将提的信息存储到一个列表中,并将列表写入一个JSON文件中。\[2\] 另外,还可以使用XPath解析HTML内容。XPath是一种用于在XML和HTML文档中进行导航和提信息的语言。在这个例子中,使用了Python的requests库和lxml库来进行网页请求和解析。通过XPath表达式,可以直接定位到需要的元素,并提出相应的信息,然后将提的信息存储到一个列表中,并将列表写入一个JSON文件中。\[3\] 总结来说,Python爬虫可以通过发送HTTP请求获网页内容,然后使用相应的库对网页进行解析,提出需要的信息,并进行存储和处理。这样就可以实现对古诗词网或其他网站的信息进行爬取。 #### 引用[.reference_title] - *1* [Python爬虫(一)——爬取古诗文网,初识什么是爬虫](https://blog.csdn.net/u014663232/article/details/103459450)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [python爬虫入门_3种方法爬取古诗文网站](https://blog.csdn.net/purvispanwu/article/details/106849214)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值