掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 4161|回复: 10

[教程] linux下制作离线百度百科的思路(含成品)

[复制链接]

该用户从未签到

发表于 2012-5-23 20:18:42 | 显示全部楼层 |阅读模式
本帖最后由 惟吾无为 于 2012-6-11 07:37 编辑
$ q; h) d2 u1 }5 k, a2 c+ }$ n& q+ p- q! j% K
成品问世: https://pdawiki.com/forum/thread-9349-1-1.html; H' \( Q7 K8 c# f. Q
离线 百度 百科 百度百科 纯文本 百度百科纯文本 百度百科2012纯文本 百度百科2012 离线百度百科 离线百度百科2012 百度百科2012下载 百度百科纯文本下载 百度百科下载 百度百科纯文本离线 百度百科离线
  |7 T+ @9 K, ]7 }0 D0 @' G
3 w! D, U: e) ~5 m-------------------------. u* u, J9 }) G$ B7 E6 ^2 ~: N

. Q8 h5 z% q$ w- j' {: m$ X( n* S$ D" Y: [+ V' @  M: o
首先说明, 我只是给想做的人指一个方向, 我不会参与制作.
因为我不需要.
- B, h3 B. `3 F, G! H其次, 你需要学习linux知识, 因为我不会windows, 我在windows下用cygwin来使用linux命令.# }& G* f5 z" W4 b/ a
学习一个新事物是有难度的, 尤其是从图形界面转向命令行, 从windows转向linux, 所以毅力很重要.
/ d5 K6 @% Z$ v, O' I2 N4 ?如果你没有足够的理由去掌握这门新知识, 建议不要去学linux. 因为你没必要花那么多精力., M5 J: C7 N4 T$ ], I
记住, 会google很重要. 看完教程也很重要.; W, Z" L3 \3 g; w& L* K* d- t
一直有人想制作离线的百度百科, 可惜工程量太大. 最终不了了之.: ]: j. Q# Z1 _: z7 v! D  @
! ~' v2 E! ?0 c+ x! J$ y% S
我提供一个思路. 自认为会轻松些. 在linux下处理效率最高. windows(使用cygwin模拟linux)下效率不高. : n$ S( b# I% ?3 X+ B/ `

& T1 ]( N: U% o; v5 B% ~& ^/ h2 Q方法分为两大步: 下载和处理.  ( _" J  \+ j/ u+ S7 d$ h: S9 ?

$ T( d2 v) @4 q下载使用wget, 一个强大高效且轻巧的下载工具, linux默认安装. cygwin需要自己安装.
! n, ]# Z' L6 _! |, S; m8 q- m百度百科的链接为递增的数字. 所以免去解析链接的麻烦. # ]( P  q# F9 ?' _! E" f- n
3 C0 r; K( i- c* v3 @8 s
这里以1000个页面为一个处理单位.8 z3 X% o* c$ J. H

% H, F% W- y0 C9 N1.1 生成供wget使用的url列表. * X" j$ \: i7 B- A0 G0 h$ N  H- o) B
使用列表文件的话, 效率会高很多. 如果wget每次只下一个文件, 则会频繁fork进程及建立链接. 无法达到最佳效率.0 `; k! e3 ]% F
以每1000个文件为一个单位进行下载, 如果内存足够, 可以设置大些, 因为下载的内容都会保存在内存.
% i0 k" ~, h! g3 G这是bash脚本. wget.lst为我自定义的url列表文件.
  1. 6 ]( u$ v: G9 G$ O' h' x2 u' \
  2. for i in {1..999}
    8 ?" Y4 P; c! f# {( ]8 E3 M
  3. do
    $ {3 u: c5 t; ~8 u8 H6 |; E
  4.   echo "http://baike.baidu.com/view/$i.htm"0 E+ |% [) A. f( R; i2 c
  5. done > wget.lst
    & B/ w" l, r" |. Q, m! y+ ]( W
复制代码
1.2 wget下载.; H. z' K4 q6 P& j0 ~" @
如果在linux下, 推荐先进入/dev/shm目录. 或者加上-P /dev/shm来指定目录前缀.
+ r+ H% p1 P$ j& v* ^0 A. }这样所有内容就会保存在内存, 读写速度很很快. 再说也是临时文件, 处理完后就可以丢弃的. 节省速度的同时也保护了硬盘.
& G. n$ }4 N4 J1 R+ ?% {& |cygwin无法做到. 所以效率因此而低.& r6 q$ g9 n0 d$ {( U7 M
保存在当前目录下的view目录里. 会自动创建view目录, 当然你也可以自定义.+ w, l/ b2 k* P$ A2 j! M0 k1 i# g
# -i url列表 -o 日志文件 -w 下载间隔 --random-wait 0.5~1.5倍随机下载间隔 -x 强制创建目录 -nH 不创建主机名目录
  1. wget -c -i wget.lst -o wget.log -w 0.5 --random-wait -x -nH
复制代码
我测试了下. 673个文件占用了32.4M硬盘空间. 时间18:36-18:54, 4M网速, 但是另一个wget正在下东西, 所以速度可能慢了点.
) c6 s1 w5 R- X- Q% u  ^/ p在每一个单位的页面下载完成后. 就可以处理了.* P3 }- T2 k" z2 H

; w# J8 g5 |9 i% G; _, I* ]至于怎么处理, 就是看你怎么想了, 你可以只提取出正文, 把正文留待日后处理.
: y' R  G7 @' n' N或者直接一次处理完, 输出纯文本, 或者重新排版的html, 或者直接输出原来的正文.
; Q: }% b! S! B  d( `& l记得处理下那些不存在的页面.
1 X8 ]  o7 @2 p& @/ I+ B; ~
  K5 R+ u& d& ?9 D/ m, a) Y如果你想便于更新的话, 可以计算文件的md5值及文件字节数(或许只靠这个就行了). 日后对比文件大小或md5值来决定是否需要处理.
