批处理之家's Archiver

namejm 发表于 2010-2-11 13:08

批处理版易读网txt小说下载器[20100407]

  春节马上就要到了,貌似只剩下两天时间,在网上如何消遣?down一些txt小说回去慢慢欣赏,是件多么惬意的事情啊。namejm最近在网上转悠了好一阵子,发现一个非常干净的txt小说网站,名叫易读网,抓取txt小说十分方便。狂喜之余,做了个下载易读网txt小说的脚本,以方便广大书虫。
  如有什么bug,或有什么好的建议,望各位及时反馈。

[color=red][b]  重要变动:20100406发现易读网的网址发生了改变,导致以前的代码无法下载任何小说,请各位下载更新后的代码。[/b][/color][code]@echo off
:: 功能:
::        按照多种方式下载易读网上的txt小说
:: 实现过程:
:: 1、下载指定的某篇小说:
::        首先下载小说首页,通过首页提取出每一章节的下载地址,然后下载每一章节的html文件,转为txt文本,最后按章节顺序提取正文内容,拼合即可;
:: 2、根据配置文件下载指定的小说:
::        首先,需要在当前脚本所在的文件夹下存在"要下载的小说列表.txt"文件,文件内容按照 "《小说名》"|小说URL 的格式,
::        一行一条记录加以保存,前后不可有多余的字符;然后,把这个文件复制到 %destination%\tmp\要下载的小说列表\ 目录下,
::        覆盖同名文件,用批处理读取其中的配置,接下来的步骤同1;
:: 3、下载指定页码上的所有小说:
::        首先下载指定页面,把其中各篇小说的首页地址提取出来,接下来的步骤同1;
:: 4、下载指定页码范围内的所有小说:
::        首先下载指定页码范围内的所有页面,接下来的步骤同1;
:: 5、下载全站的所有小说:
::        首先下载全站所有页码上的所有页面,接下来的步骤同1;

mode con lines=26
:: 20100406发现易读网的网址发生了变化,屏蔽掉旧网址,启用新网址
:: set www=http://www.yilook.com
set www=http://www.yi-look.com
set TT=易读网txt小说下载器
set destination=易读txt小说
md "%destination%\tmp\要下载的小说列表\html" 2>nul
pushd "%destination%\tmp\要下载的小说列表\html"

:Main
cls
del /a /f /q *.* 2>nul
del /a /f /q ..\txt\*.* 2>nul
title %TT%
echo.&echo.
echo                    本程序可以按照以下方式下载易读网上的txt小说
echo.
echo                    易读网首页:%www%
echo.
echo                        1、下载指定的某篇小说
echo.
echo                        2、根据配置文件下载指定的小说
echo.
echo                        3、下载指定页码上的所有小说
echo.
echo                        4、下载指定页码范围内的所有小说
echo.
echo                        5、下载全站的所有小说
echo.
echo                        X、退出
set choice=
call :line
set /p choice=                请输入指定功能代码(1/2/3/4/5/X):
if not defined choice goto Main
if /i "%choice:~0,1%"=="X" exit
set "choice=%choice:~0,1%"
if "%choice%"=="1" goto DownGivenNovel
if "%choice%"=="2" goto DownGivenNovels
if "%choice%"=="3" goto DownGivenPage
if "%choice%"=="4" goto DownGivenPages
if "%choice%"=="5" goto DownAllPages
goto Main

:DownGivenNovel
cls
title %TT%-指定网址
echo.&echo.
echo                请在易读网中找到某篇小说的URL,复制后粘贴到本窗口中使用。
echo.
echo                比如,《汉朝的那些事儿》,其URL地址为:
echo.
echo                    %www%/art_7200_8093.html
echo.
echo                把以上URL粘贴到本窗口即可下载《汉朝那些事儿》
echo.
echo                粘贴方法:鼠标点击右键,然后粘贴,不能使用快捷键Ctrl+V
call :line
echo                        请在下面输入小说的URL地址:
echo.
set URL=
set /p URL=            
if not defined URL goto DownGivenNovel
if /i "%URL:~0,1%"=="X" exit
if /i "%URL:~0,1%"=="M" goto Main
curl -O %URL%
htox32c /IP /O0 *.html
for /f "tokens=3" %%i in ('findstr "TITLE" "*.txt"') do echo "%%i"^|%URL%>..\要下载的小说列表.txt
goto DownNovel

