标题: [网络工具] 批处理整理读览天下网站中部分杂志的精选文章 [打印本页]
作者: namejm 时间: 2011-5-7 16:05 标题: 批处理整理读览天下网站中部分杂志的精选文章
最近用批处理抓取/整理网络数据成瘾,应网友的请求,写了个整理读览天下(http://www.dooland.com)网站中部分杂志精选文章的代码,在本人机器上跑了几天,测试后较为满意,发出来与大家一起分享。至于txt文本的用途,大家自行发掘,不在本文的讨论范畴。
与写教程相比,写代码是件比较惬意的事情。
写代码,我可以天马行空胡思乱想,不求他人看得懂,惟愿功能可实现。写教程,还得考虑广大受众的技术水平:写简洁了,老鸟们会连声叫好,小鸟们会不知所云;写详细了,老鸟们就觉得长不可耐,小鸟们可能会觉得正中下怀,但也不见得就能解决了所有的疑惑。对我而言,写短了,任务轻松,但会觉得有点失败,因为肯定有大部分人看不懂;写长了,还得费尽心思在何处尽力着墨,在何处可以大大俭省,还得考虑语言通俗易懂、生动有趣……无论是长是短,都会有人痛不欲生。
我非地藏菩萨,没有“我不入地狱谁入地狱”的大无畏精神,只能“牺牲大多数,幸福我一人”,在此处只能简要地提一提这段代码的前世今生了。
最开始,该网友想下载所有杂志的文字版本。
进网站四处指指戳戳,折腾了一圈,发现每种杂志都提供了图片预览,但并不是所有的杂志都提供文字版本,只有为数不多的杂志才有“精选文章”——即使是文字版,也不是全部的文字,而是经过了“精选”的;即使提供了“精选文章”的杂志,也不是都可以用本文所提到的代码来下载,需要做一些微调方可,比如《意林》杂志。
既然不能抓取全部的文字版,那退而求其次,就抓“精选文章”吧。
理想中的状态是:在某个地方,找到所有提供了“精选文章”的杂志名列表网址,然后顺藤摸瓜,进入每一本杂志的历年列表网址中,从每一期的“精选文章”中抓取具体文章的网页文件,最后,对这些网页文件做去除html代码、提取文章正文内容等一系列处理,得到“精选文章”文字版。
所有操作的关键,就是要找到各种网页的真实下载地址。
那就开始摸索吧。
首先,要寻找有哪些杂志提供了“精选文章”。
这是个体力活,没有任何技巧可言,能否找全,不需要人品,也不需要智商,只需要耐心,一个一个地点开来看吧。要担心找漏或找重复了,就在网站首页的左侧,找到“杂志分类”,一个类别一个类别地点开来找吧。想当初,我花了两晚上,终于把提供“精选文章”的杂志找全了,度过了一个因枯燥乏味而令人难以忘怀的5.1劳动节。如果你不想再次重复这个乏味的过程,那就直接使用我整理出来的杂志列表吧。一个额外的收获是:这个网站的分类真的不咋地,有的重复了,有的分错了——您说“计算机世界”是不是应该划到“教育科技”下的“计算机”分类里去?但是这个网站它偏不,它就有胆量给划到“商业财经”的“互联网”中去,对我这种出于职业习惯而喜欢对万事万物进行分类的人而言,这是个令人无法容忍的错误,不过希望大家见了之后置之一笑即可,我可不希望大家都像我这样是个偏执狂^_^。
其次,对提供了“精选文章”的杂志,需要列举每一期的网址。
以《三联生活周刊》为例。在读览天下网站首页右上角处,搜索框中搜索“三联”字样,在候选框中选择“三联生活周刊”,点搜索按钮,来到《三联生活周刊》历年各期列表页面,网址为:http://lifeweeker.dooland.com。这个列表有两个页面,点“下一页”按钮,来到第二页,注意观察地址栏里网址的变化,已经变为:http://lifeweeker.dooland.com/index.php?p=2&id=7990。点“前一页”按钮返回第一页,网址已经变为:http://lifeweeker.dooland.com/index.php?p=1&id=7990。稍作比较,很快就会发现页码和网址的对应关系:“index.php?p=”后及“&”之前的数字就是页码号码。如果把网址栏中网址的“&id=7990”去掉,再按回车,当前页面不会发生任何变化。由此可以推知,这个id号应当是这个杂志在网站数据库中的流水编号,在网址中是否有它都不会影响网页查询结果。而到了最后一页,网页中不再出现“下一也”按钮。换成其他的杂志来测试,可以证明上述推测是正确的。
既然是这样,那么,如果我们把这些杂志的首页地址整理出来了,要找到该杂志所有期别的下载链接,当手到擒来。
那就用代码来验证一下以上的推测过程吧。
1.下载《三联生活周刊》各期网址链接页面的首页:- wget -O 1.html "http://lifeweeker.dooland.com/index.php?p=1"
复制代码
2.检测当前下载的页面是不是最后一页;如果不是最后一页,则继续下载下一页:- :loop
- set /a page+=1
- findstr /i "index\.php\?p=.*下一页" %page%.html >nul&&(
- wget -O %page%.html "http://lifeweeker.dooland.com/index.php?p=%page%"
- goto loop
- )
复制代码
期待中的第2页网页文件2.html并没有出现。
赶紧排查,原来下载回来的html文件是utf-8编码,而findstr无法读取,需要把html文件转为ASCII编码才行。
找来白杨大侠写的文件编码转换工具wfr.exe,修改一下代码:- :loop
- set /a page+=1
- wfr %page%.html /any /force /encin:utf-8 /encout:gbk>nul
- findstr /i "index\.php\?p=.*下一页" %page%.html >nul&&(
- wget -O %page%.html "http://lifeweeker.dooland.com/index.php?p=%page%"
- goto loop
- )
复制代码
从头到尾把这本杂志各期列表网页都下载回来了。
分析这些网页,找到各期的具体网址(以1.html里的链接为例):- setlocal enabledelayedexpansion
- for /f "tokens=3,6 delims== " %%i in ('findstr /ib "<a.href=.http:\/\/www\.dooland\.com\/magazine.*三联生活周刊" 1.html') do (
- set issue="%%k
- set "issue=!issue:~1,-1!"
- md html\!issue! 2>nul
- wget -nv -O html\!issue!\%%~ni %%i
- )
复制代码
每一期都会在html文件夹下建立以当前期别为名的文件夹,里面存放一个无后缀名的文本格式的文件,比如《三联生活周刊》11年第18期,它的存放路径是:html\11年第18期\21422——实际上,21422是一个html网页文件,只是保存的时候没有给它添加后缀名,以便和后来下载回来的文章网页文件区分开来。
代码验证完毕,接下来就得下载具体文章了。
从每一期的文章目录页中读取文章的具体链接下载之(以上一例的21422文件为例):- for /f "tokens=3 delims== " %%i in ('findstr /ib "<h2>.*article_.*title" html\11年第18期\21422') do (
- wget -nv -O html\11年第18期\%%~ni.html "http://www.dooland.com/magazine/%%~i"
- )
复制代码
下载回来的文件都保存在“html\11年第18期”下,文件名形如article_127096.html、article_127097.html。
先把网页文件中的html代码都剔除掉,转换为txt文本,并继续用wfr.exe来改变文件的编码:- htox32c /IP /O0 html\11年第18期\*.html
- wfr html\11年第18期\*.txt /any /force /encin:utf-8 /encout:gbk
复制代码
经过html→txt、utf-8→gbk的转换之后,正文内容方可被正确提取出来(关键中的关键:文章标题含有“TITLE : ”字样,正文内容都以两个全角的空格打头):- md txt 2>nul
- (for %%i in (html\11年第18期\*.txt) do (
- (
- for /f "delims=: tokens=2*" %%j in ('findstr /ic:"TITLE : 三联生活周刊:" %%i') do (
- echo %%k&echo.
- )
- findstr /ib " " %%i
- echo.)
- ))>txt\11年第18期.txt
复制代码
回头梳理一下完整的整理流程:
1.整理一份配置表,里面包含杂志名和历年各期列表网址的首页;比如“三联生活周刊 http://lifeweeker.dooland.com/index.php”
2.下载上一步整理出来的首页文件,保存为无后缀名的文件1;
3.根据文件1中是否含有“下一页”按钮,来决定是否下载后一页,直至所有的页面都下载完毕;这些页面文件,我们暂且称之为:索引页。
4.根据索引页中的链接,提取出该杂志每一期的期别名和具体网址,并下载这一期别的首页,我们暂且将这样的网页文件称之为为:目录页。
5.从目录页中,提取出每一篇“精选文章”的下载链接,并下载它们的网页文件;
6.把“精选文章”的网页文件经过html→txt和utf-8→gbk的转换之后,提取出正文内容,保存到txt文件夹下,并以该期别名命名这个txt文件。
作者: namejm 时间: 2011-5-7 16:05
完整代码(需配合附件里的内容方可使用,请看文末的注意事项)复制代码
配置文件内容示例(为了配合以上代码,配置文件必须放入指定目录下,请下载附件使用):
注意事项:
1.本代码需要wget.exe、wfr.exe和HtoX32c.exe的支持:wget下载网页、wfr对文件编码进行转换、HtoX32c转html为txt;附件已经包含所需的全部文件;
2.配置文件必须严格按照其中的说明进行整理,修改配置文件的路径必须在代码中做相应的更改;
3.读览天下网站中的“精选文章”,无需账号密码也可下载完整内容——当某天这条不成立的时候,配合账号密码才能使用本代码。
4.本文仅谈思路和原理,与读览天下网站类似的网站都可以用这个思路和原理来抓取文本。本人精力有限,不能针对众多网站一一编写代码,请自行修改代码来适应那些类似的网站。
分类下载读览天下的精选文章.rar
http://pan.baidu.com/share/link?shareid=4087843025&uk=1124163200
作者: qq3475534 时间: 2011-5-7 16:30
这么强大。。。。
作者: ▄︻┻═┳一 时间: 2011-5-7 19:26
下下来的网页文章 仅显示部分,能看到完整版的就好了。
作者: hfg1977 时间: 2011-5-7 22:23
版主真是YIN荡呀....
作者: namejm 时间: 2011-5-7 23:44
下下来的网页文章 仅显示部分,能看到完整版的就好了。
▄︻┻═┳一 发表于 2011-5-7 19:26
实际上
正文内容是完整的
不过在网页浏览器里查看的时候被css代码强制隐藏起来了
你查看网页源文件就知道了
这也是本代码不需要账号密码就可以整理出全文的秘密
作者: asnahu 时间: 2011-5-8 20:35
namejm这样会教坏小朋友的
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |