|
抓取网页上的小说整理成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,二话不说,下载之:- 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>”,其他的链接大同小异。把所有的标题所在行的网页代码都提取到一个临时文件里欣赏一下,顺便找下要提取的字符串的规律:- findstr /i "《退膛》.*([1-9].*)" index.html>tmp.txt
复制代码 注意,注意,哈欠连天的同学千万要注意了,字符串表达式一定要写成"《退膛》.*([1-9].*)",而不是"《退膛》.*([1-9])",先揉下眼睛,再做下深呼吸,想想这是为什么。一定要想哈,使劲想哈。不想?后果很严重哦。想当初,我愣是没能把每章第9节之后的章节整理出来,硬生生把小说全本弄成了太监贴。
打开tmp.txt,仔细分析一下,看看以什么字符做分隔符比较合适,在这里,我选择了>、<和=做分隔符:- for /f "delims=><= tokens=5,6" %%i in ('findstr /i "《退膛》.*([1-9].*)" index.html') do (
- title 正在下载网页 http://lz.book.sohu.com/%%~i
- curl --create-dirs -o html\%%~nxi http://lz.book.sohu.com/%%~i
- )
复制代码 把下载的html文件放到目录html中去,为了随时了解下载进度,我没有关闭屏幕上乱七八糟的显示内容,并在标题中显示了当前下载的URL,如果觉得当前的屏幕太乱了,请自行研究curl的屏显参数。
屏幕上的字符流水般欢快地跑了一阵子之后,所有的html文件就下载完毕了。下一步该把html文件转为txt了。
其实网页文件转txt并没有多少复杂的操作,一条命令就足够了: 转眼工夫,所有的html已经转换为同名的txt文件,txt中的内容和我们在网页浏览器中看到的格式基本一致,基本上原样保留了在网页浏览器中的模样,这对我们后续的处理是非常有利的。
现在,txt和html文件都保存在html文件夹下,“人货混装”是历来是道路安全行驶的大忌,把它们分离了吧:- md txt 2>nul
- move html\*.txt txt\>nul
复制代码 一眨眼工夫,txt和html各就各位,分别保存到txt和html文件夹下。由于隐蔽工作做得好,这一过程在屏幕上基本上没留下什么痕迹,包括创建重名文件夹时的报错信息以及move搬运工为了取悦老板而故作聪明随时发出的报喜信息。
现在,最关键的时刻来到了:从各txt文件中提取小说的正文内容,并按章节把它们拼接起来。在这个过程中,要求只提取正文,不能一不留神就收了别人贿赂过来的小红包,并且,每一章节都要用空行隔开,还有,次序千万不能弄乱了——如果次序都乱了的话,估计无辜的屏幕在暴怒主人的拳头下会粉身碎骨的,我们千万不能上演这样的杯具啊。
伟大的findstr!它继承了Windows数十年的优良传统,它凝聚了无数牛B人物的心血,它承载了广大热情观众的希望,这一刻,findstr灵魂附体,它要出手了!它来无影去无踪,快如闪电,佛山无影脚、南来北往拳……它实现了千百万劳苦大众的伟大梦想!啊,伟大的findstr万岁!万岁……谁在嘶吼?
困难是存在的,但是findstr也不是吃素的,撑大厦于将倾、挽狂澜于即倒,希望即将破灭之际,敢挺身而出横刀立马者,唯我findstr将军。代码在此:- cd.>《退膛》.txt
- for %%i in (txt\*.txt) do (
- title 正在整理 %%~nxi
- echo.>>《退膛》.txt
- findstr /ib "《退膛》" %%i>>《退膛》.txt
- echo.>>《退膛》.txt
- findstr /ibc:" " %%i>>《退膛》.txt
- )
复制代码 幸好小说每一章节的网页文件名字符串长度相等,且文件名中由小到大的数字正好与章节的先后顺序相吻合,从而一条 for %%i in (txt\*.txt) 语句就足以实现小说章节的自动排序,无需再为各章节内容的顺序问题操心;每一章节的正文,每一段都是以两个全角空格打头,一条 findstr /ibc:" " %%i>>《退膛》.txt 轻轻松松就把所有的正文内容从纷繁芜杂的文本中提取出来了。
把上述代码组合起来,并加上一些提示信息,以帮助各位打发下载过程中无聊的时光,于是,下载搜狐读书网上连载小说的绝世代码就横空出世了:- @echo off
- :: 建立小说目录
- md 《退膛》 2>nul
- cd /d 《退膛》 2>nul
- :: 下载目录页
- title 正在下载目录页
- curl -o index.html http://lz.book.sohu.com/serialize-id-15582.html
- :: 下载文字部分所在的网页文件
- for /f "delims=><= tokens=5,6" %%i in ('findstr /i "《退膛》.*([1-9].*)" index.html') do (
- title 正在下载网页 http://lz.book.sohu.com/%%~i
- curl --create-dirs -o html\%%~nxi http://lz.book.sohu.com/%%~i
- )
- :: 转换网页文件为txt
- cls
- title 转换文件格式
- echo 正在转换网页文件为txt文档
- HtoX32c /IP /O0 html\*.html
- md txt 2>nul
- move html\*.txt txt\>nul
- cls
- echo 正在合并章节,请稍候...
- cd.>《退膛》.txt
- for %%i in (txt\*.txt) do (
- title 正在整理 %%~nxi
- echo.>>《退膛》.txt
- findstr /ib "《退膛》" %%i>>《退膛》.txt
- echo.>>《退膛》.txt
- findstr /ibc:" " %%i>>《退膛》.txt
- )
- title 处理完毕
- cls
- echo.&echo 已经处理完毕,整理后的文章保存在 "%cd%\《退膛》.txt" 中
- echo.
- 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(带中文帮助信息) |
|