标题: [原创] 抓取搜狐读书网上的txt小说——以整理《退膛》为例 [打印本页]
作者: namejm 时间: 2010-2-6 16:17 标题: 抓取搜狐读书网上的txt小说——以整理《退膛》为例
抓取网页上的小说整理成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大小是门户网站,每天的访问量以百万计,溺水三千,我只取一瓢饮,以小生区区一个批处理,弄点小流量的下载,还不至于让它们倒下吧,再不济,它们也得撑上个十年八年吧,因为“我真的还想再活五百年”啊。希望大家看过这篇文章后,能把以上代码用于资料的正常获取中,而不要去恶意连接这些站点,特别是那些规模不大的站点,当大家都无书可看之时再捶胸顿足可就悔之晚矣。
附注:
————————————————————————————————————
正文中提到的第三方命令行工具可以在这篇汇总贴里找到:
批处理第三方命令行工具单行本汇总:http://bbs.bathome.net/thread-3981-1-1.html
1、Curl.exe:http://bbs.bathome.net/thread-1761-1-1.html
2、HtoX32c.exe:http://bbs.bathome.net/thread-1974-1-1.html
作者: batman 时间: 2010-2-6 16:57
&&牛人是怎样练成的?就是这样练成的!在工作生活中遇到问题第一感觉就是用批来解决,然后不断地遇到新
问题再解决问题,自己也就不断得到了磨练和提高,长此以往坚持不懈,牛人就横空出世了。。。
jm以极其生动的文字向大家详细描述了编写下载搜狐读书网上连载小说绝世代码的过程,其中涉及到了第
三方工具的使用以及findstr正则的运用,全文洋洋洒洒上千字,奉献了一篇珍贵的技术贴。所以希望大家不但
要认真学习贴中的技术和技巧,更重要的是学习jm处理问题的敏锐思路以及诲人不倦的优秀思想。
作者: 随风 时间: 2010-2-6 17:29
感觉更吸引眼球的是jm的文采,赞!
作者: zjw767676 时间: 2010-2-6 20:27
记事本打开index.html,寻找各章节链接的规律——不要问我查看网页文件为什么不用网页元素分析器、Dreamweaver、IDE之类的重武器,杀鸡焉用牛刀?很多时候,我们应当学会用简陋的武器做出不平凡的成绩来,在这里,记事本已经足够了,就像看pdf,我只选择FoxitReader而不会去安装笨重的AdobeReader。
一个字“经典”!!
作者: asnahu 时间: 2010-2-7 00:40
感谢JM的分享,网页分析的话FIREFOX+FIREBUG,推荐使用!分享本人一段代码:
-
- wget http://lz.book.sohu.com/serialize-id-15582.html -O - | sed "/《退膛》.*([1-9].*)/!d; s/.*f=\x22//g; s/\x22.*//g; s/^/http:\/\/lz\.book\.sohu\.com\/&/g" | wget -i -
复制代码
作者: mvm 时间: 2010-2-8 19:13
楼主你让我打开眼界了~~~~程序太帅了,代码太美了~
作者: ccr438758900 时间: 2010-2-8 22:45
楼主的功力真是深不可测啊!
作者: gdmm 时间: 2010-2-18 17:14
这个很好用,可惜就是抓取下来合并后的文本内容没有了章节
就是没有了网页上所有的第一章、第二章、之类
不知楼主能否修改下或说明下要如何修改
谢谢了
作者: killo 时间: 2011-7-2 10:22
这类问题解决的很好
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |