找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 210660|回复: 41

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

[复制链接]
发表于 2010-2-11 13:08:37 | 显示全部楼层 |阅读模式
  春节马上就要到了,貌似只剩下两天时间,在网上如何消遣?down一些txt小说回去慢慢欣赏,是件多么惬意的事情啊。namejm最近在网上转悠了好一阵子,发现一个非常干净的txt小说网站,名叫易读网,抓取txt小说十分方便。狂喜之余,做了个下载易读网txt小说的脚本,以方便广大书虫。
  如有什么bug,或有什么好的建议,望各位及时反馈。

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

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

  25. :Main
  26. cls
  27. del /a /f /q *.* 2>nul
  28. del /a /f /q ..\txt\*.* 2>nul
  29. title %TT%
  30. echo.&echo.
  31. echo                    本程序可以按照以下方式下载易读网上的txt小说
  32. echo.
  33. echo                    易读网首页:%www%
  34. echo.
  35. echo                        1、下载指定的某篇小说
  36. echo.
  37. echo                        2、根据配置文件下载指定的小说
  38. echo.
  39. echo                        3、下载指定页码上的所有小说
  40. echo.
  41. echo                        4、下载指定页码范围内的所有小说
  42. echo.
  43. echo                        5、下载全站的所有小说
  44. echo.
  45. echo                        X、退出
  46. set choice=
  47. call :line
  48. set /p choice=                请输入指定功能代码(1/2/3/4/5/X):
  49. if not defined choice goto Main
  50. if /i "%choice:~0,1%"=="X" exit
  51. set "choice=%choice:~0,1%"
  52. if "%choice%"=="1" goto DownGivenNovel
  53. if "%choice%"=="2" goto DownGivenNovels
  54. if "%choice%"=="3" goto DownGivenPage
  55. if "%choice%"=="4" goto DownGivenPages
  56. if "%choice%"=="5" goto DownAllPages
  57. goto Main

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

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

  110. :DownGivenPage
  111. cls
  112. title %TT%-指定页码
  113. echo.&echo.&echo.&echo.
  114. echo                您可以指定某一页码,本脚本将下载易读网上这一页内
  115. echo.
  116. echo                列出的所有小说
  117. echo.
  118. echo                如:输入3,将下载这一页面所列出的所有小说:
  119. echo.
  120. echo                        %www%/artlist_3.html
  121. call :line
  122. set page=
  123. set /p page=                请输入指定页码:
  124. if not defined page goto DownGivenPage
  125. if /i "%page:~0,1%"=="X" exit
  126. if /i "%page:~0,1%"=="M" goto Main
  127. curl -O %www%/artlist_%page%.html
  128. goto HTMLtoTXT

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

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

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

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

  178. :DownNovel
  179. cls
  180. title %TT%-下载小说
  181. echo.&echo.
  182. echo                正在下载小说,请稍候...
  183. md ..\..\..\整理结果 2>nul
  184. :: del /a /f /q ..\..\..\整理结果\*.*
  185. :: rd /q /s ..\..\已下载小说的原始文档
  186. md ..\..\已下载小说的原始文档 2>nul
  187. for /f "delims=| tokens=1,2" %%i in (..\要下载的小说列表.txt) do (
  188.     curl --create-dirs -o "..\..\已下载小说的原始文档\%%~i\index.html" "%%~j"
  189.     htox32c /IP /O0 /U1+4 "..\..\已下载小说的原始文档\%%~i\index.html"
  190.     cls
  191.     set lastchapter=1
  192.     for /f "delims=' tokens=1,2" %%x in ('findstr /i "第.*节" "..\..\已下载小说的原始文档\%%~i\index.txt"') do (
  193.         call :DownHTML "%%~i" "%%~x" "%%~y"
  194.     )
  195.     pushd "..\..\已下载小说的原始文档\%%~i\html"
  196.     htox32c /IP /O0 *.html
  197.     popd
  198.     md "..\..\已下载小说的原始文档\%%~i\txt" 2>nul
  199.     move "..\..\已下载小说的原始文档\%%~i\html\*.txt" "..\..\已下载小说的原始文档\%%~i\txt"
  200.     call :PickupTXT "%%~i"
  201.     move "..\..\已下载小说的原始文档\%%~i\%%i.txt" ..\..\..\整理结果
  202. )
  203. title %TT%-整理完毕
  204. echo                整理完毕
  205. pause
  206. goto Main

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

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

  228. :line
  229. echo.
  230. echo ________________________________________________________________________________
  231. if defined choice (
  232.     echo                退出 X                                返回主界面 M
  233. )
  234. echo.&echo.
  235. goto :eof
复制代码
正文中提到的第三方命令行工具可以在这些地方找到:
  1、Curl.exe:http://curl.haxx.se/(官网)或http://bbs.bathome.net/thread-1761-1-1.html
  2、HtoX32c.exe:http://win32lab.com/(官网,日文)或http://bbs.bathome.net/thread-1974-1-1.html(带中文帮助信息)

  注意:curl.exe需要配合libssl32.dll和libeay32.dll方可使用,若当前机器%windir%中没有这两个dll,请到http://bbs.bathome.net/viewthread.php?tid=1761顶楼下载《curl所需dll.rar》 这个附件,放到%windir%目录下或curl.exe同一目录下使用。
发表于 2010-2-11 16:48:42 | 显示全部楼层
已经在使用了,感觉非常好,而且从中学到一些技巧,只是还需要慢慢消化。
发表于 2010-2-12 14:23:17 | 显示全部楼层
选1

