LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 486|回复: 1

在debian12中写一个shell脚本

[复制链接]
发表于 2024-1-25 17:38:15 | 显示全部楼层 |阅读模式

以下是一个使用Shell脚本来爬取笔趣阁小说的示例。这个脚本会从指定的小说目录页面开始,逐章爬取小说内容,并以章节名称为文件名保存到本地。

#!/bin/bash

# 定义小说目录页面URL
novel_url="https://www.52bqg.com/book_27833/"

# 创建保存小说章节的目录
mkdir -p novel_chapters

# 发起HTTP请求并获取页面内容
fetch_page() {
    local url="$1"
    local user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"

    # 使用curl命令获取页面内容
    local page_content=$(curl -s -A "$user_agent" "$url")
   
    # 检查是否成功获取页面内容
    if [ $? -ne 0 ]; then
        echo "Failed to fetch page: $url"
        exit 1
    fi
   
    echo "$page_content"
}

# 提取小说章节列表
extract_chapters() {
    local page_content="$1"
   
    # 使用正则表达式提取小说章节链接和名称
    local chapters=$(echo "$page_content" | grep -oP '<dd><a href="\K[^"]+' | sed 's#^#https://www.52bqg.com#g')

    # 输出章节列表
    echo "$chapters"
}

# 提取小说内容
extract_novel_content() {
    local page_content="$1"
    local chapter_name="$2"
   
    # 使用正则表达式提取小说内容
    local content=$(echo "$page_content" | grep -oP '<div id="content">\K[\s\S]*?(?=<\/div>)')
   
    # 保存小说内容到文件
    echo "$content" > "novel_chapters/$chapter_name.txt"
}

# 主函数,执行爬取操作
main() {
    # 发起HTTP请求并获取小说目录页面内容
    local directory_page_content=$(fetch_page "$novel_url")

    # 提取小说章节列表
    local chapters=$(extract_chapters "$directory_page_content")

    # 循环爬取每个章节的内容
    for chapter_url in $chapters; do
        # 获取章节名称
        chapter_name=$(basename "$chapter_url")
        
        # 发起HTTP请求并获取章节页面内容
        local chapter_page_content=$(fetch_page "$chapter_url")
        
        # 提取小说内容并保存到文件
        extract_novel_content "$chapter_page_content" "$chapter_name"
        
        echo "Chapter $chapter_name saved."
    done

    echo "Novel chapters saved to novel_chapters directory."
}

# 执行主函数
main
这个脚本的主要逻辑包括:

发起HTTP请求并获取小说目录页面的内容。
提取小说章节的链接和名称。
循环爬取每个章节的内容,并以章节名称为文件名保存到本地。
你需要将novel_url变量的值替换为你要爬取的小说目录页面的URL。这个脚本会创建一个名为novel_chapters的目录,然后在这个目录下保存每个章节的内容,以章节名称作为文件名。
不过可能会遇到以下的问题

可能运行结果会表明脚本中存在Windows风格的换行符(CRLF),而不是Unix/Linux风格的换行符(LF)。这可能是因为脚本在Windows平台上编辑并保存后,在Linux环境下执行时出现了问题。

你可以使用dos2unix命令将脚本转换为Unix格式的换行符。在Debian 12环境中打开终端,然后执行以下命令:

dos2unix fiction.sh
这将把脚本文件fiction.sh转换为Unix格式的换行符。然后再次尝试运行脚本。


如果dos2unix命令未找到,你可以尝试安装dos2unix工具。在Debian 12环境中,你可以使用以下命令安装:

sudo apt-get update
sudo apt-get install dos2unix
安装完成后,再次运行dos2unix fiction.sh命令将脚本转换为Unix格式的换行符。然后尝试再次运行脚本。

系统中如果没有安装curl命令,需要先进行安装,它用于执行HTTP请求以获取网页内容。在Debian 12系统中,你可以使用以下命令安装curl:

sudo apt-get update
sudo apt-get install curl
安装完成后,再次运行脚本。
如果脚本执行完毕后,你在保存小说章节的目录(novel_chapters)中没有看到任何东西,可能是由于以下几个原因导致的:

脚本执行未成功: 请确保脚本没有遇到任何错误而提前退出。你可以在终端中运行脚本,并查看是否有任何错误消息输出。

小说目录页面结构发生变化: 如果小说目录页面的HTML结构发生了变化,导致提取章节链接的正则表达式无法正确匹配,那么就无法获取章节列表。你可以手动检查小说目录页面的HTML结构,并相应地更新脚本中的正则表达式。

章节内容提取错误: 如果脚本成功获取了章节链接,但在提取章节内容时遇到了问题,可能是因为正则表达式无法正确匹配章节内容。你可以手动检查章节页面的HTML结构,并相应地更新脚本中的正则表达式。

网络访问问题: 如果你的网络环境存在问题,可能会导致curl命令无法正确获取网页内容。你可以手动在浏览器中打开小说目录页面,并尝试访问章节链接,查看是否能够正常获取页面内容。


如果只有一行输出,表明脚本执行完成,并且没有遇到任何错误。这意味着脚本已经成功执行,并且将小说的章节内容保存到了novel_chapters目录中。

你可以打开novel_chapters目录,查看其中的文件,每个文件应该对应一章小说内容,并以章节名称命名。如果你在目录中找不到任何文件,可能是由于以下几种原因:

小说目录页面的HTML结构发生变化,导致无法正确提取章节链接。
章节内容提取过程中出现了错误,无法正确提取小说内容。
小说网站对爬虫进行了限制,导致无法正常获取页面内容。
请尝试手动访问小说目录页面,以及一些章节页面,确认网站是否可以正常访问。如果网站可以正常访问,并且你可以在浏览器中查看小说内容,但脚本无法正确保存章节内容,那么可能需要进一步检查脚本中的正则表达式是否正确匹配网页内容。

 楼主| 发表于 2024-1-25 17:44:00 | 显示全部楼层
遇到任何问题都可以留言提问哟
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表