无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 7657|回复: 14
打印 上一主题 下一主题

用批处理抓取搜狐读书网上的txt小说——以整理《退膛》为例

[复制链接]
跳转到指定楼层
1#
发表于 2010-2-9 00:15:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  抓取网页上的小说整理成txt电子书放电脑上慢慢欣赏?嗯,主意不错。说干就干,建个test目录,新建test.cmd,打开记事本——慢,慢,这么大的工程,竟然只用到了记事本,寒碜了点吧?

  嗯,好像还少了几个工具。

  Win+S,everything嗖地蹦了出来,输入“第三方”,唰的一下,冒出了1000+个搜索结果,唉,太多了,换个关键字吧,输入“curl.exe”,有好几个结果,其中有一个放在c:\windows\system32下,哈哈,太好了,不用我再去复制到test目录下,直接调用就是了;再搜“htox32c.exe”,也在c:\windows\system32下老老实实地呆着呢,太好了!

  广告插播时间,请不要走开,后面更精彩:
  everything:文件搜索闪电侠,号称1S搜遍全盘,搜索文件的速度在这个星球上貌似还没有谁能把它比下去,不过和这次我要介绍的主题关系不大,对它的溢美之词虽然如滔滔江水在我心中已经泛滥成灾,但是只能忍痛暂且打住;
  curl:命令行下抓取网络文件的不二选择,http、ftp、telnet……各种常见的和不常见的协议通吃,整站下载、指定页面下载、ftp文件上传、断点续传、分块下载……各种花样层出不穷,令人眼花缭乱;
  HtoX32c:网页文件转txt的利器,CN-DOS神人级人物“无奈何”试遍网络上各种命令行转换工具,唯此一款爱不释手,并做了汉化,这款最后更新日期为2004年的工具,至今仍是神器,鲜有能超越它的,小日本做的很多软件都能做到小巧而强悍,不得不令人折服。


  有了curl抓取网页,再用HtoX32c转为txt,最后动用强大的批处理来打扫战场,在本机上建个txt书库将指日可待。要是再转成word,排版,设计封面,找个印刷厂,一口气印它三五千册,地摊上一扔,八元十元就开卖,真个是机器一响,黄金万两啊。奸笑ing。

  新浪、搜狐、起点中文……这么多可下载txt的地方,该选哪一个呢?瞄呀瞄,眼神一不对劲,就把sohu瞄上了,别问我为什么,跟着我开工就行了,let's  go。

  namejm最喜欢看的就是军事题材的小说,特别是特种兵题材的,这一次,namejm把《退膛》给盯上了。

  先整理下思路:要想获取所有的章节内容,就得把每个章节的网页文件下载到本地,然后,把网页中的代码剔除,留下文字部分,最后,把小说的正文部分提取出来,合并就完事。

  先找《退膛》的目录页,因为在这里有所有章节的链接,把这些链接提取出来,好事基本上就成功了1/4了——为什么不是1/3?且听我慢慢道来。

  不费吹灰之力就找到了目录页链接:http://lz.book.sohu.com/serialize-id-15582.html,二话不说,下载之:
  1. curl -o index.html http://lz.book.sohu.com/serialize-id-15582.html
复制代码
  把目录页保存为index.html,放在当前目录下备用。

  记事本打开index.html,寻找各章节链接的规律——不要问我查看网页文件为什么不用网页元素分析器、Dreamweaver、IDE之类的重武器,杀鸡焉用牛刀?很多时候,我们应当学会用简陋的武器做出不平凡的成绩来,在这里,记事本已经足够了,就像看pdf,我只选择FoxitReader而不会去安装笨重的AdobeReader。

  记事本里,按Ctrl+F,弹出“查找”对话框,搜索链接标志“href=”,不断按“查找下一个”,按到手发酸,半天也看不到想要的链接。拉一拉右侧的下拉条,眼睛扫啊扫,还是没找到。呵呵,我当时那个笨啊。直接用浏览器打开index.html,找到目录页里的标题,随便输入一个就定位到链接了,比如搜索“《退膛》 和平区(1)”,该行所在的网页代码是“<li><a target="_blank" href="chapter-15582-112370117.html">《退膛》 和平区(1)</a></li>”,其他的链接大同小异。把所有的标题所在行的网页代码都提取到一个临时文件里欣赏一下,顺便找下要提取的字符串的规律:
  1. findstr /i "《退膛》.*([1-9].*)" index.html>tmp.txt