选2
发表于 2010-2-13 05:32:53 | 显示全部楼层
只是我的机上curl.exe和HtoX32c.exe都无法运行,一闪而过,或许是我的错,我是把三个文件都放在同一个文件夹里
发表于 2010-2-16 20:20:32 | 显示全部楼层
可以用呀,把curl.exe和HtoX32c.exe放到\WINDOWS\system32文件夹中就行了,试了很好用。
发表于 2010-2-18 09:30:48 | 显示全部楼层
好像没有用的???是吗???
发表于 2010-2-18 17:16:58 | 显示全部楼层
绝对能用,唯一美中不足就是整理合并后的文本内容中没有了第几章的分开
阅读起来不是很习惯,应该是网页转回文本后,在提取文本内容合并时没有提取第几章这个
不知是否能改动一下。
发表于 2010-2-18 23:02:43 | 显示全部楼层
在批处理前加上 path=%~dp0;%path%
就ok了嘛
发表于 2010-2-19 21:06:00 | 显示全部楼层
原帖由 x9tiancmd 于 2010-2-18 23:02 发表
在批处理前加上 path=%~dp0;%path%
就ok了嘛

试了好像不行呀,还是没能提取第几章这些出来合并。
呵呵,我看错了,原来不是回复我提出的那个问题的。

[ 本帖最后由 gdmm 于 2010-2-19 21:08 编辑 ]
 楼主| 发表于 2010-2-22 22:16:14 | 显示全部楼层
  找到了下载不到文件的原因:curl.exe需要配合libssl32.dll和libeay32.dll方可使用,若当前机器%windir%中没有这两个dll,请下载顶楼提到的dll,放到%windir%目录下或curl.exe同一目录下使用。
发表于 2010-4-12 14:53:13 | 显示全部楼层
这个太厉害了,需要支持的
发表于 2010-4-23 13:50:10 | 显示全部楼层
楼主真是太牛了,佩服,希望以后多多指点。呵呵。
发表于 2010-4-28 04:11:19 | 显示全部楼层
太厉害了。呵呵。下载阿
发表于 2010-4-28 17:54:33 | 显示全部楼层
我用vbs写了一个很傻的,但是没有用到第三方。主要是练习vbs的。

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

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

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

  14. Set regExUrl = Nothing

  15. Dim loadPage
  16. Dim oDom

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

  22. Dim dirName

  23. Dim e
  24. For each e in oDom.all
  25.         If e.tagName = "TITLE" Then
  26.                 If Right(e.outerText, 2) = "易读"  Then
  27.                         dirName = Left(e.outerText, (Len(e.outerText) - 3))
  28.                         Exit For
  29.                 Else
  30.                         Wscript.echo "Maybe Not real yi-look's URL?"
  31.                         WScript.Quit
  32.                 End If
  33.         End If
  34. Next

  35. Dim fso

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

  40. fso.CreateFolder(dirName)   
  41. Set fso = Nothing

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

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

  49.                 Do
  50.                         Wscript.echo "Loading " & lnk.outerText & "... " & lnk.href
  51.                         On Error Resume Next
  52.                         Set oDomX = WScript.GetObject(lnk.href)
  53.                         If Err.Number = 0 Then
  54.                                 loadPage = WaitLoading(oDomX)
  55.                         Else
  56.                                 Wscript.echo "ERROR #" & CStr(Err.Number) & " " & Err.Description
  57.                                 Wscript.echo "Try again!!!"
  58.                                 Err.clear
  59.                                 loadPage = False
  60.                         End If
  61.                 loop While loadPage = False

  62.                 Dim fn
  63.                 fn = dirName & "" & lnk.outerText & ".txt"
  64.                 Call WriteTextFile(fn, oDomX.body.outerText)
  65.                 Set oDomX = Nothing
  66.         End If
  67. Next

  68. Set oDom = Nothing
  69. Set regEx = Nothing

  70. Function WaitLoading(DomObj)
  71.         Const TickOut = 60
  72.         Dim tick
  73.         tick = 0
  74.        
  75.         Do until DomObj.readyState = "complete"
  76.                 tick = tick + 1
  77.                
  78.                 If tick > TickOut Then
  79.                         WScript.echo "Timed out! Load failed... Try again! "
  80.                         Exit Do
  81.                 End If

  82.                 WScript.sleep 500
  83.         Loop
  84.        
  85.         WaitLoading = (tick <= TickOut)
  86. End Function

  87. Sub WriteTextFile(FileName, TextString)
  88.         Const ForReading = 1, ForWriting = 2, ForAppending = 8
  89.         Dim fso, f
  90.         Set fso = CreateObject("Scripting.FileSystemObject")
  91.         Set f = fso.OpenTextFile(FileName, ForWriting, True, -1)
  92.         f.Write TextString
  93.         f.Close
  94.         Set fso = Nothing
  95.         Set f = Nothing
  96. End Sub
复制代码

[ 本帖最后由 sig13 于 2010-4-29 18:30 编辑 ]
发表于 2010-4-29 09:19:24 | 显示全部楼层
我才调试完,yi-look就又被关了,什么世道?
不是我一个人连不上吧?
---
居然又开了,之前的脚本在load页面失败之后就挂了,增加了纠错功能,现在应该没问题了

[ 本帖最后由 sig13 于 2010-4-29 15:40 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 20:19 , Processed in 0.024937 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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