Board logo

标题: [原创]DOS联盟论坛收贴小虫 [打印本页]

作者: 无奈何     时间: 2006-11-27 14:48    标题: [原创]DOS联盟论坛收贴小虫

DOS联盟论坛收贴小虫
        这个小脚本的功能很简单,就是下载保存坛子里有用的帖子。因为操作失误不小心删了帖子,幸得 ccwan 兄保留了部分帖子,减少了部分损失,所以就想写个脚本来自动收集整理有用的帖子。
        脚本使用也很简单,只需提交一下主题帖子的 ID 就是对应主题地址的 tid ,可以一次提交多个主题 ID 。理论上说用 for 循环调用可以下载论坛的所有主题帖子,但是强烈鄙视这种做法,如果一次保存较多的帖子请选择非繁忙时段运行。关于如何更好的过滤帖子列表,可以参考:批處理室 管理日志 http://www.cn-dos.net/forum/viewthread.php?tid=20332 相关讨论。希望有兴趣的朋友能制作出<中国DOS联盟>精彩讨论的电子书,我愿提供支持。如果有帖子需要登录后才能阅读,请用先 wget 保存 cookies,然后自行修改脚本内的 wget 的命令参数调用此 cookies,如果特别需要可以考虑以后加入。由于文件保存的目录不可能总是变动,所以没有考虑参数来设定,请自行修改变量 savepath 的值。再提及一点,如果帖子已经保存过,再次提交可以更新。
        关于如何更方便的使用这个脚本,可以放到系统可搜索到的路径下“运行”调用,也可以建立一个快捷方式然后设定一个启动热键。由于为了快速实现功能,使用了较多的第三方软件,可在提供的链接中下载。
        由于上面提到的原因,可能会对论坛速度带来影响,所以采取非完全公开式共享,限定积分 300 点,看不到的朋友请原谅。