复制代码
  注意,注意,哈欠连天的同学千万要注意了,字符串表达式一定要写成"《退膛》.*([1-9].*)",而不是"《退膛》.*([1-9])",先揉下眼睛,再做下深呼吸,想想这是为什么。一定要想哈,使劲想哈。不想?后果很严重哦。想当初,我愣是没能把每章第9节之后的章节整理出来,硬生生把小说全本弄成了太监贴。


  打开tmp.txt,仔细分析一下,看看以什么字符做分隔符比较合适,在这里,我选择了>、<和=做分隔符:
  1. for /f "delims=><= tokens=5,6" %%i in ('findstr /i "《退膛》.*([1-9].*)" index.html') do (
  2.     title 正在下载网页 http://lz.book.sohu.com/%%~i
  3.     curl --create-dirs -o html\%%~nxi http://lz.book.sohu.com/%%~i
  4. )
复制代码
  把下载的html文件放到目录html中去,为了随时了解下载进度,我没有关闭屏幕上乱七八糟的显示内容,并在标题中显示了当前下载的URL,如果觉得当前的屏幕太乱了,请自行研究curl的屏显参数。


  屏幕上的字符流水般欢快地跑了一阵子之后,所有的html文件就下载完毕了。下一步该把html文件转为txt了。

  其实网页文件转txt并没有多少复杂的操作,一条命令就足够了:
  1. HtoX32c /IP html\*.html
复制代码
  转眼工夫,所有的html已经转换为同名的txt文件,txt中的内容和我们在网页浏览器中看到的格式基本一致,基本上原样保留了在网页浏览器中的模样,这对我们后续的处理是非常有利的。


  现在,txt和html文件都保存在html文件夹下,“人货混装”是历来是道路安全行驶的大忌,把它们分离了吧:
  1. md txt 2>nul
  2. move html\*.txt txt\>nul
复制代码
  一眨眼工夫,txt和html各就各位,分别保存到txt和html文件夹下。由于隐蔽工作做得好,这一过程在屏幕上基本上没留下什么痕迹,包括创建重名文件夹时的报错信息以及move搬运工为了取悦老板而故作聪明随时发出的报喜信息。


  现在,最关键的时刻来到了:从各txt文件中提取小说的正文内容,并按章节把它们拼接起来。在这个过程中,要求只提取正文,不能一不留神就收了别人贿赂过来的小红包,并且,每一章节都要用空行隔开,还有,次序千万不能弄乱了——如果次序都乱了的话,估计无辜的屏幕在暴怒主人的拳头下会粉身碎骨的,我们千万不能上演这样的杯具啊。

  伟大的findstr!它继承了Windows数十年的优良传统,它凝聚了无数牛B人物的心血,它承载了广大热情观众的希望,这一刻,findstr灵魂附体,它要出手了!它来无影去无踪,快如闪电,佛山无影脚、南来北往拳……它实现了千百万劳苦大众的伟大梦想!啊,伟大的findstr万岁!万岁……谁在嘶吼?

  困难是存在的,但是findstr也不是吃素的,撑大厦于将倾、挽狂澜于即倒,希望即将破灭之际,敢挺身而出横刀立马者,唯我findstr将军。代码在此:
  1. cd.>《退膛》.txt
  2. for %%i in (txt\*.txt) do (
  3.     title 正在整理 %%~nxi
  4.     echo.>>《退膛》.txt
  5.     findstr /ib "《退膛》" %%i>>《退膛》.txt
  6.     echo.>>《退膛》.txt
  7.     findstr /ibc:"    " %%i>>《退膛》.txt
  8. )
复制代码
  幸好小说每一章节的网页文件名字符串长度相等,且文件名中由小到大的数字正好与章节的先后顺序相吻合,从而一条 for %%i in (txt\*.txt) 语句就足以实现小说章节的自动排序,无需再为各章节内容的顺序问题操心;每一章节的正文,每一段都是以两个全角空格打头,一条 findstr /ibc:"    " %%i>>《退膛》.txt 轻轻松松就把所有的正文内容从纷繁芜杂的文本中提取出来了。


  把上述代码组合起来,并加上一些提示信息,以帮助各位打发下载过程中无聊的时光,于是,下载搜狐读书网上连载小说的绝世代码就横空出世了:
  1. @echo off
  2. :: 建立小说目录
  3. md 《退膛》 2>nul
  4. cd /d 《退膛》 2>nul
  5. :: 下载目录页
  6. title 正在下载目录页
  7. curl -o index.html http://lz.book.sohu.com/serialize-id-15582.html
  8. :: 下载文字部分所在的网页文件
  9. for /f "delims=><= tokens=5,6" %%i in ('findstr /i "《退膛》.*([1-9].*)" index.html') do (
  10.     title 正在下载网页 http://lz.book.sohu.com/%%~i
  11.     curl --create-dirs -o html\%%~nxi http://lz.book.sohu.com/%%~i
  12. )
  13. :: 转换网页文件为txt
  14. cls
  15. title 转换文件格式
  16. echo 正在转换网页文件为txt文档
  17. HtoX32c /IP /O0 html\*.html
  18. md txt 2>nul
  19. move html\*.txt txt\>nul
  20. cls
  21. echo 正在合并章节,请稍候...
  22. cd.>《退膛》.txt
  23. for %%i in (txt\*.txt) do (
  24.     title 正在整理 %%~nxi
  25.     echo.>>《退膛》.txt
  26.     findstr /ib "《退膛》" %%i>>《退膛》.txt
  27.     echo.>>《退膛》.txt
  28.     findstr /ibc:"    " %%i>>《退膛》.txt
  29. )
  30. title 处理完毕
  31. cls
  32. echo.&echo 已经处理完毕,整理后的文章保存在 "%cd%\《退膛》.txt" 中
  33. echo.
  34. pause