:DownGivenNovels
cls
title %TT%-配置下载文件清单
echo.&echo.
echo                请确认当前目录下存在"要下载的小说列表.txt"文件
echo.
echo                并且该文件中的内容为 "《小说名》"^|小说目录页URL 的格式
echo.
echo                一行一条记录,前后不可有多余字符。如:
echo.
echo                "《寻人启事》"^|%www%/art_7238_6170.html
echo.
echo                若不满足如上条件,请自行配置好后方可使用本功能
call :line
echo.
set next=
set /p next=                要继续下一步吗?(Y/N):
if not exist ..\..\..\..\要下载的小说列表.txt goto DownGivenNovels
if not defined next goto DownGivenNovels
set "next=%next:~0,1%"
if /i "%next%"=="X" exit
if /i "%next%"=="M" goto Main
if /i "%next%"=="Y" (
    copy /y ..\..\..\..\要下载的小说列表.txt ..\
    goto DownNovel
)
goto DownGivenNovels

:DownGivenPage
cls
title %TT%-指定页码
echo.&echo.&echo.&echo.
echo                您可以指定某一页码,本脚本将下载易读网上这一页内
echo.
echo                列出的所有小说
echo.
echo                如:输入3,将下载这一页面所列出的所有小说:
echo.
echo                        %www%/artlist_3.html
call :line
set page=
set /p page=                请输入指定页码:
if not defined page goto DownGivenPage
if /i "%page:~0,1%"=="X" exit
if /i "%page:~0,1%"=="M" goto Main
curl -O %www%/artlist_%page%.html
goto HTMLtoTXT

:DownGivenPages
cls
title %TT%-指定页码范围
echo.&echo.
echo                您可以指定某一页码范围,本脚本将下载易读网上这些页内
echo.
echo                列出的所有小说
echo.
echo                注意:起止页码必须用半角状态下的短横杠连接。
echo.
echo                如:输入 3-5,将下载易读网上下列页面内列出的所有小说:
echo.
echo                        %www%/artlist_3.html
echo                        %www%/artlist_4.html
echo                        %www%/artlist_5.html
call :line
set pages=
set /p pages=                请输入指定页码的范围(如3-5):
if not defined pages goto DownGivenPages
if /i "%pages%"=="X" exit
if /i "%pages%"=="M" goto Main
curl -O "%www%/artlist_[%pages%].html"
goto HTMLtoTXT

:DownAllPages
cls
title %TT%-下载全站小说
curl -O %www%/artlist_1.html
htox32c /IP /O0 /U1+4 artlist_1.html
cls
for /f "tokens=6" %%i in ('findstr /i "第.*页" artlist_1.txt') do (
    curl -O "%www%/artlist_[2-%%i].html"
)

:HTMLtoTXT
cls
title %TT%-网页转换为txt
htox32c /IP /O0 /U1+4 *.html
md ..\txt 2>nul
del /a /f /q ..\txt\*.*
move *.txt ..\txt>nul

:PickupList
cls
echo.&echo    正在生成要下载的小说列表,请稍候...
cd.>..\要下载的小说列表.txt
for %%i in (..\txt\*.txt) do (
    title %TT%-生成下载列表_%%~nxi
    for /f "delims=<'> tokens=1,2" %%j in ('findstr /i "《.*》" "%%i"') do (
        echo "%%j"^|%www%/%%k>>..\要下载的小说列表.txt
    )
)

