查看: 3384|回复: 10
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

13

主题

454

回帖

3027

积分

贡士

Rank: 6Rank: 6

积分
3027

灌水大神章

跳转到指定楼层
1
发表于 2012-5-23 20:18:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 惟吾无为 于 2012-6-11 07:37 编辑

成品问世: https://pdawiki.com/forum/thread-9349-1-1.html
离线 百度 百科 百度百科 纯文本 百度百科纯文本 百度百科2012纯文本 百度百科2012 离线百度百科 离线百度百科2012 百度百科2012下载 百度百科纯文本下载 百度百科下载 百度百科纯文本离线 百度百科离线

-------------------------


首先说明, 我只是给想做的人指一个方向, 我不会参与制作.
因为我不需要.
其次, 你需要学习linux知识, 因为我不会windows, 我在windows下用cygwin来使用linux命令.
学习一个新事物是有难度的, 尤其是从图形界面转向命令行, 从windows转向linux, 所以毅力很重要.
如果你没有足够的理由去掌握这门新知识, 建议不要去学linux. 因为你没必要花那么多精力.
记住, 会google很重要. 看完教程也很重要.
一直有人想制作离线的百度百科, 可惜工程量太大. 最终不了了之.

我提供一个思路. 自认为会轻松些. 在linux下处理效率最高. windows(使用cygwin模拟linux)下效率不高.

方法分为两大步: 下载和处理.  

下载使用wget, 一个强大高效且轻巧的下载工具, linux默认安装. cygwin需要自己安装.
百度百科的链接为递增的数字. 所以免去解析链接的麻烦.

这里以1000个页面为一个处理单位.

1.1 生成供wget使用的url列表.
使用列表文件的话, 效率会高很多. 如果wget每次只下一个文件, 则会频繁fork进程及建立链接. 无法达到最佳效率.
以每1000个文件为一个单位进行下载, 如果内存足够, 可以设置大些, 因为下载的内容都会保存在内存.
这是bash脚本. wget.lst为我自定义的url列表文件.

  1. for i in {1..999}
  2. do
  3.   echo "http://baike.baidu.com/view/$i.htm"
  4. done > wget.lst
复制代码
1.2 wget下载.
如果在linux下, 推荐先进入/dev/shm目录. 或者加上-P /dev/shm来指定目录前缀.
这样所有内容就会保存在内存, 读写速度很很快. 再说也是临时文件, 处理完后就可以丢弃的. 节省速度的同时也保护了硬盘.
cygwin无法做到. 所以效率因此而低.
保存在当前目录下的view目录里. 会自动创建view目录, 当然你也可以自定义.
# -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正在下东西, 所以速度可能慢了点.
在每一个单位的页面下载完成后. 就可以处理了.

至于怎么处理, 就是看你怎么想了, 你可以只提取出正文, 把正文留待日后处理.
或者直接一次处理完, 输出纯文本, 或者重新排版的html, 或者直接输出原来的正文.
记得处理下那些不存在的页面.

如果你想便于更新的话, 可以计算文件的md5值及文件字节数(或许只靠这个就行了). 日后对比文件大小或md5值来决定是否需要处理.
如果要做md5sum表, 强烈建议使用linux. 因为读内存里的文件会很快. 尤其文件多的时候.
如果只记录大小的话, wget有个--spider选项很好, 只获取文件信息, 而不下载文件, 把输出的日志在本地解析, 只下载大小改变的文件, 很方便.


推荐使用awk处理, sed也行, 但会难学些. 其实bash也行, 不过太慢了.
这个一时半会也讲不完, 所以不讲了, 有兴趣的可以使用google搜索相关的教程.

推荐把处理后的结果也先放在/dev/shm里的某个目录, 处理完毕后, 把目录打包压缩再写入硬盘. 速度会快些.
此时可以删除之前下载的页面了, 重新下载下一个单位的页面.

最后, 希望那些经常进行文本处理的人能够了解下linux, 一旦掌握, 你可以省去很多查找替换的时间.
别以为命令行很可怕, 体会到她的简洁高效之后, 你会无法自拔. 我很庆幸我会linux. 也希望你也会linux.
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的内容.

至于linux的教程, 你只需要知道google知道那些东西的位置即可.
至于学习过程遇到的问题,  你只需要知道google知道答案即可.
学习bash, 推荐abs, 中文版3.9.1, 学习awk, 推荐sed和awk第三版. 最后找本命令大全吧, 经常看看, 了解下各命令的作用. 有事半功倍之效. grep是找文件内容的, 用的巧也是个不错的文本处理工具.
iconv转换文本编码. linux默认使用utf-8, windows使用cp936.
二者换行符也不同, 使用dos2unix命令处理.
最后再废话一遍, 先看下命令大全. 大概了解下各命令的用途.

评分

1

查看全部评分

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

    [LV.6]常住居民II

    30

    主题

    2044

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    11260

    灌水大神章小蜜蜂章笑傲江湖章

    2
    发表于 2012-5-24 09:24:31 | 只看该作者
    期待达人响应!

    该用户从未签到

    47

    主题

    360

    回帖

    831

    积分

    举人

    Rank: 4

    积分
    831
    3
    发表于 2012-5-24 12:44:36 | 只看该作者
    非常好,离线版还是十分需要的,为鼓励,可考虑设置捐助,比如淘宝付费。

    该用户从未签到

    13

    主题

    454

    回帖

    3027

    积分

    贡士

    Rank: 6Rank: 6

    积分
    3027

    灌水大神章

    4
     楼主| 发表于 2012-5-31 09:03:29 | 只看该作者
    https://pdawiki.com/forum/viewthread.php?tid=9288&highlight=
    自己接手
  • TA的每日心情
    难过
    2020-2-27 01:04
  • 签到天数: 1 天

    [LV.1]初来乍到

    6

    主题

    43

    回帖

    188

    积分

    童生

    Rank: 2

    积分
    188

    灌水大神章

    5
    发表于 2012-8-22 15:05:14 | 只看该作者
    谢谢分享经验。

    该用户从未签到

    17

    主题

    345

    回帖

    3586

    积分

    贡士

    Rank: 6Rank: 6

    积分
    3586

    灌水大神章小蜜蜂章笑傲江湖章

    6
    发表于 2012-9-1 11:30:36 | 只看该作者
    好好学习一下...

    该用户从未签到

    1

    主题

    2

    回帖

    56

    积分

    被盗用户

    积分
    56
    7
    发表于 2012-11-2 22:24:01 | 只看该作者
    这是wget的胜利,用windows的就只会用xunlei
    其实aric2c 也很厉害,不过循环下载网页还是wget

    该用户从未签到

    13

    主题

    454

    回帖

    3027

    积分

    贡士

    Rank: 6Rank: 6

    积分
    3027

    灌水大神章

    8
     楼主| 发表于 2012-11-3 12:51:09 | 只看该作者
    7# liuyangzys


    还有awk的胜利。
    总之是linux的胜利。

    该用户从未签到

    4

    主题

    16

    回帖

    38

    积分

    童生

    Rank: 2

    积分
    38
    9
    发表于 2013-2-6 06:05:19 | 只看该作者
    高手

    该用户从未签到

    0

    主题

    22

    回帖

    23

    积分

    童生

    Rank: 2

    积分
    23
    10
    发表于 2013-6-11 14:02:50 | 只看该作者
    希望支持linux!

    该用户从未签到

    3

    主题

    54

    回帖

    127

    积分

    童生

    Rank: 2

    积分
    127
    11
    发表于 2013-6-26 22:21:48 | 只看该作者
    楼主高手,能否不辞劳苦,再来一次更新?!