下载网络小说的脚本

代码:
[liwei@myhost ~/scripts/t-工具] $ >>_ cat search-novel.sh
#!/bin/bash
# 功能: 搜索小说名称或关键词(中文),从89文学网站(www.89wx.com)找到页面并下载储存在设定好的地方
# 将中文字符转换为url编码命令参考了lrcdis脚本
# 下载文件后用read-txt打开?
# Date: May 31,2011 by wiewi
# Email: lwldcr@gmail.com

# 设置临时目录
USER=$(whoami)
[ -d /home/$USER/tmp ] || mkdir -pv /home/$USER/tmp

# 搜索结果存放
RESULT=/home/$USER/tmp/search_result

# 章节html文件列表
CHAP_LIST=/home/$USER/tmp/chapter_list

# 书架文件
BOOKSHELF=/home/$USER/tmp/bookshelf

# 下载小说存放目录
DEST_DIR=/home/$USER/study/books/小说/下载

Usage () {
cat << EOF
--------------------------------------------
用法:1. `basename $0` 小说名或关键字
若不带参数运行,则程序内部会有输入提示
2. `basename $0` -h / --help
显示脚本用法
3. `basename $0` -u / --update
更新BOOKSHELF里的小说
--------------------------------------------
EOF
}

# 功能提示
Prompt () {
if [ "$#" = 1 ];then
if [ "$1" = '-h' -o "$1" = '--help' ];then
Usage
exit 0
elif [ "$1" = '-u' -o "$1" = '--update' ];then
while read line
do
WORD=`echo $line | awk '{print $1}'`
Check_Update
done < "$BOOKSHELF"
exit 0
fi
WORD="$1"
elif [ "$#" -gt 1 ];then
Usage
echo "输入关键字过多,部分将被丢弃!"
WORD="$1"
else
echo "请输入小说名称或关键字:"
read WORD
fi
}

# 百度搜索小说名
Search () {
# 将中文关键字转换为%**形式的字符
CODE="$(echo "$WORD" | iconv -c -t gbk | od -t x1 -A n -w1000 | tr " " "%")"

#相当于百度:WORD site:www.89wx.com
SITE="www.89wx.com"
SEARCH="http://www.baidu.com/s?wd=$CODE+site%3A$SITE"

# 得到搜索结果
w3m -dump "$SEARCH" > $RESULT

# 选出第一个结果
URL="$(cat $RESULT | grep '/' | sed -n '1p' | awk '{print $1}')"
}

# 确认下载
Sure () {
echo "-------------------------------"
echo "将要下载的小说:"
echo "`cat $RESULT | grep '89文学' | head -n 1`"
echo "确定下载?(y/n/q)"
echo "-------------------------------"
read action
}

# 删除中间文件
Delete () {
! [ -z $RESULT ] && rm -f $RESULT;
! [ -z $CHAP_LIST ] && rm -f $CHAP_LIST;
}

Get_Page () {
# 百度到的89文学的地址字符串有两种形式:
# 1.不含html字符的,为小说介绍页面
# 2.含有html字符的,为小说目录页面
# 分两种情况得到小说的序号
if [ `echo $URL | grep -i html` ];then
SER=`echo $URL | cut -d '/' -f 5`
else
SER=`echo $URL | cut -d '/' -f 3`
fi

# THOU 大概是小说的分类,是网站url里的一个数据,计算方式是SER/1000
THOU=$(($SER/1000))
# 最后得到小说章节列表页面
PAGE="http://www.89wx.com/html/book/$THOU/$SER/"

# 下载此页面的信息,下面有用
curl $PAGE | grep href | sed -n '4,$p' | head -n -1 > "$CHAP_LIST" 2> /dev/null
}

# 从CHAP_LIST中读取每一个章节的html文件名,依次下载其内容并重定向到txt中
Download () {

[ -d "$DEST_DIR" ] || mkdir -p "$DEST_DIR"

# 用于计算下载进度
TOTAL=$(cat $CHAP_LIST | wc -l)
NUM=1

cat /dev/null > "$DEST_DIR"/"$WORD".txt

while read line
do
CHAPTER=`echo $line | awk '{print $2}' | cut -d '"' -f 2`
w3m -dump $PAGE/$CHAPTER | sed -n '4,$p' | head -n -15 >> "$DEST_DIR"/"$WORD".txt
echo "$NUM" of "$TOTAL" Downloaded.
NUM=$(($NUM+1))
done < $CHAP_LIST

# 更新bookshelf内容
echo "$WORD" "$TOTAL" >> $BOOKSHELF
}

