掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 35342|回复: 145

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

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑
0 @" w  N1 l% b
) T  x6 E, W1 i: a1 U. g% v" z1 f这篇文章主要是给计算机小白和初学者扫盲。
5 ~( y' v- p# b/ @! P4 I) B8 n; q本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。
) F% f# y, J7 A7 }9 u只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。
) R, B/ g7 j$ `4 N3 \; p6 }2 H
7 J8 J3 W7 h9 D1 I8 P& m一、计算机的两个终极哲学问题
+ {) S& V) C* K0 y# u" K2 e1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。
! U1 J5 G/ P" ~+ S! g7 t7 _图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:
; P2 n1 @" Y& `  T* t: d' g设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;
2 T: p2 b! ]6 l" w) c机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。9 s; N. N, d) D  r6 ^
方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。( R7 C( {; X9 B) g
“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。' V; M; N" C5 ?/ ?

) y3 N& t9 Y6 ~. [& q那么要写出程序,立即就会发现不得不解决两个问题:
* O7 c& m! x$ Q' `$ g* x1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址9 L* j$ U5 p& x9 r* A4 n& U$ e/ v  a
2、怎么把两种方格区分开?也就是特征识别
( @% u- {% [! ^! V这两个问题,就是计算机的终极哲学问题。' C  F; c2 x5 M( V
理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。
1 {9 y* B, x+ }* r1 u下面的讲解也会以这两个问题为核心展开。: Y/ H2 ^" P$ r- K4 J% j/ N

' t3 J. L0 X7 w7 z! PBTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,* z+ w3 m4 L  Q, r
——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。; [( k/ ^! q! x+ a# a# K# ^- r
所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。" d% z& A2 _" B
前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,8 ?% X( f6 N  J+ i- Z! O
而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。
1 Z' I) Z7 D3 X: o- ^具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。
$ z% |$ ~0 g- r1 d
) B: d5 p# o; `) w不要觉得自己上学时学的不是这个,or文科生,就不行。
% K, C5 u9 \+ h9 @% p江民杀毒软件大家想必都听说过。
! {# U4 a6 ?* k3 r* V* B创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。8 C8 y3 j' Q: {
咱不奢望成为专家,写写程序总还是可以的吧?
& `+ M* Y5 i4 |% S7 K# D1 _, A
. t& w% P7 }. c. [9 Q二、采用何种编程语言
% I- S0 w9 z! G1 x: S4 N上面已经说过,存放、读取、组织、区分数据是编程的核心问题。' I  a. }0 o$ a- h+ ]" G
显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。+ L  p; F/ l- e& ?. M1 j
抓网站,恐怕没有哪种语言比Python更方便。
! G: n0 |: P( Q9 b, N0 ~7 p3 w当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,
! P. Y* A+ s# Z( ~+ J计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,, _- Q6 i' Z& K+ J7 R. w
没有慧根就别吃这碗饭。
/ |' B6 q, x1 R/ w
: v: Q% t: f) }5 `三、网站抓取技术
& d% B4 J, @8 s, Q8 ]) H1、下载某一个网页,提取其内容. Q0 z& {$ J2 D, L4 J
以前写过一篇,就不重复了。参考:
# X0 h# f# f4 Y用一个简单的例子讲讲怎样从网站上扒数据
4 X5 ]5 _/ i: J* e: g1 t* k
6 ?1 n2 |# i5 P8 X! j0 {) `2、寻址问题' @$ Y; {  o: R; z; P# ]
下载网页,自然首先要知道网址,也就是东西放在哪儿。0 Z& k+ ^9 q; N" c# e
如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。
1 J2 O0 c; Z$ k; ]但是大部分在线词典,到底收了多少单词,事先是完全不知道的,& s, _" A* H4 M3 \; h
要把单词弄全,就要想办法得到每个单词的网址。
1 ~7 _( O. H) c; t+ s总结各主流词典网站,大概可以分为这么几类:
% d) H6 |( H9 K& M# N3 {% fI. 事先有单词总表
: M/ M( B, }$ F比如http://www.vocabulary.com就是这种类型。* P% N; k% ?$ l  q
它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。" h+ Z+ h9 Q: }4 a0 L# z

5 J) W! z4 s0 `1 dII. 网站有索引页面" u* ]% o! k: A& |! P' y
如:) W* Y- W1 n# u9 z
OALD(http://www.oxfordlearnersdictionaries.com/, X+ i+ c( w1 O
它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/2 E( {+ n. Z+ v. `1 j! _2 m
LDOCE(http://global.longmandictionaries.com/6 h- d" D* o( h/ q% o1 q
采用框架结构,左侧边栏就是索引页$ U9 G# A( x0 ~2 h" B
MWC(http://www.merriam-webster.com
' x1 j% g7 y. \7 c8 ^  E% J6 ]9 G索引页在 http://www.merriam-webster.com/browse/dictionary/3 b0 m% k' s2 w2 |( j
等等$ [* d7 K3 J$ j8 b) `* a
这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。
! n9 p9 I; Y! R" ]2 G( u
  1. 6 D( p: g6 I4 r9 q/ h
  2. urls = []% B1 @) B: L) i) r8 q
  3. for someindex in indexs: # 循环所有索引页: S. y' j' @* S  m, P" |+ n
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex])  ?/ t5 {" q8 f! V8 H" \
  5.     browsepage = getpage(browseurl) # 下载索引页面2 L: p& `+ l5 k( O' v, F/ t
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域
    3 _# W" u- Q0 N# k# ]
  7.     bs = BeautifulSoup(browsepage, parse_only=target)3 Z& P( J% a5 [4 _/ e6 b
  8.     if bs:
    " Z5 l2 b/ z8 h  L. E3 f0 ^, o: u
  9.         for a in bs.find_all('a'):
    * t* k9 W0 T  J
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接
    4 C) T8 k* _5 {# d% H& x
  11. 然后:
    / I' l' u) ^( n4 A& `6 _$ ~
  12. for url in urls: # 循环所有单词
    3 v6 v: Q, c! w) ~& Y
  13.     wordpage = getpage(url) # 下载单词页面  v% Y. @5 B3 n! i9 j. u( L) y8 d0 E
复制代码

* H! D9 r+ W% x, ]5 \$ F" a4 C4 [
; N6 i5 {8 x: v2 ]0 IIII. 索引页和单词释义一体型网站0 c) \  N2 B% t9 ?' f1 r$ E
如:Online Etymology(http://www.etymonline.com/% l+ d$ e/ ?# Q  [+ \* s% e* S
和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可
, {3 k  I1 v3 W# }% l9 g/ k% t1 R  `
  1. # E- T7 p1 G; a) C# g- t
  2. for someindex in indexs: # 循环所有索引页, E' V, d* W' K. o) E
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    8 |- c* K1 }- b5 O% k, Y, {% |
  4.     page = getpage(browseurl) # 下载页面
    2 G) ?- Q: {$ }1 `1 u
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域
    * A' E* E/ l6 @) \% l
  6.     bs = BeautifulSoup(page, parse_only=target)
    + x/ j9 ?8 _; {
  7.     for tag in bs.find_all(target): # 循环抠出单词
    : C- h1 n$ k* _9 }7 b) c) ?& \
  8.         worddefine = getworddefine(tag). T! V' k0 r* A9 ]4 X
复制代码

1 B$ ~( U6 _' M6 G, o9 I! l, _) n+ Z, h- H$ R
IV. 片断索引型网站' X( Q7 ^. u7 C
如:
- g% }7 N; b/ U6 Z5 ], b0 B8 hODE(http://www.oxforddictionaries.com/
; ^5 B- [% ?# \/ s2 ~/ Y$ U每查一个单词,右侧边栏有个Nearby words" j4 m- n3 I8 {  Y
RHD(http://dictionary.reference.com/
3 |* @5 n$ v, S1 `9 S右侧边栏有Nearby words; F: j' Y7 z5 `; h
CALD(http://dictionary.cambridge.org/
8 e. U0 B! d( L& X; u: B% u在页面的最下面有个Browse栏,给出前后相邻的单词
0 y1 N0 f# n1 A5 i; N) [4 i! W这类网站没有总索引,只好利用它的Nearby栏。
# N5 z$ ?6 P4 a/ G思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,
) ?3 p5 x( s7 Y8 G: x每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)
1 f$ R0 c5 _$ K7 T$ `! X% ]

  1. 9 }: F) G1 X- t
  2. cur = 'a'/ k3 z- t2 t2 J$ H
  3. end = 'z'
    4 b$ {: X5 V3 h$ S! g$ S2 U9 O
  4. nexturl = ''.join(['http://somewebsite.com/', cur])0 Y' M9 j; y3 L9 X' E5 J8 z
  5. while cur!=end and nexturl:; E; g9 R  ^/ N% j) ~' ?# K4 N
  6.     page = getpage(nexturl) # 下载单词页面5 M# K4 r6 F$ F! h6 G; x! O: U
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接4 I& l( R+ \7 X8 [7 l
复制代码
3 z5 d' D$ f" ?

" v) j8 E  I+ O1 AV. 完全没有任何索引,那就没法子了
% h; H/ Y0 [9 m7 |  T当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理6 K  E; S9 d: Z/ U! \
理论上也是可以的,就是效率差一点;
  K/ H: h# C  q# ]; c% ~- c- f4 s4 k/ p另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。+ q: f5 L) x4 w) c4 l. O1 l
3 F9 G, d# N7 r
3、提高下载效率
6 G$ ~) _1 E# R$ Q3 qI. 多进程
/ W* Q; S  E3 e2 \1 v上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。, ^: [! X4 R# K" }. s
实际抓网站时,这么做效率显然是非常低的。5 `+ ?" g' L4 ?3 b7 f# ^
假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,, V1 o. }4 V) x0 d3 h  [' J0 [
有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。3 V. B  O% o" i2 P. G
假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?
& L3 a# ~4 u& p! h要速战速决,就得开多进程。
& ?0 L9 y, _3 M" I( H3 t同样十万个单词,分成25个进程下,也就是28/25=1个多小时。% n, n# c" a( D$ [
再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。
1 A# n5 }$ b+ C# c在Python里开多进程,同样十分简单,4 q/ b7 X& k4 Z- p# p

  1. + E6 S5 o) \& x# r3 z% h: q
  2. from multiprocessing import Pool
    ' j1 ?# X7 B, j7 z% y  x/ v- }
  3. pool = Pool(25) # 开25个进程
    2 n1 q5 w( S9 G  {
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数
    ' \1 v$ }4 K, \9 `# {% M
复制代码

! M3 }. Y# y1 }9 u+ f这就搞定了。5 v' X" V( [+ h2 T: ]" ?; J
+ ~; Q8 d& H2 G/ Q1 G; ]. I' k  @. D% Y
对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,6 {2 w- Y; i- H3 h
关于IV.,事先没有单词总表,就只好采用区间的概念,
- [. ^! X! w9 }比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载
5 v9 @' V# u7 z
8 r0 J* G; c( l6 i8 g初学编程的人,一碰到进程、线程,常常有种畏惧感,; |  H- I7 m7 ~8 a; w" q) L! R
看到同步锁、共享内存、信号量什么的顿时觉得头大。; d" [. w+ ]  Y6 p4 Y
其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,* Z( _: L1 M* ]  q4 D4 E
其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。
) z0 c4 K- r# Q7 I+ U! ^( I2 |6 M7 {& E( @+ B/ j; o* J$ Y/ m
II. 断点续传5 ~  b8 b: f/ h) R# R
事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。7 W- ?& }' h% a6 h; \- A
所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;
8 {/ p) Q1 p9 L2 G; i! |" c即便无法自行恢复,也得容易手工处理,不然可有的烦了。
# A, g+ s* z  L# G0 O( |这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,% m! a) Q8 i- v4 ?
直到所有区块下完。
% [5 ?8 T5 a2 W: K
  1. # K- v# ]7 v4 `% |4 r7 e% P( W4 X3 y
  2. def fetch_a_word(part, word, url, data): # 下载一个单词
    ' s# O7 N: g6 W7 X
  3.     word_define, failed = get_a_word_from_website(word, url)
    6 k" I# ?9 h7 A5 h( C+ M, C
  4.     if failed:: o: O  ?. M7 F
  5.         dump_failed_word(part) # 输出下载失败的单词及网址
      s; |" J: c) j% i# M
  6.         return False
    7 c0 |' a- @' _: @9 ^9 B9 ~
  7.     else:4 _* {7 W2 l  e5 J7 H" v1 p# _/ H
  8.         data.append(word_define) # 保存下载成功的单词数据
    $ q7 |! i% Q' u/ r+ `* H9 `
  9.         return True
    $ N! H+ m8 ~3 r' P0 T' |
  10. 5 }, s- ^: e. a0 Z, ]- f
  11. def download(part): # 下载一个区块
    6 i0 z, H- g; [( a; f
  12.     words = getwordlist(part) # 读取单词总表' ]  o* f4 G' x+ i7 `: p& S! s
  13.     if hasfailed(part):% h/ K/ v) y7 Y
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址
    : Q8 w8 v0 ]. X
  15.     else:) U- G, S6 w3 z( r
  16.         word, url = words[0] # 首次从头下载
    2 d1 e0 P0 V5 o# x( E! u: o
  17.     data = [] # 用来存放单词定义
    8 a" y5 \: Z* r
  18.     while not_end(words): # 循环下载
    3 ]) B  f; R( q  V+ y& T
  19.         if not fetch_a_word(part, word, url, data):
    4 Z3 j8 h* @* D! Y% L9 {1 s2 ?
  20.             failed = True
    ( {( i% V0 [+ ]7 P0 ]
  21.             break
    6 ?: W* x' w7 G
  22.         else:
    2 L  n. Z( h; X; ^6 j1 x
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址5 c1 N3 ?1 ]+ f' b- X
  24.     if failed:- U+ A, A8 @) j3 x! u& l4 {2 b+ T
  25.         suffix = '.part'
    ( Y* q3 m" t3 b5 F
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'
    , N) }$ X% H+ i. X
  27.   D2 t6 h( z5 H+ F- g
  28. def isfinished(part) : # 判断某区块是否下载完成
    6 p$ ]& q/ u' T
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断9 q. B5 T9 {" ]$ [9 c% w/ i5 n
  30.         return True! s% L# {& I/ p+ f* u; a2 T& ]3 b
  31.     else:
    & |% ?+ U9 o! F3 [8 D
  32.         return False
    ) t5 a4 C- b7 A# y

  33. . _! Q$ w% U' @6 d1 t# f; s  ]) M/ ~% m
  34. def downloadloop(): # 循环检测未下完的区块- p* M5 o% U$ n+ l- ]6 ]
  35.     finished = 0( }, {; P4 a: R$ N+ v; c7 \* j6 _
  36.     while not finished:2 J. p3 {$ n; u
  37.         nf = [] # 没下完的区块
    9 Q$ B- G3 S/ r: d9 ~
  38.         for part in parts:
    / p8 B. S+ ^; N8 T5 t* m/ b
  39.             if not isfinished(part):- \/ S% j" [: T+ ?  L8 w
  40.                 nf.append(part)& ^. N/ {; [+ R8 m+ m$ G
  41.         finished = not nf
    + o3 s# d3 l. e& G3 w6 b2 G5 k
  42.         for part in nf:
    7 S( [$ N* C! r+ W: l3 e2 N( A
  43.             download(part)
    3 d: f! |  Y) Y8 H$ ?7 y8 N
复制代码
% M9 `$ n- e) h3 f* D/ g' E( U' \
& p" C. P1 f6 a2 G' |
III. 高速下载网页的小技巧  x# S1 k# n+ s7 M
Python里面有三个库都可以用来下载网页:urllib2、urllib3和requests。% S9 y4 q* i7 Z1 Q! k$ L/ T
其中urllib2是Python原生的,urllib3和requests为第三方库。
$ o9 W1 V1 ~8 `(似乎Python3已经把urllib3收编为正规军了)
9 @( c: }7 Z0 |  V) G5 j5 z这三个库有什么区别呢?& J' I  x" }' m& E( L
形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。* |; X8 _) @- W' `
再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,
. h1 I! [4 X/ t1 [6 s5 h# l0 c所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。( z/ D7 Y8 Q6 g/ ~) D3 ^+ k0 c# _
但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。$ u# z* K0 v7 i: u' j
这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,1 i- I" Q* B& U* ?( ^  J
通吃一切网站。2 k. g# v$ V8 Q. }) T
所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。
/ R- y2 ~" o& F) Z' z2 j这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:
6 F$ }1 F) P1 a: g+ L2 C. D  y0 vhttp://urllib3.readthedocs.org/en/latest/
5 E+ j4 U6 L0 Q. e9 H4 Xhttp://docs.python-requests.org/en/latest/! }; }, i- h; N/ ?( H0 u# I0 [+ {

  1. 9 D0 [# F: @6 O9 [
  2. #urllib2
    & K, K/ V. |% ^
  3. import urllib2# ]9 S! H1 R, C/ {9 [! X
  4. def getpage(url):* }9 C# u5 K; p1 ]3 W6 o
  5.     req = urllib2.Request(url); @0 W+ V8 `1 [$ u9 b# K7 F3 p& [/ D
  6.     response = urllib2.urlopen(req)
    & V; S! Z$ _" ?3 D, o9 i
  7.     page = response.read(), B6 y! |% [1 w" n2 P& F

  8. # R6 g! D& z' J9 g: E8 W& _3 E
  9. #urllib39 Y" L7 }6 b+ l2 F
  10. from urllib3 import PoolManager1 Y$ ?  n0 ?; P- @1 ~
  11. http = PoolManager()3 j6 P6 w$ P4 k" C% z! }% X) z
  12. def getpage(http, url):
    , }* s3 I8 ?2 p3 u
  13.     r = http.request('GET', url)
    ! G. D% ~9 v; B8 E( G; ]6 p
  14.     if r.status == 200:
    + H+ @% I2 a% _: Z6 v( M* M3 N- f
  15.         return r.data
    8 H8 F4 ]* U. |" y2 T
  16.     else:0 z1 t9 y- R3 Y4 l
  17.         return None* W) }) P. z' V; Z2 Z# A

  18. 8 C/ v: }3 r6 t4 M+ x8 u
  19. #requests
    % w! O6 V( |" u9 y. C) @) G
  20. import requests
    1 g/ E; v+ G4 u& Y$ b# }6 \
  21. session = requests.Session()  \5 x5 l( I4 F
  22. def getpage(session, url):2 \* n+ H1 [! B: l/ i  Y
  23.     r = session.get(url, timeout=10)# t7 S" a+ h2 o! T
  24.     if r.status == 200:& e$ P8 [1 I% Q+ }
  25.         return r.content
    7 b: s2 z  N9 t
  26.     else:
    * b3 I4 B/ V+ L$ x  g2 x
  27.         return None) o+ A2 g4 U; ?- l4 J- l
复制代码
$ [2 }) z+ h4 Z6 c
四、后期制作
7 k; R' M0 e" ?1、文本处理,是个特征识别问题。; z9 s) b, s; o9 F. O. h
本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。. K. w) w( O, C, d. S( [( _
当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)
. @  n' p9 k, k* A/ l8 R4 O都涉及到特征识别问题。5 x4 B  g( \# c' J+ Y7 e. ^
相比这些高难度动作,文本处理算是比较简单、基础。+ m2 D3 n# l0 Z% r5 N/ K3 S
Python里常用的文本处理技术:正则表达式、BeatifulSoup、lxml
! o6 {, ^! K  J6 X正则表达式非常强大,但没法处理递归嵌套的标签型数据
1 l  u# M# {  v# q" _: `(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);/ A; e! |  t* r/ R3 K6 d" o
BeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。; y: A, Y3 {! K5 W9 f5 }4 m1 B
所以常常要结合使用。: W# i8 g, R! ~+ _. O' F
这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。
4 W! ?" l9 M. r$ @0 b: ~+ e0 m( n& y7 w) f: V1 G7 `
2、排版
: G" o: q; D% t0 o; y' u/ W2 CHTML、CSS的基础知识:
! R8 t2 I9 P# T* _3 @& j# vhttp://www.w3school.com.cn/html/index.asp! a% U6 c5 i6 q' z# q
http://www.w3school.com.cn/css/index.asp
0 u8 ?  n6 |0 K1 |/ Jhttp://www.w3school.com.cn/css3/index.asp% J+ U% w5 v$ M1 N1 _
非常系统、非常全面。
, N4 _1 K% k, z4 m2 C4 s排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。
. j5 v' y) Z# Z- Q! H4 r) o: x$ W
  H9 \2 ^2 m. Q9 k* ~+ E; j) x五、结语2 W" P8 Q9 {% D! ^
花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。
! C8 F# [8 c! {所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——
$ n# A; _# b9 p: @( |大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。
* d" w5 W9 g; X
  z1 a- R7 v" ?# H: E8 u打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。
) [. s& C$ ?. X; Y3 Y, b9 _) L$ n5 s/ X# q/ T
只是拜托不要打扰别人,真想要就自己动手。
: V0 X- K! t! Y5 x+ H# i# o( E9 ~尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。% N5 H! |7 p% w. l7 t# Q0 D; D
水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。' E1 ?8 b! s" t
虽然每个人都觉得自己至高无上,应当受到别人重视,7 d( V9 H+ Y) `3 ?6 u1 y
其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰1 g) p8 N& `* F4 n* r

2 U: l* ]3 _5 v; B
4 w; C3 q0 E6 o5 J+ ^6 q# I# F& ?========
& i/ L  h& m2 g! X六、拾遗
5 F; m/ V, T1 y, P( ?( Q关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类" A% c& M  c# [6 `- t' i5 J! Z, R
确实如此( W) q0 |4 f6 m8 p$ c3 M$ ?
不过这里只是举例而已,不用太较真啦
2 I! S! h1 l4 M5 J  V实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏9 q! U+ M* c) Q
这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。' w( T) {. ^' \; ~
即,8 T6 x% T$ P% K. a" M1 m
第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)1 R1 p  d& x$ T* k! m
第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)9 R9 u1 x7 h/ m
第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作& d1 i, W; c+ F
。。。
; W& O3 g% |) ]9 y$ _直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空)
7 V  p. B  g: d/ n& o最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。
" N: J! b& A& l' v, b& B形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。2 F4 c* F3 Q: o( Y% f: o
因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。
$ A" f5 N0 d. \# v4 ?. C

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:411 F' M3 \. E. k1 @: _
感谢楼主分享知识和经验。
% t& C( W3 y# R; T7 T  m' s# K- k/ U4 o$ _) h0 V# O& u6 [& g
每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...

( X/ G" B: @2 [$ c* T: c现有的mdx词典,其实足够绝大多数人用一辈子的了4 p2 L3 c3 M* g- g

, ], _/ e: ^4 g; w; F% R1 d' }1 g$ o本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。
5 F# `6 s1 X4 {& L$ b4 L# z+ D1 j% W1 P' b. [, ]1 n, S
本人最常用的词典:0 v( [7 t$ n6 t6 s  X7 t" t+ [
主力阵容:VOC、ODE、WBD。
) T* r1 ^& ?1 w5 x3 [三本都是中型词典,收词量均在14w上下,以本人目前的阅读面来看,还未遇到这三本里面查不到的单词、未收录的义项。据说史上掌握单词量最大的人是政治家兼散文家丘吉尔,也没超过14w。除非钻故纸堆,恐怕用到W3、SOED的机会不多。$ c0 l- s2 Z4 f4 m
- y! |- {  k! v3 [  \3 e$ f
替补阵容:LDOCE、词源、短语8in1、韦小黄&韦小绿、Garner Usage。2 O; n% H4 V# z# t4 r5 U
LDOCE用来查常用词的惯用法/搭配、语法信息;4 C& Q/ Z* j& ^( n" Y5 g3 W
词源用来辅助理解、记忆单词;9 o7 L" X; U6 l0 k. e& x# Z% |
短语8in1用来查漏网的惯用搭配、非正规用法;
  F6 }$ W0 P' q, H3 n韦小黄/Garner Usage用来辨析/比较同义反义、正误用法;5 k& H' ?! F" {: X6 L5 o
韦小绿用来辅助理解、记忆大词。小绿真是本好词典,有人说里面收的单词都是一辈子才能见一次的那种,其实不然。它虽然只收了1400多词,却几乎都是高频的大词。从本人的使用体验看,查得率相当高。比如最近看新闻说一种超大蜘蛛,里面有个词arachnid。别的词典只是干巴巴地说4对脚的生物之类的,只有韦小绿说了它的来源:从前有个女孩叫Arachne,编织技艺了得,把雅典娜女神给比下去了,结果激怒了女神,被她变成蜘蛛,终身织网。这种解释多有意思,看了永远忘不了。" o" `4 w9 c! V; F2 b' Z
* `7 T# R& L: P" H1 R7 T( d# w, x! I5 I2 Q
上述词典,坛子里都有,无非是版本新一点旧一点。比如朗文5和朗文6,有人统计95%以上的内容都是一样的。如果是完美性格,非要用最新版,那就只有自己动手。不会有人在词典出版的第一年就去挑战版权方的。
% U8 z+ c4 H# n6 l+ H“对于好学生,任何教育资源都应该是免费的”。虽然本人同意这种说法,也认为现行的版权制度存在重大问题——有人靠垄断知识获利,却完全合法;但是本人从未打算挑衅版权方,更未想过做Aaron Swartz那样的斗士。靠垄断知识获利是有点无耻,但如果没有利润,也就不会有人去做整理资料的事,这确实是个难题。
/ v& P: ], ^8 C5 r3 h& ^) {3 Y
2 f1 H( U9 Y2 s) N/ {还有些人没事喜欢收藏词典,收集了一大堆,却从来不用。说到词典收藏癖,想起以前的一位室友,那家伙每天最大的兴趣就是下载影片刻光盘,大概刻了几百张,还在不停地刻。但是从没见他看过,他也不让别人看。7 J7 C5 F; L- s5 D+ ?8 d3 a
这种癖好大概是来自于原始社会的一种遗传,人们总觉得应该储备点东西,说不定未来某一天就会用到。其实那一天说不定永远也不会到来,不如就把今天当作那一天好了。有多少人买了一书柜的书,到死的那一天都没看完,甚至有些书连封皮都没揭开过。
% ~$ w3 U5 ^3 Y* y; \$ v4 k, f6 \

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。
3 m8 s* R! u. @6 U# C3 \8 \其实只是你没有发现而已。
4 L$ r7 X  V$ L& HODE: http://www.oxforddictionaries.com/browse/english/2 e" D5 C8 q' e) B
RHD:http://dictionary.reference.com/list/a/
0 a" L" ?/ U. j# B' FCALD:http://dictionary.cambridge.org/browse/learner-english/
, K7 N: U$ J( S
1 O. l1 t8 w8 }; X% `! k如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。
7 y& i: H  [+ b2 n7 ^以第二个为例:. v- d/ A6 v: k5 r! K! Z3 g
inurl:browse | inurl:list site:dictionary.reference.com
; ?' n# J8 {; f; w' W. _( ^& A! r/ L* _4 A( h! H9 W  Y7 O
PS:最近才发现这里,发现资料很多啊。4 w9 J5 O, G5 g/ b7 @8 F; N

该用户从未签到

发表于 2014-10-24 18:41:00 | 显示全部楼层

' |& Y7 K1 s; o* t+ t) j! i( Z) U) ~; p6 m8 c. L" x
7 `2 U: S' k' \! V3 m9 I  M. j
% Y* V+ M0 x% b( d. L
感谢楼主分享知识和经验。
7 t0 @0 e/ \( d# s3 A) ?5 G5 [( X0 a4 p9 B
每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。
; S2 }3 G0 K* F2 _  |5 ]5 T; }7 \2 L9 e4 J9 h
私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。
5 R! T) \( d) n$ E3 T7 v6 U/ S* _  ?9 [( K
% W0 K/ @6 [2 ?# L( l9 r$ Z但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。
% m, ^' P) t6 ~
9 Z0 {- x, r$ ?除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。8 k/ ?- M& P& F# z$ F$ d
* @' h! L6 d! z# f4 T
3 X: |* o; i0 v$ [

+ c) S& o- J# T. I- T; f! p6 d! u3 o8 ~& I) r/ Y# t

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧
8 z! O  ], X; k  `
  g! k! H/ }+ S假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改
, O' @/ n7 D( `3 R& N: v或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下
0 ~+ C( P2 z1 {5 X7 B4 D5 r5 D结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。
; R, w1 w0 _6 N" p* S这里有个比较省时省力的小技巧,可以快速定位到想找的地方
9 e6 b, E+ l! B- N" M
. s5 x, P" e. u3 _1、Goldendict里,在想修改的地方点右键,有个“审查元素”:) I/ v3 U% r2 k6 i  r, k  o
, k& d$ ~  w! V) _1 J+ T7 [

! l4 M2 ?) r/ T7 X! F2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事& h8 \% m$ h* S9 [9 q  Z
8 l2 O6 A9 n4 Z- \
. `; e. Q- A# C
3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方2 ?3 s4 Z; I( W% E
/ n% ?8 U! G1 z

1 ?+ b$ j" }  u( T" s; K收工

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件
4 c6 v1 R, h+ Q: T2 J
  • EmEditor
  • Beyond compare
    % n! U& U2 y( B7 o6 N

9 s( R6 ], w9 i+ f* X, h# @
, H: r6 f" l- ]9 x前者用于编辑,后者用于差分比较
# C% y. O2 X( O. k- n处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考- T& N9 i4 Y; V5 L5 }8 W
+ P4 Q6 [, g( D
网页设计中最常用的字体有哪些?(中文和英文)
& T! g8 R% l; O5 Rhttp://www.zhihu.com/question/19680724- N$ h2 y; {! R* p( u: ^7 L; I

6 F- G% ~& ^7 v0 E' \0 @4 j本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode
. R3 K& m9 F- O7 |* X这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全
0 X* P& z; X6 A9 l' v" Z另外Open Sans字体也挺漂亮
8 i$ h9 S  c% G' m0 o5 w9 X

该用户从未签到

发表于 2014-10-22 21:25:59 | 显示全部楼层
bt4baidu 发表于 2014-10-22 20:21& J2 L  N* R; y" o; i/ o
最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...
  d8 S4 j5 N! _- S
多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。
9 r1 g1 X' m4 t' J. Y( y# {! Z
8 X# ]7 Q% Y" I# |6 e我的一点网络小技术是很久以前在X客基地学的,当时花了几百块钱,没想到有些技术到现在还没过时。抓dictionary.com的话用一般的软件就能搞定,老牌的离线下载小软件(如offline等)或这几年流行的火车采集器(www.locoy.com)都不错。

该用户从未签到

 楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
大熊部落 发表于 2014-10-21 16:18! ^* B& h8 V% u- h9 c( s) j$ Y0 B
用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...
* y2 p* o0 l4 Y6 Z, d
我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件; n0 z; P: J- S

4 J) L5 `0 J1 O! ~# B7 U6 _
下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。

7 o; n, q" Q: }& ?/ l推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

该用户从未签到

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

该用户从未签到

发表于 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 编辑
    : T, {7 ]% a  M$ v; r- a
    $ ]9 E" y+ }+ |( O' @0 d写得很好。刚看前几行的时候,的确激动了一下子。虽然没怎么懂,但是第一次能坚持把这样的东西看完,觉得也是对自我的一次超越。谢谢!

    该用户从未签到

    发表于 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的每日心情
    开心
    2021-4-9 21:23
  • 签到天数: 48 天

    [LV.5]常住居民I

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

    该用户从未签到

     楼主| 发表于 2014-10-20 20:22:48 | 显示全部楼层
    本帖最后由 bt4baidu 于 2014-10-20 20:25 编辑 8 Q% w1 m1 A& |0 G6 o" T6 V
    : h% W% Z; r& L
    java和.net就是个垃圾,我懒得提而已- n" s  k+ z# D' J4 k& ~) A
    在Linus这样的大神眼里,连C++都是垃圾:
    & w- ~: I4 @" hhttp://www.csdn.net/article/a/2010-06-12/2187851 j; p+ u' A) r" O: Z' k

    4 q4 w; [, v, f! ]9 q如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。' F7 R/ O2 z0 R# H; w. c$ X

    3 g: z, N" k* s' t$ M不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。3 B3 s* m% ~2 C$ a* K7 {* |
    我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。  o. T( \. S! }, m& U
    这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。
    3 h" }4 a* G9 [" I, Y: N* i7 Z0 t不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。8 P, @6 Q* R; W, B) ]* x& [
    为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?! v0 M7 u$ _! d: D
    因为垃圾代码太多了。" V  F* ], s# L0 i$ f' ]) k* s

    , Y  q: s8 U+ @
    - ~) E: T  ?- L: W7 @+ ^' a

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑 ; P4 ^& s3 K4 q" K! _& F

    ) _, i+ I% f4 Z+ o8 K. w! X' B* W: W& u, v
    算了,道不同不相为交流
    " `9 G  f' b! J3 K4 i/ X想起某个梗
    & l- `/ H( I- w8 b% [+ u程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!
    : g% k3 |5 e; C% y  f% d: k& r9 d/ l; v, L5 E- m) W
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。& t7 w( `2 j! ]3 p) e

    2 h9 w  @7 J0 Z另外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:078 W9 t1 w" G2 P6 g
    算了,道不同不相为交流" U5 H" U5 c% `/ a  [
    想起某个梗! H0 r/ N, t9 N; T5 K
    程序员眼中的编程语言
    " P( o; D) z% n7 b$ X* f+ q
    不同的语言适用于不同的人群:
    ( D3 V& @# b% p# a- S如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。
    0 ?) s3 d) }5 e如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。8 G. L4 s, O- ~! j
    至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。, }3 x) e' P$ ?; f4 r. I

    9 d" R( {" j; s编程语言的口水仗永远也打不完,不争了
    5 B/ P/ k7 R; ^/ f1 h( g

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:35+ p1 D) }! y" h/ Q
    不赞成多线程抓网站,但是好贴子要支持!
    9 L! n: z6 k1 S" @9 {7 j. \* s) n1 V) a4 k
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...

    ! W8 A3 h( b; s" R+ X) `  e下载软件?推荐一款?
    9 i/ K" O, r' B9 {& U$ p% w: C& M最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;6 z% U* t2 n* l2 f' Z; @; _3 j6 D
    现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?: K' L/ s+ S7 S* u' p7 B
    比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。/ a) f# g  e2 n8 X" W: H' X5 h, V
    除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。
    5 }/ ]( N$ d/ ~0 [5 D目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。/ b' `; z+ g9 I& _0 G; h( c8 B
    % e6 A3 ]9 d. m% \
    至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。
    ) {' y# n' f7 ?( t0 W" e对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,' c" f' t! r; s% X: _
    目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。
    & m, \: V7 _( ~0 t3 \

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:
    1 S, Y# e1 S: U1 R随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。% C4 X, @4 J2 G/ h2 c, _& S2 I5 l7 j
    未来会出现一个新的行业:私人计算机管家。+ P0 W* r1 e' K
    专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。" M; T1 R) t- D- r* y* |: D8 M
    但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:29
    6 y! Z  Y& t! U( n- b. A& @下载软件?推荐一款?
    $ n. @5 X! [5 I$ }最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    " V2 d- F9 a" E( @- C现在99.999% ...
    ' P: @9 d, b+ F$ j, G
    用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
    1 @' i. z# b1 ^- L
    3 [2 ^% F! ?4 ?0 h  [+ X$ ]) e2 R8 W十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。$ F1 o9 u7 |. z
    * i" V0 t# e* I+ v7 B5 x. P% C6 _
    用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。
    7 f/ K! `# }8 J6 W. L1 q, O: D+ Q; o; n5 d
    我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:21:14 | 显示全部楼层
    平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。
    7 F0 S& P( I+ I: q
    + ^7 \+ B# u3 K6 N0 j
    最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差' u2 M5 h$ T( D5 B: J( h- l5 D
    计算机是用会的,不是学会的;
    * F, K) ~0 z. {, o程序是调试出来的,不是写出来的5 t+ ~- J' N- e- ], I$ O
    8 s& t* w" u/ L( s( Z2 B' E2 u
    既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。: ]) U# `" \0 X1 ^0 _( ?
    你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。
  • TA的每日心情
    奋斗
    2021-2-4 23:25
  • 签到天数: 166 天

    [LV.7]常住居民III

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

    本版积分规则

    顶部qrcode底部
    关注掌上百科官方微信公众号送积分
    关注掌上百科官方微信公众号
    关注微信公众号 pdawiki,获取邀请码,看文抢积分,抽奖得浮云! Follow our Wechat official account "pdawiki", get invitation codes, and play the lottery to earn points (积分)!

    小黑屋|手机版|Archiver|PDAWIKI ( 美ICP 0000000字 )|网站地图

    GMT+8, 2021-6-18 07:59 , Processed in 0.056235 second(s), 10 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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