:DownNovel
cls
title %TT%-下载小说
echo.&echo.
echo                正在下载小说,请稍候...
md ..\..\..\整理结果 2>nul
:: del /a /f /q ..\..\..\整理结果\*.*
:: rd /q /s ..\..\已下载小说的原始文档
md ..\..\已下载小说的原始文档 2>nul
for /f "delims=| tokens=1,2" %%i in (..\要下载的小说列表.txt) do (
    curl --create-dirs -o "..\..\已下载小说的原始文档\%%~i\index.html" "%%~j"
    htox32c /IP /O0 /U1+4 "..\..\已下载小说的原始文档\%%~i\index.html"
    cls
    set lastchapter=1
    for /f "delims=' tokens=1,2" %%x in ('findstr /i "第.*节" "..\..\已下载小说的原始文档\%%~i\index.txt"') do (
        call :DownHTML "%%~i" "%%~x" "%%~y"
    )
    pushd "..\..\已下载小说的原始文档\%%~i\html"
    htox32c /IP /O0 *.html
    popd
    md "..\..\已下载小说的原始文档\%%~i\txt" 2>nul
    move "..\..\已下载小说的原始文档\%%~i\html\*.txt" "..\..\已下载小说的原始文档\%%~i\txt"
    call :PickupTXT "%%~i"
    move "..\..\已下载小说的原始文档\%%~i\%%i.txt" ..\..\..\整理结果
)
title %TT%-整理完毕
echo                整理完毕
pause
goto Main

:DownHTML
:: 下载小说各章节页面文件
set "chapter=%~2"
set "chapter=%chapter:*第=%"
set "chapter=%chapter:~0,-2%"
title %TT%-正在下载 "%~1_第 %chapter% 节"
if %lastchapter% lss %chapter% set lastchapter=%chapter%
curl --create-dirs -o "..\..\已下载小说的原始文档\%~1\html\%chapter%.html" "%www%/%~3"
goto :eof

:PickupTXT
:: 按先后顺序提取各章节页面正文并合并之
cls
title %TT%-正在提取 %1
echo.&echo     正在合并各章节,请稍候...
cd.>"..\..\已下载小说的原始文档\%~1\%~1.txt"
for /l %%i in (1,1,%lastchapter%) do (
    title %TT%-正在处理 "%~1\%%i.html"
    findstr /ibc:"  " "..\..\已下载小说的原始文档\%~1\txt\%%i.txt">>"..\..\已下载小说的原始文档\%~1\%~1.txt"
    echo.>>"..\..\已下载小说的原始文档\%~1\%~1.txt"
)
goto :eof

