掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 50935|回复: 148

[教程] 【史上最全】在线词典抓取、制作技术汇总

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑
. S# u( w  [8 R1 ^& V7 k, B9 ~! \" E# @9 G7 z  {
这篇文章主要是给计算机小白和初学者扫盲。: m" p. C: C) \3 U" ~( u0 j2 ^8 o. x
本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。
; E6 G7 _# w# D3 K* e4 |只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。
# k1 B5 `6 B' D* J! a5 @) T7 w3 C' t  V& ^9 W& g; ~/ q' `
一、计算机的两个终极哲学问题& n& a2 k2 R7 G+ F2 H7 J( T
1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。
- D/ v+ [7 s3 m/ g: _, B图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:0 e% D3 M; X- p2 Y' @8 D
设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;/ K* R$ b8 U" Y# |1 {$ N
机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。
# U2 d/ t6 W3 y( x方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。* p6 I6 S# p4 N
“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。$ T% ?- J" `6 H9 {
+ u$ `6 I" [) P1 |" E( Z, W" o$ r
那么要写出程序,立即就会发现不得不解决两个问题:$ K+ f, u7 \) a6 N  A3 [+ S
1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址& k% q. b+ S' w6 I. P
2、怎么把两种方格区分开?也就是特征识别1 r6 s7 K9 V* z6 P
这两个问题,就是计算机的终极哲学问题。; u3 @5 N8 t- l' Y7 v8 J1 b0 f
理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。! G8 G+ y$ N0 B. Z
下面的讲解也会以这两个问题为核心展开。
: m5 b. K' G( i& Z
2 s  y& Z5 O9 \4 j8 l; fBTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,7 p( T  `# D7 K/ a8 A7 f
——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。" P% g! V, W) s- S
所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。) m- q' n, B/ e/ `
前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,3 f/ |3 L; f! J
而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。! m; r; L  W; O* R
具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。
: q8 h' z3 ~) U' k, `. [: o8 A
; d+ y1 Z5 y0 M- d5 L, ]3 x不要觉得自己上学时学的不是这个,or文科生,就不行。" z% o: b9 @" S' m3 M5 t7 h+ k
江民杀毒软件大家想必都听说过。
5 O. W, c/ x0 B" m4 s: g2 u( Z创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。* d  r8 i) z4 x7 b
咱不奢望成为专家,写写程序总还是可以的吧?. W0 ~1 b9 O/ P, X9 s
5 h$ ~2 T# J* @% i% {3 p* ~
二、采用何种编程语言9 ]) C4 F) N4 U5 s( q* L4 S
上面已经说过,存放、读取、组织、区分数据是编程的核心问题。
# [. n7 A3 R% F0 s  {显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。
3 [# h* U4 q) \0 B$ [抓网站,恐怕没有哪种语言比Python更方便。
) l" w9 y5 I) X- L当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,* q% z3 \. `. }, {( y
计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,
: z  h) }( |" r/ F没有慧根就别吃这碗饭。3 Q! H1 e( x2 u* W. z; y0 O
( A2 J1 W$ P+ ]& a0 z
三、网站抓取技术
: s3 _3 x/ v. e; O$ D1、下载某一个网页,提取其内容
' l; w9 F0 g. d! p% |. D( X! [以前写过一篇,就不重复了。参考:/ Z( E# n. M. D
用一个简单的例子讲讲怎样从网站上扒数据: m$ E; \6 B1 _. p
9 E$ Y0 z5 a: U% G! B+ x  @
2、寻址问题
. s" g) T: \( \+ m; [2 y8 c下载网页,自然首先要知道网址,也就是东西放在哪儿。
/ C, ~- F  Z! J( j7 ?1 j$ ~( X如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。* u1 c* z3 E6 F
但是大部分在线词典,到底收了多少单词,事先是完全不知道的,( p: h) [+ F" S4 w
要把单词弄全,就要想办法得到每个单词的网址。3 f( x0 x4 m# j3 `
总结各主流词典网站,大概可以分为这么几类:) `; S) R: ?$ P2 b0 S
I. 事先有单词总表4 `2 K, H4 V8 D
比如http://www.vocabulary.com就是这种类型。
2 S& \- o2 y' q- v" Q0 Z它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。
7 t) K9 G" j9 B- S4 p2 B7 n9 U8 c" B. n% Z- G2 e
II. 网站有索引页面
4 I- P/ _- ^& w6 o# J如:
- T- X! _- \; I7 r4 fOALD(http://www.oxfordlearnersdictionaries.com// [8 Z1 M0 y) q, C6 J  _
它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/: P9 W) B" ^* D! A9 r) b+ V
LDOCE(http://global.longmandictionaries.com/+ a7 o; L( E% B6 }1 O# D# m3 B3 s
采用框架结构,左侧边栏就是索引页/ W- V4 B. S* J
MWC(http://www.merriam-webster.com5 K$ Q& L3 n; V$ U1 S* ?
索引页在 http://www.merriam-webster.com/browse/dictionary/3 h" r2 \9 k* p, ~4 ]
等等7 W0 z: O# `% C# b  u: Z
这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。
! X: F# N* e, ?: X  K

  1. 2 `: f% L8 s' Y+ b3 W2 H- m
  2. urls = [], |: G+ h; W8 a+ `
  3. for someindex in indexs: # 循环所有索引页
    , T( k; a& Y/ \1 h
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    6 O- I5 h- H9 j7 b0 ^
  5.     browsepage = getpage(browseurl) # 下载索引页面
    5 H; h% n( w0 X* Q
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域$ ]+ Y6 c) l* n7 R
  7.     bs = BeautifulSoup(browsepage, parse_only=target)
    & \2 l8 m5 b" C4 z; X0 }
  8.     if bs:- b' f& f$ F* Z
  9.         for a in bs.find_all('a'):
    6 x. R( X" [+ M; n" t  @
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接
    # U* k9 B# @' G
  11. 然后:
    4 W& B/ ~; V3 b
  12. for url in urls: # 循环所有单词0 O  ^: ]4 m5 a: g3 P/ B
  13.     wordpage = getpage(url) # 下载单词页面
    4 D1 b0 M2 F# P* X* s+ }
复制代码

, h- L+ N/ J2 U" C; g' X6 z3 H5 q1 k4 P& ?
III. 索引页和单词释义一体型网站! v, q0 [1 j! k+ E- B1 E$ C) X
如:Online Etymology(http://www.etymonline.com/2 e; B4 }1 a2 z
和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可# J* q* z. Y* k, b" \+ ?

  1. 5 t8 Z9 x: ^0 t$ g1 M
  2. for someindex in indexs: # 循环所有索引页
    * A# D$ c0 Q6 ~0 v& k
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    / B! _' S1 p7 x( v3 g: `9 j1 V
  4.     page = getpage(browseurl) # 下载页面
    ( h, J( R& O+ {& }8 V  u9 T
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域
    % ?* [. J$ o0 A: k0 N
  6.     bs = BeautifulSoup(page, parse_only=target)) C" x/ B2 T0 B2 T9 _9 C+ ^, J
  7.     for tag in bs.find_all(target): # 循环抠出单词# ~( R4 A$ e" a; g
  8.         worddefine = getworddefine(tag)9 l0 n7 {9 G) r# }+ e( B
复制代码
9 W% X, @2 A8 N4 x4 G" J' I

$ q  L0 f1 _  b/ d& D$ A6 V$ N' E& lIV. 片断索引型网站
6 {7 C$ L; j2 ]( K# P: z如:
( j. u, O* t, o" Z3 n) gODE(http://www.oxforddictionaries.com/. l3 m+ i$ N# z3 e. ^3 T. B) h5 Z
每查一个单词,右侧边栏有个Nearby words
2 a4 l- t5 h/ Y: }RHD(http://dictionary.reference.com/! E# o# \( L5 X. Q  I
右侧边栏有Nearby words/ O' R. Z3 \% x- k( y8 Z2 `. e& s
CALD(http://dictionary.cambridge.org/
2 U( n8 F* w/ u- x2 `. T* i在页面的最下面有个Browse栏,给出前后相邻的单词5 w% ~' U# p5 S0 L
这类网站没有总索引,只好利用它的Nearby栏。
, a6 Z* _( _6 r5 A' p  r; _' N. ]思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,
7 S- F& p$ S: e. U每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)
9 n+ I' C+ g$ E% L% q/ o

  1. : M7 z+ a6 l# x8 D
  2. cur = 'a'
    3 ]8 C, F- Y, S; x( g" |  Y% e8 K
  3. end = 'z'6 X" h0 w! P* u8 _2 H
  4. nexturl = ''.join(['http://somewebsite.com/', cur])! x3 ^8 S0 k2 B1 {7 t, k& O
  5. while cur!=end and nexturl:6 r& @7 \& N$ K8 Z9 }0 `
  6.     page = getpage(nexturl) # 下载单词页面/ l' }9 \6 J* N0 S; H
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接; `4 S: A0 X# G5 C+ ?0 o7 Y6 G: @
复制代码
0 O" o* s4 }6 S* O

4 p: e! W& a. `( _. w+ ~! L9 ~, m6 Q1 XV. 完全没有任何索引,那就没法子了
% B2 `4 Y- h" E当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理% t0 u4 g- y! c: h, v
理论上也是可以的,就是效率差一点;
! E/ u% N& z9 {! {另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。6 Y& |8 {- \) q/ p% ~0 x: G! w
% Z2 Q8 N6 s: [/ T) M$ D3 O1 K% f' [
3、提高下载效率
) N% p; A/ l0 q; x. Y* p, n# hI. 多进程
, i7 y3 I8 c) t上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。# k/ O5 E" M6 n8 U* U( e
实际抓网站时,这么做效率显然是非常低的。
  v1 M8 n) w. g: _. Z3 ^' |假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,
' C+ G+ |" z$ e1 {有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。
/ x2 x* I- H% L0 Z假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?; `$ t4 H/ x# e4 F! m
要速战速决,就得开多进程。
3 Z* o; W3 w/ T9 X, Y" f同样十万个单词,分成25个进程下,也就是28/25=1个多小时。
9 J5 P2 B* |& K9 ~7 S再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。# k0 v! f. j6 k$ x$ s
在Python里开多进程,同样十分简单," @! Y  W3 s* y% y3 W) `9 H! Y
  1. - m+ h; f5 v- Z
  2. from multiprocessing import Pool
    ; L& ?# F" N, X+ O
  3. pool = Pool(25) # 开25个进程0 i; Z+ j) D6 y7 F7 B
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数* i: s* l. [# c9 q, a8 h
复制代码
8 Z- \9 e1 n( N2 T' E1 D6 Y7 C
这就搞定了。
. v) R7 D6 P% o6 e( r) q, Z
. I: Y: B  d1 ?; E; ?( r对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,+ e- F* v4 l5 Q5 `" N/ `$ \
关于IV.,事先没有单词总表,就只好采用区间的概念,8 R0 K: s& ^/ R3 B4 }+ x8 N5 {
比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载
9 t4 ?, Q' [' A; [4 g+ y$ B' Q" s, _; A9 p
初学编程的人,一碰到进程、线程,常常有种畏惧感,
* a. P: s' e/ v: J# c2 H2 v看到同步锁、共享内存、信号量什么的顿时觉得头大。
* C; u: f6 i/ ?2 k其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,( O) h1 J( I- y4 _' X7 y3 f3 `
其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。- n3 v6 d  O' |  w6 c3 r

8 L* C" s0 S) U4 k$ d6 a7 C; {& aII. 断点续传
( s! J$ T3 h* f事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。. i& ]- Y+ d3 s3 ~- [9 k8 a* o
所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;) E# ?0 {5 s  Q1 J
即便无法自行恢复,也得容易手工处理,不然可有的烦了。! D8 D1 c6 T: U3 |7 t% G1 N2 z) y
这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,
) U1 C5 U+ U3 u2 m, C直到所有区块下完。5 S8 M0 }' Z3 C0 B9 x

  1. 1 N$ X" ?% Q0 Z3 o! Y' m
  2. def fetch_a_word(part, word, url, data): # 下载一个单词/ P, o4 B6 g# Z9 N; L9 Q7 x& k$ b5 O/ X5 u
  3.     word_define, failed = get_a_word_from_website(word, url)
    0 h6 d0 H. o* p/ H: s0 l
  4.     if failed:
    9 `' {7 S" Q% K$ N* r
  5.         dump_failed_word(part) # 输出下载失败的单词及网址
    ' P1 n2 U  I' z( |" W1 q
  6.         return False0 \$ y+ `+ m: u. M; c  e
  7.     else:6 Z' X. L# l" i, M
  8.         data.append(word_define) # 保存下载成功的单词数据5 l" J3 @2 E1 i5 D" z. ]8 ^
  9.         return True5 U2 O  \& F1 }2 v  w2 H

  10. / L% a. J# j' e) h, S
  11. def download(part): # 下载一个区块
    $ n% m& D! d, q, U- i  z/ M! h; O
  12.     words = getwordlist(part) # 读取单词总表, n; R5 A' ?& H0 \' w/ a
  13.     if hasfailed(part):
    2 s% M9 h2 M) S7 U: x
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址
    2 h5 j% Z4 `4 K
  15.     else:
    " ]4 q) S2 Z5 G# z) x
  16.         word, url = words[0] # 首次从头下载
    - M/ r% K. b+ r0 z. y' C
  17.     data = [] # 用来存放单词定义
    - g# p# Q: E% `1 j5 g# f
  18.     while not_end(words): # 循环下载
    6 M8 E0 T& i0 }8 R- }- I
  19.         if not fetch_a_word(part, word, url, data):
    4 j, k+ L# T) W  r+ m) S
  20.             failed = True
    4 I8 y* Y) J! i7 W& N) q2 M$ W, O
  21.             break; B" |2 m5 G/ w) e5 e4 `* R/ ]
  22.         else:% n/ L' z1 ]: j6 |& [( p9 z  z
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址# B' p6 a+ y# }
  24.     if failed:
    7 Q6 C+ x, b2 R- _! g+ D
  25.         suffix = '.part'4 r, G, h& ]) }5 e) S. `
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'
    $ Q% {$ T3 B9 ]6 x- @# B( L: E+ P
  27. ' I$ \0 w/ Q1 y  r$ l. C
  28. def isfinished(part) : # 判断某区块是否下载完成
    " l" P& y; y$ A4 F9 h1 R
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断9 g' n8 }' W% ]! o, O6 R  [
  30.         return True- _9 x/ |/ R5 E8 C% C7 ^
  31.     else:/ p1 S, d. `; W
  32.         return False
    ) d, K: H5 V! Y" j. H" b7 ]

  33. . |! e& ?+ c7 }
  34. def downloadloop(): # 循环检测未下完的区块- J2 }2 {" w: Q
  35.     finished = 0
    , n( e  Z' I, t$ T: S! G
  36.     while not finished:1 A) d7 B5 O. f( Z$ S
  37.         nf = [] # 没下完的区块
    8 Z$ `4 `6 k9 Y8 R$ L
  38.         for part in parts:
    7 c/ A. T& y$ o5 j+ K+ D- X
  39.             if not isfinished(part):
    9 x4 b" C+ k- k, }
  40.                 nf.append(part)& }* S+ `. r! P
  41.         finished = not nf( F4 g" @9 }; a8 Q# H
  42.         for part in nf:; m" k3 m5 w! ~* J* O, i( p8 Z* Q
  43.             download(part)
    ! q6 o( l9 }! W8 A& ^; W
复制代码

( _7 y# G+ x% q3 Q2 a/ m0 l4 u2 B2 |+ f/ d  ~* Y
III. 高速下载网页的小技巧
) E8 l7 [& i( d2 ~3 f3 [4 ~9 L6 FPython里面有三个库都可以用来下载网页:urllib2、urllib3和requests。3 a0 P/ I5 g9 k1 i) Z
其中urllib2是Python原生的,urllib3和requests为第三方库。( N( x* E; _: i" E1 K
(似乎Python3已经把urllib3收编为正规军了)
3 p* z. F1 H& {8 v+ D3 G! }这三个库有什么区别呢?- r- a* y$ q+ }5 j& p3 O
形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。3 ^; Q& y: o! m; \
再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,
3 D  _" w) H: I, _& t3 I所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。# z8 [4 q$ ?# p: a: Q. d& Z
但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。
* `3 E& ^+ j9 V  `这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,
- M6 S  [4 @5 r) j9 `: ~通吃一切网站。- A0 Z* C8 L2 U  S
所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。
! y5 \4 X! {, \) C+ S) D5 A这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:
- l/ y8 T* a  }6 U' k; |2 \3 Fhttp://urllib3.readthedocs.org/en/latest/" v, {  u9 {$ K' [& `
http://docs.python-requests.org/en/latest/) H- Q' }' }8 Z, i

  1. 5 I" q& \# s! P; b
  2. #urllib2
    2 Z( g& b" G4 Y; {# S) J( }: B
  3. import urllib2  L7 S" U1 D% I+ [: `
  4. def getpage(url):
    0 ?* W% [  S* H' x7 f$ t
  5.     req = urllib2.Request(url)
    / c. Z2 v4 k! [2 B
  6.     response = urllib2.urlopen(req)( I: `$ L; U; `) K7 c8 b1 s
  7.     page = response.read()
    * k: E3 h+ z5 A

  8. 7 K% G) S: z  F' @( n% y
  9. #urllib3
    . K, c' b9 ~3 ]8 D9 H8 H% O7 i( W! D
  10. from urllib3 import PoolManager( E2 `1 \+ ]2 R" j
  11. http = PoolManager()
    ) p& ?$ D+ }6 y! e0 s
  12. def getpage(http, url):) K; `0 {# o& u! V! \9 ?
  13.     r = http.request('GET', url)
    * K5 X& F8 {% R3 {
  14.     if r.status == 200:
      |6 G" N! Y+ N2 P- ^3 H
  15.         return r.data
    + o! \* W7 O2 I
  16.     else:
    $ A$ a0 {' r# a" L* w+ ?8 A
  17.         return None
    " p& f# h- ?$ v5 P- \2 ^
  18. * ?$ i/ `/ X& J
  19. #requests
    ( a" `2 i$ ~/ Q# u8 Y
  20. import requests/ d8 f; O' L) j0 k) y$ u
  21. session = requests.Session()) f6 ]( n2 o, m/ h- O$ t
  22. def getpage(session, url):
    9 g( [8 ^7 U, N/ E+ w" E9 ^4 `
  23.     r = session.get(url, timeout=10)
    * p4 X. ^! O: @) U7 ]1 f6 i
  24.     if r.status == 200:
    ; |3 h' ?6 T$ F0 t
  25.         return r.content
    1 ?' k$ h& h  X  y) z" x
  26.     else:
    ' y' P" h, ]; ^' A  u# n; A0 v
  27.         return None
      f  S3 H( P6 Q% T( ]% ^( m
复制代码
2 @- [0 _: `3 Z
四、后期制作
. V  O4 w4 c5 H, N1、文本处理,是个特征识别问题。
5 f3 s+ H& b0 l  |本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。
# d1 ^5 |' }9 g% v! N5 Q当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)
) C* N& E* F) ^  _都涉及到特征识别问题。, F* W; O3 ]2 a" E4 M
相比这些高难度动作,文本处理算是比较简单、基础。" l# E+ x( P1 y/ K2 U" t5 H
Python里常用的文本处理技术:正则表达式、BeatifulSoup、lxml
& ^( [2 X% _  b  u正则表达式非常强大,但没法处理递归嵌套的标签型数据
# ^$ }% }$ H- l(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);
0 U7 `+ {6 q: OBeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。
* V9 g' o; t8 k' a( O9 h5 b# O" L8 c所以常常要结合使用。  i1 T3 s1 c- n+ L
这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。
6 n  }$ b# R+ o3 c7 W- N0 p# P6 e+ T2 C: m! @$ ~) A5 \! g
2、排版( o  F, u- S+ P5 K
HTML、CSS的基础知识:
; }; A1 {  h3 @" E' _) P7 ahttp://www.w3school.com.cn/html/index.asp
1 V0 B: G  O" D: {. g& Shttp://www.w3school.com.cn/css/index.asp5 Q1 V, I+ V$ {3 n4 p( p1 f2 t
http://www.w3school.com.cn/css3/index.asp
3 K: E3 A) ?* ~: o! \) g8 S非常系统、非常全面。
5 j' t7 U+ t/ G3 j排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。
4 k! Z7 P' U3 s  k  N: z. `
8 R, T, O5 E& u' \五、结语
9 Z9 D4 g& g$ y花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。
" V% l: y8 p6 M; `0 l, z. Z所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——1 f4 F! Q9 Q! ~+ i
大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。
( b% g2 G! y& G+ t* Q6 y
8 |) A0 P' M6 d5 h打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。
) ?8 Y- L& M3 e7 L$ ]5 J) Y+ e' o) \# ~: U
只是拜托不要打扰别人,真想要就自己动手。* @2 w& a1 S) u1 h
尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。  S) ?+ X# Y1 |6 g9 z3 `8 Z
水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。2 x" l/ B) F9 s" W& r
虽然每个人都觉得自己至高无上,应当受到别人重视,
6 i0 L% j# v* y+ @, r其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰
8 s2 H- R# d  T& y' Q5 r. R' t. x
( F# Y7 f9 c. r
: ~  u/ n$ Y8 n& o4 I' x( i9 `========2 |/ ?4 D* v1 _" T5 G
六、拾遗
- k: S7 g) N0 e. }% A5 B) ?关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类1 v4 a  ?- e9 D" P; ]$ \
确实如此) k6 J) x; t, @, p1 ]3 B- Q' r
不过这里只是举例而已,不用太较真啦
, G. ?* K' K) o, U* V5 R实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏
* {) M' D7 A% L. g- D. R* V+ |这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。
0 m: q2 B- i2 e% a% a5 F. E9 i$ e即,
) g0 q' A- f, q3 w第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)! T" B$ |) Z  d+ U
第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)/ F% J" w0 K( S: p- l* P
第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作
! [7 m9 k5 ?; B( K$ y3 N3 A。。。" L' C- _; c( c, X: R. }% C
直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空)/ a% R$ V  e3 z* L0 B: B
最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。& l# [( a  b8 Z; Z* m) l9 m; n
形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。! ?: g' N8 q5 |7 a! [, E7 |! m
因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。
. L% ?: x- U3 T5 p1 r# Q5 f  U4 v

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:41
- `- p$ f1 z0 j" K* ^感谢楼主分享知识和经验。
; a# T' A" ~( p! c/ V
* _5 ~3 u" k1 G0 e每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...

4 g; F/ g: f% E* `& Q* X1 V现有的mdx词典,其实足够绝大多数人用一辈子的了0 l- S9 c0 P( A7 v
  k- Y. p) L# n$ n4 q6 l! Z
本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。" K* Y/ }; O- s$ s9 B

% U! J- R4 ~( }( S( k. W& j本人最常用的词典:! b- O; o$ s5 F8 l2 s8 z
主力阵容:VOC、ODE、WBD。
0 r4 w% O- H3 Q! x7 d; H三本都是中型词典,收词量均在14w上下,以本人目前的阅读面来看,还未遇到这三本里面查不到的单词、未收录的义项。据说史上掌握单词量最大的人是政治家兼散文家丘吉尔,也没超过14w。除非钻故纸堆,恐怕用到W3、SOED的机会不多。
' D1 p- g: D- K" `( }* E/ z" j- ]
% S$ ?7 L, |' W* R3 ^: h) i, J替补阵容:LDOCE、词源、短语8in1、韦小黄&韦小绿、Garner Usage。9 K1 N/ A8 ]* i' [2 U/ Q
LDOCE用来查常用词的惯用法/搭配、语法信息;
% Z* u( V( E) z3 b- {  b+ q; F词源用来辅助理解、记忆单词;$ C' D: A; F# K  \% n6 d
短语8in1用来查漏网的惯用搭配、非正规用法;9 w! `: N0 Y( ?6 l7 S
韦小黄/Garner Usage用来辨析/比较同义反义、正误用法;) o3 S% n! z/ v% Y, k- A
韦小绿用来辅助理解、记忆大词。小绿真是本好词典,有人说里面收的单词都是一辈子才能见一次的那种,其实不然。它虽然只收了1400多词,却几乎都是高频的大词。从本人的使用体验看,查得率相当高。比如最近看新闻说一种超大蜘蛛,里面有个词arachnid。别的词典只是干巴巴地说4对脚的生物之类的,只有韦小绿说了它的来源:从前有个女孩叫Arachne,编织技艺了得,把雅典娜女神给比下去了,结果激怒了女神,被她变成蜘蛛,终身织网。这种解释多有意思,看了永远忘不了。
) ]& C7 w& B/ G5 M( _8 H2 G' k6 ~* N7 V! p8 _/ k( W" t( M  X, E6 \
上述词典,坛子里都有,无非是版本新一点旧一点。比如朗文5和朗文6,有人统计95%以上的内容都是一样的。如果是完美性格,非要用最新版,那就只有自己动手。不会有人在词典出版的第一年就去挑战版权方的。
4 n- J& Y" F) w" e, c6 a* J“对于好学生,任何教育资源都应该是免费的”。虽然本人同意这种说法,也认为现行的版权制度存在重大问题——有人靠垄断知识获利,却完全合法;但是本人从未打算挑衅版权方,更未想过做Aaron Swartz那样的斗士。靠垄断知识获利是有点无耻,但如果没有利润,也就不会有人去做整理资料的事,这确实是个难题。
4 N/ D6 f% {( y) q, U0 f
' k- b# k, x+ S+ N5 Q还有些人没事喜欢收藏词典,收集了一大堆,却从来不用。说到词典收藏癖,想起以前的一位室友,那家伙每天最大的兴趣就是下载影片刻光盘,大概刻了几百张,还在不停地刻。但是从没见他看过,他也不让别人看。) j, Y/ R; U6 R1 _5 e+ n
这种癖好大概是来自于原始社会的一种遗传,人们总觉得应该储备点东西,说不定未来某一天就会用到。其实那一天说不定永远也不会到来,不如就把今天当作那一天好了。有多少人买了一书柜的书,到死的那一天都没看完,甚至有些书连封皮都没揭开过。2 K' p4 h5 |: r( _! G% m

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。
( p; x: z7 O7 d其实只是你没有发现而已。$ A5 b/ P( K3 s' E8 U
ODE: http://www.oxforddictionaries.com/browse/english/. k9 k5 q# {: i! D
RHD:http://dictionary.reference.com/list/a/
5 n3 X6 a9 [: N9 X: U! D4 W4 MCALD:http://dictionary.cambridge.org/browse/learner-english/
( Y7 z8 U6 n' y
: `9 e) p8 Z5 d( E& e3 Q! R如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。
* O& N  V9 J% e) h& |4 |- z以第二个为例:- a: r  r+ O% Z, F
inurl:browse | inurl:list site:dictionary.reference.com) U+ E0 K) N  q# r* [
4 a4 q, B3 l  t' c4 N* `5 Q
PS:最近才发现这里,发现资料很多啊。7 g2 u4 A9 ~3 x3 E' P7 X

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧" N+ r0 a% e+ M" ]4 P' s
( J, @% M  b+ G1 x
假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改# y+ I( T/ V4 E4 G
或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下/ r4 k" ]" q  Q7 z. B5 I. e
结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。
5 w" l- Z5 z, @. B: G( ^% v这里有个比较省时省力的小技巧,可以快速定位到想找的地方
- n+ S: Z' F( Y6 r$ c0 A5 J8 {7 h( ~! V& ]! Q0 X
1、Goldendict里,在想修改的地方点右键,有个“审查元素”:* j4 s2 s. ^4 q

0 a6 E% V' ~% W5 \, X) Q+ T; x- A* P5 l/ ?% r6 D' N5 K
2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事' \# g8 V2 F% \. h4 t
6 P) t+ e6 g# Q7 j+ O0 d/ y
# v- C4 A" P& L& D& ]0 A$ D, Q0 }: t
3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方+ f. C7 D5 r. ]" C! I& f1 k, {
; }" n" E7 A- q

2 Z; k$ N* s7 e6 ]* a' c2 ~收工

