|
本帖最后由 惟吾无为 于 2012-6-11 07:37 编辑
; X$ K! T1 b( P+ H; q* G6 G$ h; T. g& Q: e9 {7 w! d4 k( x7 _' f
成品问世: https://pdawiki.com/forum/thread-9349-1-1.html5 n! b* k- E. w1 }" ?2 |: @
离线 百度 百科 百度百科 纯文本 百度百科纯文本 百度百科2012纯文本 百度百科2012 离线百度百科 离线百度百科2012 百度百科2012下载 百度百科纯文本下载 百度百科下载 百度百科纯文本离线 百度百科离线5 {; ^2 x5 C7 l: U! L
* q' h. |3 W5 Y-------------------------! X; v" T2 R4 }7 F; s& k" d
: r: N' B* X6 Y* d% g; N3 G! l- u6 L; U( O
首先说明, 我只是给想做的人指一个方向, 我不会参与制作. 因为我不需要.( S4 ^. P% ]/ r
其次, 你需要学习linux知识, 因为我不会windows, 我在windows下用cygwin来使用linux命令.
: T( z r; l3 c+ M1 S$ D7 S学习一个新事物是有难度的, 尤其是从图形界面转向命令行, 从windows转向linux, 所以毅力很重要.
, S; V. J. b) Z* F* y7 e如果你没有足够的理由去掌握这门新知识, 建议不要去学linux. 因为你没必要花那么多精力.
/ H1 V$ J5 f: n) {) s/ l' E O记住, 会google很重要. 看完教程也很重要.$ y6 m$ L" }! A }
一直有人想制作离线的百度百科, 可惜工程量太大. 最终不了了之.5 T( H& p+ {3 X: M2 E
/ E: K* C6 e+ @
我提供一个思路. 自认为会轻松些. 在linux下处理效率最高. windows(使用cygwin模拟linux)下效率不高. ! s1 }: p- c7 o5 d" D
) k# R6 Y' n+ @8 p. {: r
方法分为两大步: 下载和处理.
# }; w3 x# |" f' l1 i, F4 g7 \2 R. \4 d5 h3 i: z8 a
下载使用wget, 一个强大高效且轻巧的下载工具, linux默认安装. cygwin需要自己安装.
g) O# N' d y百度百科的链接为递增的数字. 所以免去解析链接的麻烦. 0 |# Q- n6 X# S# Z
+ v7 s `8 I/ h+ P {: W这里以1000个页面为一个处理单位.8 C* ~! ?3 |8 L: [6 _
5 n: i3 x) u# \( ?- b k1.1 生成供wget使用的url列表.
; ^* N' N# t- A' F0 X" a使用列表文件的话, 效率会高很多. 如果wget每次只下一个文件, 则会频繁fork进程及建立链接. 无法达到最佳效率.
5 D5 o+ x! f" \8 u# |+ m以每1000个文件为一个单位进行下载, 如果内存足够, 可以设置大些, 因为下载的内容都会保存在内存. $ [' }2 ^. u6 \ J6 Q
这是bash脚本. wget.lst为我自定义的url列表文件.- 7 H' f( ]+ p5 @3 H3 w- Z6 i
- for i in {1..999}- p2 O7 q. b3 K- A
- do$ L' }" z0 Y8 }
- echo "http://baike.baidu.com/view/$i.htm"
9 v% O+ V9 `8 M+ @7 x- _; n - done > wget.lst& M4 S' U- ^- E( Z3 T) `
复制代码 1.2 wget下载.
C& L7 W/ g8 [8 r; f" G. S; ^5 e如果在linux下, 推荐先进入/dev/shm目录. 或者加上-P /dev/shm来指定目录前缀.
2 c" t+ j4 z, L+ K* \* M- T这样所有内容就会保存在内存, 读写速度很很快. 再说也是临时文件, 处理完后就可以丢弃的. 节省速度的同时也保护了硬盘.& ~$ n2 T4 U$ ]2 ]% {
cygwin无法做到. 所以效率因此而低.
' P2 ]7 q2 Q! n; |) P: m3 h保存在当前目录下的view目录里. 会自动创建view目录, 当然你也可以自定义.
9 t6 v7 k- S9 E7 O# -i url列表 -o 日志文件 -w 下载间隔 --random-wait 0.5~1.5倍随机下载间隔 -x 强制创建目录 -nH 不创建主机名目录- wget -c -i wget.lst -o wget.log -w 0.5 --random-wait -x -nH
复制代码 我测试了下. 673个文件占用了32.4M硬盘空间. 时间18:36-18:54, 4M网速, 但是另一个wget正在下东西, 所以速度可能慢了点.1 m0 f1 w1 J% _$ ?0 d
在每一个单位的页面下载完成后. 就可以处理了.
! I; c8 ]% s/ J% C$ d; S0 e: b
' o- `' O, X5 q, H3 ]至于怎么处理, 就是看你怎么想了, 你可以只提取出正文, 把正文留待日后处理.
" p% f \& ^7 r5 ~0 J8 ^) w3 f或者直接一次处理完, 输出纯文本, 或者重新排版的html, 或者直接输出原来的正文.' ~. T; _. Z3 I
记得处理下那些不存在的页面.
% ^) c1 E( ?% Z2 H9 V8 o; p: T2 x- \6 ?2 u# ?
如果你想便于更新的话, 可以计算文件的md5值及文件字节数(或许只靠这个就行了). 日后对比文件大小或md5值来决定是否需要处理.
% p& O+ F5 }& w% a9 T如果要做md5sum表, 强烈建议使用linux. 因为读内存里的文件会很快. 尤其文件多的时候.
" i, k2 j- p. H' U" ]如果只记录大小的话, wget有个--spider选项很好, 只获取文件信息, 而不下载文件, 把输出的日志在本地解析, 只下载大小改变的文件, 很方便.
3 N2 Y5 R* l' l7 Y$ |& S. ^ q( F/ Y8 C: y [5 a
: I5 W; ]$ t- m! T% r推荐使用awk处理, sed也行, 但会难学些. 其实bash也行, 不过太慢了.
1 m' c- t# n g' f- j 这个一时半会也讲不完, 所以不讲了, 有兴趣的可以使用google搜索相关的教程.4 X2 K! J% W8 l) w( ^1 F
) ~& M) C) l% ]) h推荐把处理后的结果也先放在/dev/shm里的某个目录, 处理完毕后, 把目录打包压缩再写入硬盘. 速度会快些., X& n+ ?) s) z8 p0 f7 q2 {$ W
此时可以删除之前下载的页面了, 重新下载下一个单位的页面.3 V5 w# Y+ f) U1 Q0 `1 p
* G m' X7 i) P0 f7 t
最后, 希望那些经常进行文本处理的人能够了解下linux, 一旦掌握, 你可以省去很多查找替换的时间.8 t4 o% J) M$ X2 c6 Y( v( S
别以为命令行很可怕, 体会到她的简洁高效之后, 你会无法自拔. 我很庆幸我会linux. 也希望你也会linux.
" l- J! f0 H% }0 k; G0 q6月份我就会把主机系统换成linux(ubuntu 12.04), 目前是xp+ubuntu 10.04. 另一个wget下载的就是ubuntu 12.04的软件包. 由于电信的校园E信必须在windows下使用, 加之其他原因, 我决定断网. 所以着手制作本地源. 估计明天或后天就能全部下载完了. 从上周日下午开始. 目前已经下载了超过20,000个文件. 大约13.3+1.2+3.4+0.1+15.0G的内容, 还剩下1.5万个文件, 估计12G的内容.$ i( m' Y5 q6 T) l# V( |
1 T7 \. k @' S- ~: l: P至于linux的教程, 你只需要知道google知道那些东西的位置即可. 2 W p. E% E5 R. \- f, w3 j
至于学习过程遇到的问题, 你只需要知道google知道答案即可. 1 a6 Y( s- u, Y8 w: a. n- H
学习bash, 推荐abs, 中文版3.9.1, 学习awk, 推荐sed和awk第三版. 最后找本命令大全吧, 经常看看, 了解下各命令的作用. 有事半功倍之效. grep是找文件内容的, 用的巧也是个不错的文本处理工具.
) G: N( y: y& w7 r# u2 c! a' diconv转换文本编码. linux默认使用utf-8, windows使用cp936.
" [1 E: a) o& W二者换行符也不同, 使用dos2unix命令处理.4 a: q6 @7 d' R, n- y E
最后再废话一遍, 先看下命令大全. 大概了解下各命令的用途. |
评分
-
1
查看全部评分
-
|