五、RPA案例:起点中文网强推小说自动化保存

目录

1、了解网站流程

2、xpath分析

第一章页面

第二章页面

第三章页面

总结

3、获取一本小说

4、获取强推的10本小说


需求:获取起点中文网中的某一个分区(案例以玄幻为例)的本周强推的十本小说的已经更新的章节并且保存下来(小说名为文件名,每一个章节存一个txt文件(章节名为文件名))。

目标网站:https://www.qidian.com/(起点中文网)

1、了解网站流程

首先我们先对网站进行初步的了解,方便我们使用RPA。

在该网站的首页,我们需要先点击玄幻分区。

我们点击玄幻这一个分区,进入了一个新页面(玄幻分区页面),网站首页还存在。

OK,以上就是一本小说的相关流程,先尝试写一下吧

2、xpath分析

(提醒如果鼠标不能右键继续操作,就按F12进入开发者模式)

在下面只需要重复操作的部分的代码

第一章页面

章节名xpath:

//*@id="reader-content"/div/div/div2/div/h1

小说内容:

//*@id="c-863726078"

下一章按钮:

//*@id="reader-content"/div/div/div5/div/a2

第二章页面

章节名xpath

//*@id="reader-content"/div/div/div2/div/h1

小说内容xpath

//*@id="c-863726042"

下一章按钮xpath

//*@id="reader-content"/div/div/div5/div/a3

第三章页面

下一章按钮xpath

//*@id="reader-content"/div/div/div5/div/a3

总结

章节名:

//*@id="reader-content"/div/div/div2/div/h1

//*@id="reader-content"/div/div/div2/div/h1

小说内容:

//*@id="c-863726078"

//*@id="c-863726042"

下一章按钮:

//*@id="reader-content"/div/div/div5/div/a2

//*@id="reader-content"/div/div/div5/div/a3

//*@id="reader-content"/div/div/div5/div/a3

章节名没变化可以直接使用,按钮第一页和其它页不同,其它页相同。

因为小说内容的xpath不同(前端结构相同),我们可以采取获取当前元素的完整xpath的方法解决。(动态页面也可以用这种方法)

小说内容完整xpath

第一页:/html/body/div1/div/div2/div/div/div2/div/main

第二页:/html/body/div1/div/div2/div/div/div2/div/main

......

3、获取一本小说

代码如下:

python 复制代码
# 导入相关包
from DrissionPage import Chromium
import os

# 创建小说文件夹
os.makedirs('小说',exist_ok=True)
page = Chromium()
tab = page.get_tab()
tab.get('https://www.qidian.com/',timeout=10)

# 作品分类(玄幻按钮xpath)
xuanhuan_btn = tab.ele('xpath://*[@id="classify-list"]/dl/dd[1]/a')
# 点击
xuanhuan_btn.click()
# 获取新页面(玄幻小说分区页面)
tab1 = page.latest_tab
# 因为强推小说的xpath结构类似,可以采用字符串拼接的方法用循环便利
s = 'xpath:/html/body/div[1]/div[4]/div[2]/div[1]/div/ul/li[1]/em/h2/a'
# xpath定位当前的强推小说
tuaijian_btn = tab1.ele(s)
# 点击当前的强推小说
tuaijian_btn.click()
# 获取小说页面
tab2 = page.latest_tab
# 获取小说的连载章节数,用字符串replace方法进行替换只保留章节数
a = tab2.ele('xpath://*[@id="bookCatalogSection"]/div[1]/p/span[1]').text.replace('连载共', '').replace('章', '')
# 将章节数转换为int类型
a = int(a)
# 点击阅读小说
tab2.ele('xpath://*[@id="readBtn"]').click()
# 定义空字符变量,用来保存小说名,用来后面的保存路径中
xiaoshuo_name = ''
# 获取小说页面
tab3 = page.latest_tab
# 通过循环来获取每一章的小说内容
for i in range(a):
    # 小说第一章
    if i == 0:
        # 小说名字
        name = tab3.ele('xpath://*[@id="r-titlePage"]/div/h1')
        xiaoshuo_name = name.text
        # 创建小说目录
        os.makedirs(f'小说/{name.text}', exist_ok=True)
        # xpath定位小说章节名
        zhangjie = tab3.ele('xpath://*[@id="reader-content"]/div/div/div[2]/div/h1')
        # xpath定位小说章节内容
        t = tab3.ele('xpath:/html/body/div[1]/div/div[2]/div/div/div[2]/div/main')
        # 保存该章节的小说
        open(f'小说/{name.text}/{zhangjie.text}.txt', 'w', encoding='utf-8').write(t.text)
        # xpath定位下一章按钮并点击
        tab3.ele('xpath://*[@id="reader-content"]/div/div/div[5]/div/a[2]').click()
    # 小说其余章
    else:
        # 小说章节名
        zhangjie = tab3.ele('xpath://*[@id="reader-content"]/div/div/div[2]/div/h1')
        # 小说章节内容
        t = tab3.ele('xpath:/html/body/div[1]/div/div[2]/div/div/div[2]/div/main')
        # 小说章节名中可能重新"/"这样会影响txt文件的保存
        # 根据小说章节名中是否会出现"/"来进行不同的保存操作
        if zhangjie.text.find('/') == -1:
            open(f'小说/{xiaoshuo_name}/{zhangjie.text}.txt', 'w', encoding='utf-8').write(t.text)
        else:
            # 将"/"替换为"/"
            p = zhangjie.text.replace('/','')
            open(f'小说/{xiaoshuo_name}/{p}.txt', 'w', encoding='utf-8').write(t.text)
        # 点击下一章按钮
        tab3.ele('xpath://*[@id="reader-content"]/div/div/div[5]/div/a[3]').click()