7 @, E- e1 X. @% y' l如果要做md5sum表, 强烈建议使用linux. 因为读内存里的文件会很快. 尤其文件多的时候.( p8 |5 @: @+ F& X" X
如果只记录大小的话, wget有个--spider选项很好, 只获取文件信息, 而不下载文件, 把输出的日志在本地解析, 只下载大小改变的文件, 很方便.
3 C/ |6 Z+ o9 E, O! W2 O0 x
% ^: J' Y  }. {! @6 b5 M& E* g( e
推荐使用awk处理, sed也行, 但会难学些. 其实bash也行, 不过太慢了.
( T+ V4 D% ^5 e# S5 s 这个一时半会也讲不完, 所以不讲了, 有兴趣的可以使用google搜索相关的教程." o3 N5 q, w' P$ S. {. ?0 l
, `/ j" @% t( s4 }7 D
推荐把处理后的结果也先放在/dev/shm里的某个目录, 处理完毕后, 把目录打包压缩再写入硬盘. 速度会快些.
# y5 V# i& v/ D此时可以删除之前下载的页面了, 重新下载下一个单位的页面.$ e# H; F+ p7 q& [( c6 G& W

" e- T" e7 z& u, T) y最后, 希望那些经常进行文本处理的人能够了解下linux, 一旦掌握, 你可以省去很多查找替换的时间.
. l# p5 I6 j3 m2 q' y' u  M别以为命令行很可怕, 体会到她的简洁高效之后, 你会无法自拔. 我很庆幸我会linux. 也希望你也会linux.9 t0 a/ t2 W( [: P& j# t
6月份我就会把主机系统换成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的内容.
+ Q- E, h  ~6 E3 ?% G0 o  a
# P  q6 ~# a; O8 b1 P) Y+ I至于linux的教程, 你只需要知道google知道那些东西的位置即可. & p. u' s0 f# Z  Z4 O- Y
至于学习过程遇到的问题,  你只需要知道google知道答案即可.
) ^- z8 a6 ]# \, e" D8 ~$ L学习bash, 推荐abs, 中文版3.9.1, 学习awk, 推荐sed和awk第三版. 最后找本命令大全吧, 经常看看, 了解下各命令的作用. 有事半功倍之效. grep是找文件内容的, 用的巧也是个不错的文本处理工具.1 ~- c. g; W; `( B2 P* k: |, r
iconv转换文本编码. linux默认使用utf-8, windows使用cp936.
0 u8 ^8 A3 o  H9 {  A+ C' g$ g二者换行符也不同, 使用dos2unix命令处理.
' k! R; b  O  S. a最后再废话一遍, 先看下命令大全. 大概了解下各命令的用途.

评分

1

查看全部评分

  • TA的每日心情
    慵懒
    2020-12-11 08:19
  • 签到天数: 104 天

    [LV.6]常住居民II

    发表于 2012-5-24 09:24:31 | 显示全部楼层
    期待达人响应!

    该用户从未签到

    发表于 2012-5-24 12:44:36 | 显示全部楼层
    非常好,离线版还是十分需要的,为鼓励,可考虑设置捐助,比如淘宝付费。

    该用户从未签到

     楼主| 发表于 2012-5-31 09:03:29 | 显示全部楼层
    https://pdawiki.com/forum/viewthread.php?tid=9288&highlight=! N9 S$ y+ I5 [
    自己接手
  • TA的每日心情
    难过
    2020-2-27 01:04
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2012-8-22 15:05:14 | 显示全部楼层
    谢谢分享经验。

    该用户从未签到

    发表于 2012-9-1 11:30:36 | 显示全部楼层
    好好学习一下...

    该用户从未签到

    发表于 2012-11-2 22:24:01 | 显示全部楼层
    这是wget的胜利,用windows的就只会用xunlei
    $ h1 i/ l, g; B2 C3 C1 h, D其实aric2c 也很厉害,不过循环下载网页还是wget

    该用户从未签到

     楼主| 发表于 2012-11-3 12:51:09 | 显示全部楼层
    7# liuyangzys
    4 p4 f) a9 U+ Y. |
    5 h$ X/ X6 q& H- I! r' [& n# ?& `
    还有awk的胜利。6 N+ T# x* J! F. f5 U
    总之是linux的胜利。

    该用户从未签到

    发表于 2013-2-6 06:05:19 | 显示全部楼层
    高手

    该用户从未签到

    发表于 2013-6-11 14:02:50 | 显示全部楼层
    希望支持linux!

    该用户从未签到

    发表于 2013-6-26 22:21:48 | 显示全部楼层
    楼主高手,能否不辞劳苦,再来一次更新?!
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2025-4-28 23:59 , Processed in 0.032120 second(s), 27 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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