[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

  春节马上就要到了,貌似只剩下两天时间,在网上如何消遣?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同一目录下使用。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

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

TOP

选1

选2
有一种爱叫放弃

TOP

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

TOP

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

TOP

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

TOP

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

TOP

在批处理前加上 path=%~dp0;%path%
就ok了嘛
    ╭╩═╮
╭╯G O ╠ 雁过留声
╰⊙═⊙╯

TOP

原帖由 x9tiancmd 于 2010-2-18 23:02 发表
在批处理前加上 path=%~dp0;%path%
就ok了嘛

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

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

TOP

  找到了下载不到文件的原因:curl.exe需要配合libssl32.dll和libeay32.dll方可使用,若当前机器%windir%中没有这两个dll,请下载顶楼提到的dll,放到%windir%目录下或curl.exe同一目录下使用。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

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

TOP

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

TOP

太厉害了。呵呵。下载阿

TOP

我用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. Do until DomObj.readyState = "complete"
  75. tick = tick + 1
  76. If tick > TickOut Then
  77. WScript.echo "Timed out! Load failed... Try again! "
  78. Exit Do
  79. End If
  80. WScript.sleep 500
  81. Loop
  82. WaitLoading = (tick <= TickOut)
  83. End Function
  84. Sub WriteTextFile(FileName, TextString)
  85. Const ForReading = 1, ForWriting = 2, ForAppending = 8
  86. Dim fso, f
  87. Set fso = CreateObject("Scripting.FileSystemObject")
  88. Set f = fso.OpenTextFile(FileName, ForWriting, True, -1)
  89. f.Write TextString
  90. f.Close
  91. Set fso = Nothing
  92. Set f = Nothing
  93. End Sub
复制代码

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

TOP

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

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

TOP

返回列表