:line
echo.
echo ________________________________________________________________________________
if defined choice (
    echo                退出 X                                返回主界面 M
)
echo.&echo.
goto :eof[/code]正文中提到的第三方命令行工具可以在这些地方找到:
  1、Curl.exe:[url=http://curl.haxx.se/][color=#0070af]http://curl.haxx.se/[/color][/url](官网)或[url=http://bbs.bathome.net/thread-1761-1-1.html][color=#0070af]http://bbs.bathome.net/thread-1761-1-1.html[/color][/url]
  2、HtoX32c.exe:[url=http://win32lab.com/][color=#0070af]http://win32lab.com/[/color][/url](官网,日文)或[url=http://bbs.bathome.net/thread-1974-1-1.html][color=#0070af]http://bbs.bathome.net/thread-1974-1-1.html[/color][/url](带中文帮助信息)

[color=red]  注意:curl.exe需要配合libssl32.dll和libeay32.dll方可使用,若当前机器%windir%中没有这两个dll,请到[url=http://bbs.bathome.net/viewthread.php?tid=1761]http://bbs.bathome.net/viewthread.php?tid=1761[/url]顶楼下载《curl所需dll.rar》 这个附件,放到%windir%目录下或curl.exe同一目录下使用。[/color]

slovent 发表于 2010-2-11 16:48

已经在使用了,感觉非常好,而且从中学到一些技巧,只是还需要慢慢消化。

zjw767676 发表于 2010-2-12 14:23

选1

选2

hlzj88 发表于 2010-2-13 05:32

只是我的机上curl.exe和HtoX32c.exe都无法运行,一闪而过,或许是我的错,我是把三个文件都放在同一个文件夹里

gdmm 发表于 2010-2-16 20:20

可以用呀,把curl.exe和HtoX32c.exe放到\WINDOWS\system32文件夹中就行了,试了很好用。

asdfgmyj 发表于 2010-2-18 09:30

好像没有用的???是吗???

gdmm 发表于 2010-2-18 17:16

绝对能用,唯一美中不足就是整理合并后的文本内容中没有了第几章的分开
阅读起来不是很习惯,应该是网页转回文本后,在提取文本内容合并时没有提取第几章这个
不知是否能改动一下。

x9tiancmd 发表于 2010-2-18 23:02

在批处理前加上 path=%~dp0;%path%
就ok了嘛

gdmm 发表于 2010-2-19 21:06

[quote]原帖由 [i]x9tiancmd[/i] 于 2010-2-18 23:02 发表 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=46796&ptid=7166][img]http://bbs.bathome.net/images/common/back.gif[/img][/url]
在批处理前加上 path=%~dp0;%path%
就ok了嘛 [/quote]
试了好像不行呀,还是没能提取第几章这些出来合并。
呵呵,我看错了,原来不是回复我提出的那个问题的。

[[i] 本帖最后由 gdmm 于 2010-2-19 21:08 编辑 [/i]]

namejm 发表于 2010-2-22 22:16

  找到了下载不到文件的原因:curl.exe需要配合libssl32.dll和libeay32.dll方可使用,若当前机器%windir%中没有这两个dll,请下载顶楼提到的dll,放到%windir%目录下或curl.exe同一目录下使用。

P_Ricky 发表于 2010-4-12 14:53

这个太厉害了,需要支持的

sinianyangyang 发表于 2010-4-23 13:50

楼主真是太牛了,佩服,希望以后多多指点。呵呵。

zilove 发表于 2010-4-28 04:11

太厉害了。呵呵。下载阿

sig13 发表于 2010-4-28 17:54

我用vbs写了一个很傻的,但是没有用到第三方。主要是练习vbs的。

增加了两处错误处理,不是那么容易死了。[code]'比较傻的 Load http://www.yi-look.com/ 文本小说的脚本,代码是根据该网页特征写的
'即,该脚本只能用于 yilook 上的 Load
'必须进入到要 Load 的小说的首页,复制下 URL,作为参数运行该脚本,用如下命令
'cscript //Nologo //E:vbscript gyilook.vbs http://www.yi-look.com/art_??_??.html
'会在脚本当前目录下生成一个小说名的目录,里面按照 "第??节.txt" 保存文件
Option Explicit

Dim regExUrl
Set regExUrl = new RegExp
regExUrl.Pattern= "http://www.yi-look.com/art_\d+_\d+.html"

If regExUrl.Test(WScript.Arguments(0)) = False Then
        Wscript.echo "Maybe Not yi-look's URL?"
        WScript.Quit
End If

Set regExUrl = Nothing

Dim loadPage
Dim oDom

Do
        Wscript.echo "Loading the first page..."
        set oDom = WScript.GetObject(WScript.Arguments(0))
        loadPage = WaitLoading(oDom)
loop While loadPage = False

Dim dirName

Dim e
For each e in oDom.all
        If e.tagName = "TITLE" Then
                If Right(e.outerText, 2) = "易读"  Then
                        dirName = Left(e.outerText, (Len(e.outerText) - 3))
                        Exit For
                Else
                        Wscript.echo "Maybe Not real yi-look's URL?"
                        WScript.Quit
                End If
        End If
Next

Dim fso

Set fso = CreateObject("Scripting.FileSystemObject")
Do While fso.FolderExists(dirName)   
        dirName = dirName & "0"
Loop

fso.CreateFolder(dirName)   
Set fso = Nothing

Dim regEx
Set regEx = new RegExp
regEx.Pattern= "第\d+节"

Dim lnk
For each lnk in oDom.links
        If (regEx.Test(lnk.outerText)) Then
                Dim oDomX

                Do
                        Wscript.echo "Loading " & lnk.outerText & "... " & lnk.href
                        On Error Resume Next
                        Set oDomX = WScript.GetObject(lnk.href)
                        If Err.Number = 0 Then
                                loadPage = WaitLoading(oDomX)
                        Else
                                Wscript.echo "ERROR #" & CStr(Err.Number) & " " & Err.Description
                                Wscript.echo "Try again!!!"
                                Err.clear
                                loadPage = False
                        End If
                loop While loadPage = False

                Dim fn
                fn = dirName & "\" & lnk.outerText & ".txt"
                Call WriteTextFile(fn, oDomX.body.outerText)
                Set oDomX = Nothing
        End If
Next

Set oDom = Nothing
Set regEx = Nothing

Function WaitLoading(DomObj)
        Const TickOut = 60
        Dim tick
        tick = 0
       
        Do until DomObj.readyState = "complete"
                tick = tick + 1
               
                If tick > TickOut Then
                        WScript.echo "Timed out! Load failed... Try again! "
                        Exit Do
                End If

                WScript.sleep 500
        Loop
       
        WaitLoading = (tick <= TickOut)
End Function

Sub WriteTextFile(FileName, TextString)
        Const ForReading = 1, ForWriting = 2, ForAppending = 8
        Dim fso, f
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set f = fso.OpenTextFile(FileName, ForWriting, True, -1)
        f.Write TextString
        f.Close
        Set fso = Nothing
        Set f = Nothing
End Sub [/code]

[[i] 本帖最后由 sig13 于 2010-4-29 18:30 编辑 [/i]]

sig13 发表于 2010-4-29 09:19

我才调试完,yi-look就又被关了,什么世道?
不是我一个人连不上吧?
---
居然又开了,之前的脚本在load页面失败之后就挂了,增加了纠错功能,现在应该没问题了

[[i] 本帖最后由 sig13 于 2010-4-29 15:40 编辑 [/i]]

wudahht 发表于 2010-5-4 16:06

楼主强悍啊……慢慢学习消化一下

zjw767676 发表于 2010-5-23 19:16

[attach]2563[/attach]

a794685135 发表于 2010-5-31 00:59

闲得蛋疼,整了个中文的,
功能没全,大家莫笑,呵
[code]
@echo off
:初始化
set 设定=set
%设定% 召唤=call
%召唤% :设置

:开始
%设定标题% 易读下载器
%打开网址% http://www.yi-look.com/
%显示% 格式:http://www.yi-look.com/art_7826_3170.html
%显示% 在下面粘贴如上所示[小说目录网址]并回车
%设定%/p 小说网址=:

:获取下载列表
%设定标题% 正在获取下载列表
%循环% /f "%取第几个%=3 %分隔符%=/" %%i in ("%小说网址%") do %设定% 目录文件=%%i
%下载% %小说网址% >目录文件\%目录文件%
%判断% %不% %存在文件% 目录文件\%目录文件% %显示% 下载目录出错!& %暂停% & %跳转到% %结束%
%转换% 目录文件\%目录文件%
%循环% /f %%i in ("%目录文件%") do %设定% 目录列表=%%~ni.txt
%循环% /f "%取第几个%=3 %分隔符%= " %%i in ('%显示文件内容% 目录文件\%目录列表% ^|%查找% "TITLE "') do %设定% 小说名字=%%i
%循环% /f "%取第几个%=3 %分隔符%=:" %%i in ('%显示文件内容% 目录文件\%目录列表% ^|%查找% "作者:"') do (
%循环% /f "%取第几个%=2 %分隔符%=[]" %%j in ('%显示% %%i') do %设定% 小说名字+=%%j\%小说名字%
)
%创建目录% 小说文件\%小说名字+%\网页单章 小说文件\%小说名字+%\文本单章 %不显示任何信息%
%清空屏幕%

:开始下载
%循环% /f "%取第几个%=1,2 %分隔符%=<'" %%a in ('%显示文件内容% 目录文件\%目录列表% ^|%查找% /i "节<'read"') do %召唤% :设定下载 %%a %%b
%转换% 小说文件\%小说名字+%\网页单章\*.html %不显示任何信息%
%移动% 小说文件\%小说名字+%\网页单章\*.txt 小说文件\%小说名字+%\文本单章\ %不显示任何信息%
>小说文件\%小说名字+%\%小说名字%.txt %显示% %小说名字%
%循环% /l %%i in (1 1 %最后一章%) do (
>>小说文件\%小说名字+%\%小说名字%.txt %显示% 第%%i节
>>小说文件\%小说名字+%\%小说名字%.txt %显示文件内容% 小说文件\%小说名字+%\文本单章\%%i.txt
)
%清空屏幕%

%显示% 一切搞定!
pause %不显示任何信息%
%跳转到% %结束%

:设定下载
%设定% "章节序号=%~1"
%设定% "章节序号=%章节序号:*第=%"
%设定% "章节序号=%章节序号:~0,-1%"
%设定% 最后一章=%章节序号%
%设定标题% 正在下载 %小说名字% %章节序号%
%下载% %网址%%~2 >小说文件\%小说名字+%\网页单章\%章节序号%.html
%跳转到% %结束%

:设置
%设定% 删除目录=rd
%设定% 创建目录=md
%设定% 显示=echo
%设定% 循环=for
%设定% 取第几个=tokens
%设定% 分隔符=delims
%设定% 下载=curl
%设定% 判断=if
%设定% 不=not
%设定% 不等于=NEQ
%设定% 存在文件=exist
%设定% 暂停=pause
%设定% 跳转到=goto
%设定% 结束=:eof
%设定% 转换=htox32c /IP /O0 /U1+4
%设定% 显示文件内容=type
%设定% 查找=find
%设定% "不显示任何信息=>nul 2>nul"
%设定% 移动=move
%设定% 清空屏幕=cls
%设定% 设定标题=title
%设定% 网址=http://www.yi-look.com/
%设定% 打开网址=Start iexplore.exe
%创建目录% 目录文件 %不显示任何信息%
%创建目录% 小说文件 %不显示任何信息%
%跳转到% %结束%[/code]

a794685135 发表于 2010-5-31 01:17

应该把 判断 改成 如果 ,那样就成了

%如果% %不% %存在文件% 目录文件\%目录文件% %显示% 下载目录出错!

这样是不是很好理解?啊哈哈哈

liukevin 发表于 2010-7-30 20:25

不错,学习了。感谢楼主的分享

dnf_lf 发表于 2010-8-6 22:09

这个我不知道怎么用,楼主能帮忙说的详细些吗

dnf_lf 发表于 2010-8-6 22:30

不知道这个东西对其他网站的适用吗

cuipengfei 发表于 2010-10-9 18:37

不行啊! 到这里就没有反应了,txt也没下载下来!

cuipengfei 发表于 2010-10-9 18:38

到这里就没有反应了,txt也没有下载下来! 怎么回事啊?

ckgez 发表于 2010-10-27 07:56

BT 。。。好有动力撒

rockets 发表于 2010-11-16 13:50

太棒了这个东东,BAT  -  Beautiful, Amazing, Tool

bat123 发表于 2010-11-26 11:41

看起来 很给力   试用下

songyunhmiLY 发表于 2010-12-1 23:16

正在学习

非常好,学习中,感谢

女孩不哭 发表于 2011-1-8 02:37

其实命令行下载工具很多的,不用动用额外的几个动态链接库。

liaobin 发表于 2011-4-3 12:57

加了一句果然好用

页: [1] 2

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.