复制代码
  以上代码适合如下情形:


  1、连载小说存在目录页,可以一次性提取所有页面的链接;
  2、小说正文和其他部分的文字有很容易识别的标志,比如本例中的正文段落都以两个全角空格打头;
  3、需要使用第三方命令行工具curl.exe和HtoX32.exe;


  以上的条件是如此的宽松,搜狐网和新浪网上符合条件的小说比比皆是(起点中文网暂时没有细看,其他站点也无暇过问,但网上这样的站点绝对不在少数),只要有心,动一动手指头,把现成的代码稍加改动,这些小说皆唾手可得。

  资源的获取是如此的容易,并且是批量式的下载,如果大家蜂拥而上的话,这些站点会跨掉么?以前我一直在想这个问题,以至于敝帚自珍,不愿意把思路和代码公之于众。但转念一想,sohu、sina大小是门户网站,每天的访问量以百万计,溺水三千,我只取一瓢饮,以小生区区一个批处理,弄点小流量的下载,还不至于让它们倒下吧,再不济,它们也得撑上个十年八年吧,因为“我真的还想再活五百年”啊。希望大家看过这篇文章后,能把以上代码用于资料的正常获取中,而不要去恶意连接这些站点,特别是那些规模不大的站点,当大家都无书可看之时再捶胸顿足可就悔之晚矣。

附注:
————————————————————————————————————
正文中提到的第三方命令行工具可以在这些地方找到:

  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(带中文帮助信息)
2#
发表于 2010-2-9 19:54:21 | 只看该作者
楼主,把文中的东东传上来啊?
回复

使用道具 举报

3#
发表于 2010-2-9 22:29:39 | 只看该作者
写得真详细,好好看看,谢谢!
回复

使用道具 举报

4#
发表于 2010-2-10 03:30:29 | 只看该作者
写得够详细!支持一下!
回复

使用道具 举报

5#
发表于 2010-2-10 15:51:31 | 只看该作者
Everything V1.2.1.375b 汉化版
http://www.greendown.cn/soft/14266.html

以前都是用Locate32,这个右键发送到u盘后有个提示框,不知道怎么去掉,不爽这个

转换htm到txt我用TextForever批量转,觉得不错,功能很多

[ 本帖最后由 haxc 于 2010-2-10 16:00 编辑 ]
回复

使用道具 举报

6#
发表于 2010-2-10 16:05:37 | 只看该作者
还有,下载htm我使用Offline Explorer离线下载软件下载,速度很快,下载完之后htm转txt,然后替换到多余的文字,合并txt就ok了
回复

使用道具 举报

7#
 楼主| 发表于 2010-2-10 17:39:16 | 只看该作者
  图形化的软件只能实现有限的功能,并且在批量操作上不是很方便,用脚本来分析页面可以实现更多的功能,更具有灵活性。
回复

使用道具 举报

8#
发表于 2010-2-18 23:30:28 | 只看该作者

for namejm

批处理之家的版主就是强悍,你真是个高人喔,呵呵,没想到老兄的文彩这么好!
回复

使用道具 举报

9#
发表于 2010-2-19 16:20:50 | 只看该作者
这样可以吗?试试看看。
回复

使用道具 举报

10#
发表于 2010-2-21 13:40:01 | 只看该作者
好强大啊,学习一下!~~
回复

使用道具 举报

11#
发表于 2010-3-3 20:07:24 | 只看该作者
我想,linux里应该更简单。
回复

使用道具 举报

12#
发表于 2010-3-19 13:22:20 | 只看该作者
服到不得了。。。。.。。。
回复

使用道具 举报

13#
发表于 2011-5-16 15:02:45 | 只看该作者
呵呵,以后想看小说就可以这么玩了
回复

使用道具 举报

14#
发表于 2011-5-26 23:10:42 | 只看该作者
收藏一个,喜欢看小说
回复

使用道具 举报

15#
发表于 2011-5-27 09:46:13 | 只看该作者
楼主果然是高手啊
文章好,技术高
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-12-1 12:07

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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