该用户从未签到

发表于 2014-10-24 18:41:00 | 显示全部楼层
! p  c# ?- o, r% G, {) S; ~) L; a) e; V

2 s% l2 U2 z! l- ~5 ?& Z, e * V  D5 \- P& e+ r

# e1 @4 @& `  t6 k% E4 d( p感谢楼主分享知识和经验。
( m6 s- ~4 n4 k: f* ~% E
5 i& F3 t% w# W  R5 N& c每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。6 C7 {6 ]* @/ a( m. H$ N

' }6 U; `7 |7 H/ b, V: d, X. u: `9 g私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。
* X: w* k& b1 ]: \0 ~
0 h  t' E' T9 f& R0 i但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。, V: e! |1 H. u  A

% f8 L! _* L9 z6 _5 r, V2 z; M! r) z除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。* V! \0 {' e! @  P% a2 y

0 M1 L5 n) {3 Z1 o0 c# y0 _$ h8 G  U
7 m" r& V: L# T) s5 S& i( }

! k# Y% S0 P- i1 s# s. v- Q/ g

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件4 j6 l! z/ ~5 ~+ d- V
  • EmEditor
  • Beyond compare  \1 c4 X  V' v0 G1 a$ V& R; [5 o. _# D

8 b8 B. c$ B# h
1 E- c. F& N: a. P9 u, E+ H% l+ T前者用于编辑,后者用于差分比较' |3 Q& l. e% j# v* `4 @
处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

发表于 2016-6-8 07:41:03 | 显示全部楼层
bt4baidu 发表于 2014-10-25 21:01/ s. x# q/ s. G- W  y, i* K
现有的mdx词典,其实足够绝大多数人用一辈子的了- w5 X1 N1 d# @0 s, E
* {% q& e1 O% N# t9 R
本人前段时间制作、收集了不少,经过一段时间的比较 ...
; F! A6 |" A7 y6 n
肺腑之言。

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考
% Y, P; \) \4 s& t6 \7 C0 |* D# N4 U. E6 O2 R
网页设计中最常用的字体有哪些?(中文和英文)1 l, P: _: @/ i
http://www.zhihu.com/question/19680724! x% y" Y2 M1 |9 y; G

8 N% D2 U# o6 ?& l: p本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode+ ~' t1 P  a4 M; {2 ^
这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全
0 r) G% v: F. x# D, X4 ]5 n* K& ?另外Open Sans字体也挺漂亮
! i$ x/ ^( a; {1 T) a0 s! I
  • TA的每日心情
    奋斗
    2022-7-30 15:54
  • 签到天数: 42 天

    [LV.5]常住居民I

    发表于 2022-2-26 17:50:52 | 显示全部楼层
    看了之后发现我确实没这慧根,老老实实找点现成的字典用用算了
  • TA的每日心情
    开心
    2021-4-24 12:17
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2021-7-6 11:06:02 | 显示全部楼层
    bt4baidu 发表于 2014-10-22 20:21
    7 L. E$ K2 e4 T) @# S最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...
    7 g6 Q' C0 s6 n4 B% I. C, x; ]
    感觉找到适合自己的问题好少啊
    5 s  I/ @4 _5 r3 m3 W; T7 W# y2 k这个适合的话感觉是兴趣和难度9 H. N9 y- S' t* s: M9 I
    想请教一下楼主是怎么处理这些问题的呢
    5 W3 u; S1 k9 p2 T) ?& z# ^4 A! v还有种不系统的感觉
  • TA的每日心情
    开心
    2022-4-21 23:25
  • 签到天数: 250 天

    [LV.8]以坛为家I

    发表于 2020-11-25 07:27:28 | 显示全部楼层
    谢谢分享,很不错

    该用户从未签到

    发表于 2014-10-19 16:03:34 | 显示全部楼层
    Thank you for your good lecture. Will see if I can comprehend a point or two.
  • TA的每日心情
    开心
    2020-3-8 09:14
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2014-10-19 16:12:07 | 显示全部楼层
    本帖最后由 louislaolu 于 2014-10-19 16:13 编辑 ) W( @$ C% N/ @

    ; c/ v0 n4 P; k( Y7 @写得很好。刚看前几行的时候,的确激动了一下子。虽然没怎么懂,但是第一次能坚持把这样的东西看完,觉得也是对自我的一次超越。谢谢!

    该用户从未签到

    发表于 2014-10-19 16:21:01 | 显示全部楼层
    這個要推~ 謝謝百度哥

    该用户从未签到

    发表于 2014-10-19 16:27:51 | 显示全部楼层
    强大的教程,谢谢分享经验!谢谢bt4baidu!

    该用户从未签到

    发表于 2014-10-19 17:28:11 | 显示全部楼层
    受教了, ~\(≧▽≦)/~一个!

    该用户从未签到

    发表于 2014-10-19 17:31:18 | 显示全部楼层
    先收藏了。慢慢看。

    该用户从未签到

    发表于 2014-10-19 20:08:45 | 显示全部楼层
    已经收藏,谢谢!
  • TA的每日心情
    难过
    2023-11-26 08:44
  • 签到天数: 49 天

    [LV.5]常住居民I

    发表于 2014-10-19 21:25:27 | 显示全部楼层
    辛苦了,谢谢!!

    该用户从未签到

     楼主| 发表于 2014-10-20 20:22:48 | 显示全部楼层
    本帖最后由 bt4baidu 于 2014-10-20 20:25 编辑 ; r& v. A* h4 F. m$ |' }$ a+ O: |

    9 E1 i/ Y2 h# n; b" z, G( {9 n3 `java和.net就是个垃圾,我懒得提而已
    ' W  g+ z- p0 o, {4 X; ^" O/ @7 v在Linus这样的大神眼里,连C++都是垃圾:# K+ E: J0 e: Q8 w1 A$ [" H
    http://www.csdn.net/article/a/2010-06-12/2187852 Y/ i* j3 D! L; O& Y) P. l

    $ |! n( p8 {) p. n* M1 R如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。
    ; R# U7 Z4 D5 U5 q/ E5 u' N9 l
    $ {0 J) a4 z; w0 g% c0 v不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。
    ) U9 E' r% r7 a9 w' n0 g; p我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。" }  A+ v- j( m. j$ e# I0 ?
    这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。1 I; k4 [3 G% r9 L! o# X
    不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。
    7 m" d3 p. i, z- D) I# _为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?7 L8 H3 R6 r  U( @( R) e6 k
    因为垃圾代码太多了。
    + d3 ?. A! {1 e! T7 Q1 S4 U+ _; J) Z. c( g3 _
    1 w% I2 ~, T, \

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑
    3 ~$ j; C7 C" T# s% Z) B
    " F: _! U6 ~1 @) Q: E3 Z( n" j7 X0 W
    算了,道不同不相为交流3 ~% |& d8 k0 @. s1 K
    想起某个梗
    . R$ m: O2 w# X, \程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!* N- ^* T# @, C) x5 T' d/ e( O

    . P4 P6 ^; V( I自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。; ^! J7 e+ O( a

    4 N$ R9 ]* i- P! [5 m另外win95时代才是32M内存,win98的时候至少有128M,我一台老主机还是win98,文本检索速度秒杀XP。

    点评

    1999年7月我买电脑“金长城”6999,PIII450处理器,64M内存,SiS显卡,跑win98。2002年攒机可以配1G内存。光阴似箭。  发表于 2016-5-11 05:02

    该用户从未签到

     楼主| 发表于 2014-10-21 11:28:36 | 显示全部楼层
    meigen 发表于 2014-10-21 00:07. W+ W6 b( \/ x' b- @+ P: s
    算了,道不同不相为交流3 w8 A' E# X/ i6 F. N3 D
    想起某个梗& d  P' B' ^+ W- _$ e  i% L
    程序员眼中的编程语言
    ; f( T  j3 t$ ]3 N$ K
    不同的语言适用于不同的人群:, y7 W8 O, R- n, l
    如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。) N( J; n& `4 ^9 Z, d
    如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。0 L0 m# i8 l$ P& B7 W8 p0 e  Q
    至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。
    9 {% X4 n3 C; Y9 L" O9 ^4 r, y' u3 l) i) b5 f/ X' C0 K
    编程语言的口水仗永远也打不完,不争了. }9 z, q, h% v* v8 x$ g2 J# u3 M; E

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:35
    $ I% z5 M4 @. X; V3 p不赞成多线程抓网站,但是好贴子要支持!
    ; e4 r) }9 s0 J, C! T. p" w( f( ]$ k5 g
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...
    1 \9 b! v) B( y6 q' v& }: g4 M0 ^4 e0 K
    下载软件?推荐一款?7 k4 t8 e; i6 C) t8 @3 Z- G" l
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;* \9 ~( L! m9 M. H6 w. Z9 _, x3 l
    现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?
    8 s: R. O9 l' @6 x& Q比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。2 g. a' z* M9 a; ~9 R4 O
    除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。& G) x& \9 C$ P9 g% p
    目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。
    ! F/ y, n; v+ b. X+ _( k! w/ }0 S6 X! K
    至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。! p5 i6 r# c/ z2 f' S2 x
    对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,# c8 c" z0 a  b! g. q+ A
    目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。0 T8 |) ^# f0 D

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:
    ( l& _8 z7 v/ H7 }0 }+ H随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。0 i6 z) ~* A' P9 v
    未来会出现一个新的行业:私人计算机管家。8 l. Z. n' [3 A2 v/ T; U
    专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。
    6 J) H" e$ }: }9 j: ^  t但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:29, m( F9 Z- ~1 z0 _+ f- t: w3 o1 `
    下载软件?推荐一款?
    . b; x2 |& J' i+ `最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;2 d, ?4 F$ ?, A+ ~( V
    现在99.999% ...

    * A9 @$ q0 G- O4 t" c' m: B5 W( b. P用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
    # |* N- R% P8 t8 ?
    $ g# c9 M8 D% _  \- g十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。4 B$ f; K6 D% V
    2 i. J6 ?2 \/ J2 _0 k4 ?
    用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。9 w) a, Y6 r$ R" Q
    - N: d$ c! `. J0 b$ r( k
    我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

    发表于 2014-10-21 20:06:14 | 显示全部楼层
    此类科普文, 多多益善, 学习之!

    该用户从未签到

     楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
    大熊部落 发表于 2014-10-21 16:18
    ; B' S! T0 Q8 ^* d; g用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...

    4 [: r7 X& p0 x我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件, o2 Z& Y6 y2 U" H% u/ [$ K

    . s2 I1 @, D( C6 U
    下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
    / m, F- ~3 B& {/ d
    推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

    该用户从未签到

     楼主| 发表于 2014-10-22 20:21:14 | 显示全部楼层
    平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。
    , C  |; B5 r$ l8 b

    3 |: ]6 N( x/ U* B7 L( a; X, J最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差
    " v3 R; Y" u. b/ M$ o计算机是用会的,不是学会的;3 I# R9 ?+ b, B4 w- z$ d8 \  E1 t
    程序是调试出来的,不是写出来的
    8 i3 [% Q& H* O5 B! Z0 Q/ R0 |! a/ L0 A5 f) h
    既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。9 k) B& o( g: f
    你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

    该用户从未签到

    发表于 2014-10-22 21:25:59 | 显示全部楼层
    bt4baidu 发表于 2014-10-22 20:21
    " }3 [  [+ f% \- z% A: @# X5 @最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...
    9 m& Z2 D4 @* X9 @; d2 {4 o
    多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。0 r2 W1 u) \4 l+ ~
    : M. x0 ~7 Y* w8 f( L" k
    我的一点网络小技术是很久以前在X客基地学的,当时花了几百块钱,没想到有些技术到现在还没过时。抓dictionary.com的话用一般的软件就能搞定,老牌的离线下载小软件(如offline等)或这几年流行的火车采集器(www.locoy.com)都不错。
  • TA的每日心情
    奋斗
    2021-9-21 18:07
  • 签到天数: 167 天

    [LV.7]常住居民III

    发表于 2014-10-23 09:53:00 | 显示全部楼层
    就需要这样的教程!学习了~
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2024-4-26 13:45 , Processed in 0.091438 second(s), 12 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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