有看网络书的同鞋么。。下载网络小说的脚本[updated 2011-06-03]

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
wiewi
帖子: 628
注册时间: 2008-11-20 22:50
系统: ArchLinux

有看网络书的同鞋么。。下载网络小说的脚本[updated 2011-06-03]

#1

帖子 wiewi » 2011-05-31 17:08

代码: 全选

[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: [email protected]

# 设置临时目录
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中的所有小说;增加一个检测函数,在按名称搜索时首先检测小说是否存在,是 则更新,否 则从头下载~~图片章节还是木有好办法~~
2011-05-31-21-15-42.png
2011-05-31-21-13-09.png
2011-05-31-21-16-47.png
2011-05-31-21-23-48.png
下载已存在的文件会有提示:
2011-06-03-21-45-27.png
update参数的运行效果:
2011-06-03-21-53-59.png
ps1:本人小菜一只,各种bug不足请各位大侠轻拍
ps2:
本来发帖是想求问sed过滤行的问题
比如 cat file.txt | sed -n '4,$p' 会打印出第4行直到文件末尾,那么sed有没有办法打印类似第4行到倒数第二行这样范围的内容? 在sed后面添加管道 | head -n -2 倒是可以实现,想知道sed能否一次搞定?
上次由 wiewi 在 2011-06-03 21:55,总共编辑 2 次。
===我的小窝===
无聊吗?点我吧,楼主迫切期待你的光临~~
又一个轮子
------------------------------------
这年头,没有1000贴都不好意思见人了
------------------------------------
献丑不如藏拙
------------
头像
momova
帖子: 3381
注册时间: 2007-07-11 21:43
系统: archlinux
来自: 东江边

Re: 有看网络书的同鞋么。。下载网络小说的脚本

#2

帖子 momova » 2011-06-01 12:58

呵呵,这个好。之前有人也搞了一个。
我来了,我看见了,我征服了!
求勾搭,不管饭。
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 有看网络书的同鞋么。。下载网络小说的脚本

#3

帖子 lilydjwg » 2011-06-01 13:23

我也来贡献几个网站的下载脚本(全部是 Python 脚本 ;-) ):

代码: 全选

qqreaddl #qq阅读
shucangdl #书仓,需要注册
tianyabookdl #天涯读书
wowstorydl #wowstory
下载地址:winterpy@github

如果不想要仓库中多余的脚本,请使用其中的 pypacker 打包。
头像
飞火流星
帖子: 990
注册时间: 2010-05-11 21:50

Re: 有看网络书的同鞋么。。下载网络小说的脚本

#4

帖子 飞火流星 » 2011-06-01 15:04

lilydjwg 写了:我也来贡献几个网站的下载脚本(全部是 Python 脚本 ;-) ):

代码: 全选

qqreaddl #qq阅读
shucangdl #书仓,需要注册
tianyabookdl #天涯读书
wowstorydl #wowstory
下载地址:winterpy@github

如果不想要仓库中多余的脚本,请使用其中的 pypacker 打包。
天涯书库!!!顶!!
有事多折腾。。。没事瞎折腾。。。
本本
acer 4745g i5-430 4G ATI5650 1G 独显 500G硬盘
台台
赛扬coppermine 1.0GHz 160MB内存 集成显声卡 网卡一块。
archlinux+xfce无压力
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 有看网络书的同鞋么。。下载网络小说的脚本

#5

帖子 eexpress » 2011-06-01 15:17

女性化的才看小说。
● 鸣学
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 有看网络书的同鞋么。。下载网络小说的脚本

#6

帖子 lilydjwg » 2011-06-01 16:02

eexpress 写了:女性化的才看小说。
最近在看刘慈欣,你要不帮忙找些喜欢看这个的女生?
头像
monk
帖子: 19507
注册时间: 2010-01-28 10:45

Re: 有看网络书的同鞋么。。下载网络小说的脚本

#7

帖子 monk » 2011-06-01 16:18

马克~

*********宁静致远*********
如果我说的有什么不对,请看签名第一行
思考者
帖子: 294
注册时间: 2009-07-05 19:43

Re: 有看网络书的同鞋么。。下载网络小说的脚本

#8

帖子 思考者 » 2011-06-01 18:08

LZ福音啊 :em11 :em11 :em11

另外怎么查看小说方便点啊?有些是图片格式的啊,怎么办啊,我主要是指阅读

还有一个问题,怎么更新啊,需要比对当前已下载章节和目标网站中的章节啊,当然或许可以偷懒
-----寂寞的存在,孤独的思考----
头像
wiewi
帖子: 628
注册时间: 2008-11-20 22:50
系统: ArchLinux

Re: 有看网络书的同鞋么。。下载网络小说的脚本

#9

帖子 wiewi » 2011-06-02 11:25

lilydjwg 写了:我也来贡献几个网站的下载脚本(全部是 Python 脚本 ;-) ):

代码: 全选

qqreaddl #qq阅读
shucangdl #书仓,需要注册
tianyabookdl #天涯读书
wowstorydl #wowstory
下载地址:winterpy@github

如果不想要仓库中多余的脚本,请使用其中的 pypacker 打包。
我抛砖引玉了 :em11 :em11
eexpress 写了:女性化的才看小说。
:em06 :em06
思考者 写了:LZ福音啊 :em11 :em11 :em11

另外怎么查看小说方便点啊?有些是图片格式的啊,怎么办啊,我主要是指阅读

还有一个问题,怎么更新啊,需要比对当前已下载章节和目标网站中的章节啊,当然或许可以偷懒
原来还是有同道中人的~~~查看小说的话,如果是本地txt,我前面说的写了个脚本调用vim按章节浏览的,写得比较烂没贴上来;至于更新,这个问题我还真没想到。。不过应该不难吧,把以前下载过得那个html列表文件保存下来,再从网站读取新的比较一下行数就ok了,多了几个就下载几个附加到原txt文件的后面就ok了;图片的话就直接略过了。。暂时我没有办法,或者可以参考大大们的下载网页中图片的脚本,不过下载之后还要用看图软件打开,放大缩小等等,就要用鼠标操作了,我认为还不如直接上浏览器~~我写这个的初衷就是在终端里全凭键盘操作~~

最后,前天更新ubuntu结果挂鸟,重启后屏幕一直闪啊闪啊,gdm打不开,等俺神马时候把它救活了再说,暂时不能改脚本了。。兄弟自己动手吧,弄个厉害点的咱偷来用 :em09
===我的小窝===
无聊吗?点我吧,楼主迫切期待你的光临~~
又一个轮子
------------------------------------
这年头,没有1000贴都不好意思见人了
------------------------------------
献丑不如藏拙
------------
回复