相关下载链接:
wget:http://users.ugent.be/~bpuype/wget/
concmd:http://alf-li.pcdiscuss.com/
gawk:http://www.klabaster.com/progs/gawk32.zip
htox32c:http://www.cn-dos.net/forum/viewthread.php?tid=25122

  Quote:

  1. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2. :: cn-dos.cmd -V0.1 -- DOS联盟论坛收贴小虫
  3. :: 无奈何 - 2006-11-26 - CMD & GAWK
  4. :: 用法:cn-dos [主题ID] [/h 显示帮助]
  5. :: 支持文件: - gawk.exe  wget.exe concmd.exe htox32c.exe
  6. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7. @echo off
  8. setlocal
  9. set self="%~f0"
  10. set path=%path%;%~dp0;%cd%
  11. set nofile=
  12. ::依赖文件完整性检查
  13. for %%i in (gawk.exe wget.exe htox32c.* concmd.*) do (
  14.         @if "%%~$PATH:i" == "" (
  15.                 echo.程序所依赖文件 "%%i" 缺失。
  16.                 set nofile=1
  17.         ) else ( set %%~ni="%%~$PATH:i" )
  18. )
  19. if defined nofile goto :EOF

  20. ::设置文件保存目录
  21. set savepath=D:\cn-dos\
  22. set url_=http://www.cn-dos.net/forum/viewthread.php?action=printable
  23. if not exist "%savepath%\HTML\" md "%savepath%\HTML"
  24. if not exist "%savepath%\TXT\" md "%savepath%\TXT"
  25. pushd "%savepath%"\HTML

  26. if "%~1" == "?" goto help
  27. if "%~1" == "/?" goto help
  28. if "%~1" == "/H" goto help
  29. if "%~1" == "/h" goto help

  30. if "%~1" == "" (
  31.         set /p tid=请输入主题 ID :
  32. ) else (
  33.         set tid=%~1
  34. )

  35. :loop
  36. if "%tid%" == "" goto :EOF
  37. if "%tid%" == "Q" goto :EOF
  38. if "%tid%" == "q" goto :EOF
  39. set url="%url_%&tid=%tid%"
  40. ::设置提示消息
  41. echo.请稍侯...
  42. if exist "%tid%.html" (
  43.         set msg=请求主题 %tid% 已更新!
  44. ) else (
  45.         set msg=请求主题 %tid% 已下载!
  46. )

  47. wget -q -k %url%
  48. move /y "*.php@action=printable&tid=%tid%" %tid%.html >nul
  49. ::网页转码 UTF-8 --> GBK
  50. call concmd /o:gbk %tid%.html >nul
  51. ::检查提交主题是否存在
  52. findstr "<br>指定的主题不存在或已被删除" %tid%.html >nul
  53. if "%ERRORLEVEL%" == "0" (
  54.         del %tid%.html
  55.         echo.所请求主题不存在!ID:%tid%
  56.         set /p tid=请重新输入帖子 ID 或退出[Q]:
  57.         goto loop
  58. )
  59. ::网页转为文本
  60. htox32c /ip /t0 /o0 /d2 /a1 /u7 %tid%.html 2>nul
  61. gawk "/^#<-1/,/^#>-1/{if(!/^#/)print}" %self% |gawk --re-interval -f "-" %tid%.txt
  62. del %tid%.txt
  63. move /y %tid%*.txt ..\TXT\ >nul
  64. echo.%msg%
  65. echo.
  66. ::处理下一个参数
  67. shift
  68. set tid=%~1
  69. goto loop
  70. goto :EOF

  71. :help
  72. echo.DOS联盟论坛收贴小虫
  73. echo.
  74. echo.用法:%~n0 [ID1] [ID2...]
  75. echo.      ID 为对应主题 tid ,可指定多个主题。
  76. echo.实例:%~n0 1
  77. echo.      %~n0 24951 22254
  78. goto :EOF

  79. :AwkScript
  80. #<-1
  81. BEGIN {
  82.         f=0
  83.         i=0
  84. }
  85. {
  86.         if (!f) {
  87.                 if($0~/^标题:.*\[打印本页\]$/) {
  88.                 f=1
  89.                 gsub(/ * \[打印本页\] */,"")
  90.                 title=gensub(/^标题: */,"","g")
  91.                 tid=gensub(/^([0-9]*).*/,"\\1","g",FILENAME)
  92.                 name=gensub(/[/*<>:?"|\\]/,"-","g",title)
  93.                 name=tid "--" name ".txt"
  94.                 print title >name
  95.                 }
  96.         }
  97.         else {
  98.                 if ($0~/^-{60,}$/) {
  99.                         getline
  100.                         if ($0~/^作者:/) {
  101.                                 print "-------------------------------------------------------------------------------" >>name
  102.                                 if (i==0) {
  103.                                         $0="『楼 主』:    " $0
  104.                                         i++
  105.                                 }
  106.                                 else {
  107.                                         $0="『第 " ++i " 楼』:    " $0
  108.                                 }
  109.                         }
  110.                         else {
  111.                                         print "---------------------------------------" >>name

  112.                                 }
  113.                 }
  114.                         print >>name
  115.         }
  116. }
  117. END{
  118.         close(name)
  119. }
  120. #>-1
  121. goto :EOF
        无奈何发表于    2006-11-27  01:43

[ Last edited by 无奈何 on 2006-11-27 at 03:00 PM ]
附件 1: cn-dos.zip (2006-11-27 14:48, 1.52 K, 下载附件所需积分 300 点 ,下载次数: 22)

作者: redtek     时间: 2006-11-27 15:29
感谢版主无私奉献~:)下载珍藏~:)))

第86行代码":AwkScript"以后还可以这样执行,还能单独定义出AWK脚本……
太强大了!!!
作者: ccwan     时间: 2006-11-27 21:13
无奈何兄的确令人叹服。珍藏下了。
作者: electronixtar     时间: 2006-11-27 23:34
其实要点在于 action=printable


再次拜一个
作者: vkill     时间: 2006-11-27 23:44
gawk的看不懂,学习中
作者: vkill     时间: 2006-11-27 23:54
理论上说用 for 循环调用可以下载论坛的所有主题帖子

我看还是把积分再弄高点哈~1000??
作者: vkill     时间: 2006-11-28 00:00
wget -q -k %url%
move /y "*.php@action=printable&tid=%tid%" %tid%.html >nul

这两句可以写为
wget -q --output-document=%tid%.html “%url%”
不用move了
作者: ccwan     时间: 2006-11-28 00:09
我讲几句:
若要看到这帖子,可以到水区狂灌一番,照样够积分不是?
另外,现在网上到处可见整站下载的工具,恐怕本站防不了吧?当然,也不是每个人都有偶这样的条件——硬盘160G,局域网内还有十余台机子可供储存^_^
作者: vkill     时间: 2006-11-28 00:23


  Quote:
Originally posted by ccwan at 2006-11-28 00:09:
我讲几句:
若要看到这帖子,可以到水区狂灌一番,照样够积分不是?
另外,现在网上到处可见整站下载的工具,恐怕本站防不了吧?当然,也不栮..

汗~下载整站随便一个硬盘都可以
作者: 无奈何     时间: 2006-11-28 00:29
RE vkill
不可以,我如此写的目的是转换网页链接为绝对链接并作保留,而只有 -r 参数有效时 -k 参数才工作,-O 参数破坏了递归方式的自动命名,所以就不会转换链接。兄可以实际测试比对一下两者差异。

RE ccwan
作此脚本的主要目的是方便用户保存帖子。当然别人也可以写一个采集脚本,我不反对别人(非注册用户)收集坛子里帖子,这也是对联盟技术的一种宣传,我只是不想看到太恶意的暴力下载。
作者: vkill     时间: 2006-11-28 00:35
斑竹,我忘记还用-k参数了,以前一直下的一个网页,没有注意到这问题,谢提醒
作者: ccwan     时间: 2006-11-28 00:47
re 无奈何
是啊!尽自己的心力做到最好就是了。
作者: electronixtar     时间: 2006-11-28 01:00
其实我是用迅雷下载的,把id从0到25130的帖子全部下载了
作者: namejm     时间: 2006-11-28 02:17
  无奈何 兄的代码厉害,顶一个,顺便灌一下水~~~
作者: hxuan999     时间: 2007-1-18 06:44
在无奈何版主的贴下也只能灌水了...
作者: qingfushuan     时间: 2007-2-25 00:32    标题: 终于看到了,习惯性灌水吧

无意中用8楼ccwan的方法看到这个帖子的




欢迎光临 中国DOS联盟论坛 (http://cndos.fam.cx/forum/) Powered by Discuz! 2.5