page.quit()

4、获取强推的10本小说

在之前的博客中有相关方法的介绍在这了不详细讲解,完整代码如下:

python 复制代码
# 导入相关包
from DrissionPage import Chromium
import os

# 创建小说文件夹
os.makedirs('小说',exist_ok=True)
page = Chromium()
tab = page.get_tab()
tab.get('https://www.qidian.com/',timeout=10)

# 作品分类(玄幻按钮xpath)
xuanhuan_btn = tab.ele('xpath://*[@id="classify-list"]/dl/dd[1]/a')
# 点击
xuanhuan_btn.click()
# 获取新页面(玄幻小说分区页面)
tab1 = page.latest_tab
for i in range(1,11):
    # 因为强推小说的xpath结构类似,可以采用字符串拼接的方法用循环便利
    s = 'xpath:/html/body/div[1]/div[4]/div[2]/div[1]/div/ul/li[' + str(i) + ']/em/h2/a'
    # xpath定位当前的强推小说
    tuaijian_btn = tab1.ele(s)
    # 点击当前的强推小说
    tuaijian_btn.click()
    # 获取小说页面
    tab2 = page.latest_tab
    # 获取小说的连载章节数,用字符串replace方法进行替换只保留章节数
    a = tab2.ele('xpath://*[@id="bookCatalogSection"]/div[1]/p/span[1]').text.replace('连载共', '').replace('章', '')
    # 将章节数转换为int类型
    a = int(a)
    # 点击阅读小说
    tab2.ele('xpath://*[@id="readBtn"]').click()
    # 定义空字符变量,用来保存小说名,用来后面的保存路径中
    xiaoshuo_name = ''
    # 获取小说页面
    tab3 = page.latest_tab
    # 通过循环来获取每一章的小说内容
    for i in range(a):
        # 小说第一章
        if i == 0:
            # 小说名字
            name = tab3.ele('xpath://*[@id="r-titlePage"]/div/h1')
            xiaoshuo_name = name.text
            # 创建小说目录
            os.makedirs(f'小说/{name.text}', exist_ok=True)
            # xpath定位小说章节名
            zhangjie = tab3.ele('xpath://*[@id="reader-content"]/div/div/div[2]/div/h1')
            # xpath定位小说章节内容
            t = tab3.ele('xpath:/html/body/div[1]/div/div[2]/div/div/div[2]/div/main')
            # 保存该章节的小说
            open(f'小说/{name.text}/{zhangjie.text}.txt', 'w', encoding='utf-8').write(t.text)
            # xpath定位下一章按钮并点击
            tab3.ele('xpath://*[@id="reader-content"]/div/div/div[5]/div/a[2]').click()
        # 小说其余章
        else:
            # 小说章节名
            zhangjie = tab3.ele('xpath://*[@id="reader-content"]/div/div/div[2]/div/h1')
            # 小说章节内容
            t = tab3.ele('xpath:/html/body/div[1]/div/div[2]/div/div/div[2]/div/main')
            # 小说章节名中可能重新"/"这样会影响txt文件的保存
            # 根据小说章节名中是否会出现"/"来进行不同的保存操作
            if zhangjie.text.find('/') == -1:
                open(f'小说/{xiaoshuo_name}/{zhangjie.text}.txt', 'w', encoding='utf-8').write(t.text)
            else:
                # 将"/"替换为"/"
                p = zhangjie.text.replace('/','')
                open(f'小说/{xiaoshuo_name}/{p}.txt', 'w', encoding='utf-8').write(t.text)
            # 点击下一章按钮
            tab3.ele('xpath://*[@id="reader-content"]/div/div/div[5]/div/a[3]').click()
    tab3.close()
    tab2.close()
page.quit()
相关推荐
AlanBruce4 小时前
摩尔信使MThings逻辑控制各组件使用指南
自动化·上位机·modbus·mthings·摩尔信使
天远API5 小时前
零信任架构实战:基于天远全能消金报告构建自动化消费分期网关
运维·人工智能·架构·自动化
代码方舟6 小时前
零信任架构实战:基于天远全能消金报告构建自动化信用合规网关
运维·人工智能·架构·自动化
Bruce_Liuxiaowei7 小时前
录屏片段无损合并:从 ffmpeg concat 原理到 Python 自动化脚本
python·ffmpeg·自动化
AlanBruce8 小时前
摩尔信使MThings CJ/T 188数据配置使用指南
自动化·modbus·摩尔信使
长谷深风1119 小时前
AI自动化中的关键闸门:何时必须人工审批?
大数据·人工智能·ai·自动化·ai agent·智能体·hitl
海宇数据10 小时前
零信任架构实战:基于海宇对外投资历史查询服务构建自动化异动企业筛查网关
运维·人工智能·架构·自动化
迷途呀20 小时前
CI/CD 自动化部署实践:让代码提交后自动上线
linux·运维·nginx·ci/cd·自动化
xhbh6661 天前
主流系统备份软件横向评测:从大型集群到终端备份选型
自动化·数据备份·文件备份·系统备份·同步备份·备份软件
微三云 - 廖会灵 (私域系统开发)1 天前
架构师视角:用AI Agent与超级APP重构私域自动化盈利系统
人工智能·重构·自动化