# 判断以前是否下载过该文件
Check_Exist () {
if [ "`cat $BOOKSHELF | grep "$WORD"`" ];then
EXIST=1;
echo "----------------------------"
echo " $WORD.txt 已存在"
echo "----------------------------"
else
EXIST=0;
fi
}

# 检测小说是否有更新
Check_Update () {
# WORD="$1"
Search
Get_Page
TOTAL=`cat "$CHAP_LIST" | wc -l`
TOTAL_ORIG=`cat "$BOOKSHELF" | grep "$WORD" | awk '{print $2}'`
if [ "$TOTAL_ORIG" = "$TOTAL" ];then
echo "$WORD" 没有更新
elif [ "$TOTAL_ORIG" -lt "$TOTAL" ];then
Get_Update
else
echo "检测数据出错"
fi
}

Get_Update () {
NUM=1
# 删除已经下载过的章节名称
sed -i "1,"$TOTAL_ORIG"d" "$CHAP_LIST"
while read line
do
CHAPTER=`echo $line | awk '{print $2}' | cut -d '"' -f 2`
w3m -dump $PAGE/$CHAPTER | sed -n '4,$p' | head -n -15 >> $DEST_DIR/$WORD.txt
echo "$NUM" of "$TOTAL" Downloaded.
NUM=$(($NUM+1))
done < $CHAP_LIST

# 删除书架上原有的信息
sed -i "/$WORD/d" $BOOKSHELF
# 显示更新信息
echo " "$WORD" 更新了$(($TOTAL-$TOTAL_ORIG))章"
# 更新bookshelf内容
echo "$WORD" "$TOTAL" >> $BOOKSHELF
}

Work() {
# 取得下载页面信息
Get_Page

# 检测以前是否下载过
Check_Exist

if [ "$EXIST" = 1 ];then
Check_Update
else
# 按章节下载并保存
Download
fi

# 删除中间文件
Delete

# 完成提示
echo "---------------------------"
echo "$WORD.txt 已保存到$DEST_DIR"
echo "---------------------------"

exit 0
}

# 程序主体
Prompt $@
Search

while true
do
Sure
# 不满意则重新输入关键词搜索
if [ "$action" = 'n' -o "$action" = 'N' ];then
Prompt
Search
elif [ "$action" = 'q' -o "$action" = 'Q' ];then
exit 0
else
break
fi
done

Work



首先,俺看的是盗版,忏悔一下~~
其次,很多盗贴网站不提供下载;
再次,即便有些提供下载,也只有快车、迅雷、旋风的链接;
总之,在linux下面看盗贴只能用浏览器。。有时候懒不想开浏览器,所以就想起来写个看小说的脚本。
起先写的是个调用vim打开txt的脚本,可以按章节阅读,然后想到windows下的小说阅读器很多都有搜索下载的功能,于是有了上面这个,解析地址比较麻烦,而且各个网站的html命名方式不一样,干脆就选定了89文学这一个,因为我连续打开了好多本书发现了一点点能利用的规律。。。

update 2011-06-03
根据楼下同学的想法,小小修改了一下,增加了一个bookshelf,用于存放下载了的小说名称以及进度;增加update参数,一次更新bookshelf中的所有小说;增加一个检测函数,在按名称搜索时首先检测小说是否存在,是 则更新,否 则从头下载~~图片章节还是木有好办法~~

附件:
附件:

附件:

下载已存在的文件会有提示:
update参数的运行效果:


ps1:本人小菜一只,各种bug不足请各位大侠轻拍
ps2:
本来发帖是想求问sed过滤行的问题
比如 cat file.txt | sed -n '4,$p' 会打印出第4行直到文件末尾,那么sed有没有办法打印类似第4行到倒数第二行这样范围的内容? 在sed后面添加管道 | head -n -2 倒是可以实现,想知道sed能否一次搞定?
原文地址:http://forum.ubuntu.org.cn/viewtopic.php?f=21&t=333549
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值