掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 32840|回复: 141

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

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑
9 g6 O4 P' G/ z" z  Z( {1 W* H' X# f0 v9 _5 N1 ~
这篇文章主要是给计算机小白和初学者扫盲。9 ]5 R/ J* n$ N/ g. }
本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。+ W+ `0 ~/ }3 \% \3 R  @
只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。
2 y; d) c8 |: C" z& I) E! H3 G; p5 _9 I+ ]* r
一、计算机的两个终极哲学问题
$ p( D2 k) L9 |  l& \1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。
* G+ c6 \$ @% v* V1 L6 }# X- W图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:
9 |8 n8 e. F& V- x设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;
$ P8 z+ K6 W0 x( v: _/ |: w机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。
  `9 F# n1 y6 R3 Y) ?* U( C方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。
8 A$ ]6 G1 [7 @$ F“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。( U7 X1 l, u# w& W) L- L% f0 W
% J7 S& M, @3 X
那么要写出程序,立即就会发现不得不解决两个问题:6 p! s$ N! P+ r8 {5 P, z5 O) ^
1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址; D. i  v! A* t, o3 `
2、怎么把两种方格区分开?也就是特征识别) S% {3 v  G9 }: m+ f
这两个问题,就是计算机的终极哲学问题。; i3 X0 D' ]  f
理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。
" M* g* D4 L) y( Y3 t, z下面的讲解也会以这两个问题为核心展开。
" l7 _0 M' S' k
" s7 y. Q+ n: j$ ?# bBTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,
9 T/ @: p; M  }% D! Z, j, U——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。& \/ b2 R5 ~" Z: |
所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。
. w/ d7 K! P1 W& _8 y+ k1 q& i0 g前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,
5 d" }0 f. Q% S! E. i! L- C而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。8 l# l! Q. F* C& `9 |. K8 d
具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。) {5 r8 I& b, p8 v
; U1 R% h9 E4 ?% @
不要觉得自己上学时学的不是这个,or文科生,就不行。; h1 e, y" s) r5 L. I* }* L
江民杀毒软件大家想必都听说过。& {' N+ L* V5 F9 {7 v  t) y5 \
创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。
7 B) l% _3 ?1 e6 ?7 E  j咱不奢望成为专家,写写程序总还是可以的吧?# B5 w' o2 x5 K( v* H
+ t* w0 J% _" I1 X
二、采用何种编程语言
" F& c, Z7 o/ d/ `' m6 R2 L上面已经说过,存放、读取、组织、区分数据是编程的核心问题。$ Z2 C# H: N% V1 s$ b6 z$ H
显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。
9 O5 v# g% }0 [! c抓网站,恐怕没有哪种语言比Python更方便。7 J! Z3 U& R5 T1 }: m1 w
当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,
  \% p2 b/ c: o计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,
0 K  n4 c8 ^1 c7 W. S4 l) [) i没有慧根就别吃这碗饭。
$ p3 H; _+ J- e, V. f3 S7 B1 x1 _
) A0 T* ]* o# }5 t1 w三、网站抓取技术& M" u3 K! W, D
1、下载某一个网页,提取其内容
& u2 p, b) b/ Z6 r以前写过一篇,就不重复了。参考:
" |8 f7 o  F4 o  y( @  W; `1 W用一个简单的例子讲讲怎样从网站上扒数据; k/ g$ F$ U7 F& d, y; c$ K: G
% V: t+ E. `% e/ w  P# p) U5 R
2、寻址问题2 n/ o- n" A0 H+ v
下载网页,自然首先要知道网址,也就是东西放在哪儿。
2 z1 I% B7 ?5 M* D如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。
1 }( w' P6 _, z8 W6 ~1 j但是大部分在线词典,到底收了多少单词,事先是完全不知道的,
) Z7 y  J3 Z) O$ U/ b5 e; R0 n( Q- m# b要把单词弄全,就要想办法得到每个单词的网址。8 W8 q# W. A- d  G
总结各主流词典网站,大概可以分为这么几类:) m; F( i* B4 `) w) z/ t! S7 y# D
I. 事先有单词总表
, s+ ^7 f2 T5 x" {( I& [2 y比如http://www.vocabulary.com就是这种类型。2 K& H5 k: ^0 ]! J8 v$ ?
它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。' {: o6 e) o: p8 j
+ {3 @* _: ?( n  N- ~6 h
II. 网站有索引页面
1 l9 C7 e+ x* s( y: K如:# \' O( D& s9 m& @
OALD(http://www.oxfordlearnersdictionaries.com/
) e$ ^, p0 \# ^$ {; Q! d3 s$ ^它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/+ h9 K2 n2 Q; @0 P
LDOCE(http://global.longmandictionaries.com/) r$ M7 _1 \& m3 w' o' @
采用框架结构,左侧边栏就是索引页0 F$ J6 Y$ Q3 P4 \
MWC(http://www.merriam-webster.com
# {  ^6 m' q: ]' ]- i索引页在 http://www.merriam-webster.com/browse/dictionary/
3 W" {$ O8 J, h  v( B9 H: J- [等等- ^% V# b0 e# b$ m6 b
这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。! b& ?1 R7 r( R- ~4 C/ {
  1. 7 j& g# z5 I) j* z( `2 U% K) A4 ?
  2. urls = []
    / z8 L5 \. X0 G3 S( h) l
  3. for someindex in indexs: # 循环所有索引页
    2 w5 r4 ~5 r8 t. ^  g5 S
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex])" |$ |7 ~, F1 G
  5.     browsepage = getpage(browseurl) # 下载索引页面
    8 M1 m; s0 a& w( _6 ~$ H
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域; U4 p* Y$ e- Z3 P/ D8 v. b$ E
  7.     bs = BeautifulSoup(browsepage, parse_only=target), Z# @3 T& o% c3 w# y) ]
  8.     if bs:
    9 b8 w( T- n9 V
  9.         for a in bs.find_all('a'):
    * Y& k9 J7 E' o3 Y) ?, T  {
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接) E$ j; ]' z. y4 ^* p
  11. 然后:
    & {& o' H. V# Y7 D
  12. for url in urls: # 循环所有单词: k: v! J: I& V9 C: {  ?
  13.     wordpage = getpage(url) # 下载单词页面
    # F4 ?+ O* a' }4 D! U
复制代码
. P" ^8 B4 o1 c2 b) O4 a) [

8 F/ f* `; w/ c3 H9 l( GIII. 索引页和单词释义一体型网站6 ?- p! K( e  {' g
如:Online Etymology(http://www.etymonline.com/* d& n# K* F5 k' r- I6 [7 d
和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可
: s% y6 F7 [' t4 l2 N

  1. 3 K1 f3 w& Q$ F% F; Y
  2. for someindex in indexs: # 循环所有索引页. ]9 Y* A5 D% Y, M
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    : g5 @2 a) R; {
  4.     page = getpage(browseurl) # 下载页面" B5 ]* @  ]  w2 Y( R5 D0 e
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域! _6 b' k6 R7 z) t7 _' _3 |3 o
  6.     bs = BeautifulSoup(page, parse_only=target)/ W# N; R! |& F" k% l
  7.     for tag in bs.find_all(target): # 循环抠出单词
    9 ?9 F' I( X3 g( A
  8.         worddefine = getworddefine(tag)8 t5 b- N; A( m+ O( }: T
复制代码
1 Q: f& L. ^. ]! w5 n9 ]6 T& j

8 ]# q6 X- Z' z1 w5 r. {IV. 片断索引型网站7 \' \* X+ g# T7 [( V
如:' Y. Y- j: z5 `/ r+ K/ F
ODE(http://www.oxforddictionaries.com/
. L) n3 z' k; Z) P, l& d# \每查一个单词,右侧边栏有个Nearby words/ o) X- K8 A$ e' e* l
RHD(http://dictionary.reference.com/
$ o  p# u) _, V* R# @: _右侧边栏有Nearby words
) z) O+ a& |2 }, l+ R1 Z3 Z: MCALD(http://dictionary.cambridge.org/# f% Y8 G; v" Q& A7 a
在页面的最下面有个Browse栏,给出前后相邻的单词
& c7 _0 i7 \7 r这类网站没有总索引,只好利用它的Nearby栏。; q0 O) x( y* I1 [5 W
思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,
6 c; _5 S9 l' a7 Y  X每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)0 i, S& \* A* o/ |1 p/ e6 G

  1. 9 ~, U# X' h7 Y6 ?
  2. cur = 'a'9 P# n. x5 B- Q3 z. a# @
  3. end = 'z'
    1 \2 j* x& H3 y4 s
  4. nexturl = ''.join(['http://somewebsite.com/', cur])
    + [# n$ d6 x6 I) K( Y& L" |2 i; q# y
  5. while cur!=end and nexturl:3 T2 X% c. p: O6 P* _& y6 B
  6.     page = getpage(nexturl) # 下载单词页面( J, c& U7 Q+ m+ D. G
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接
    1 X/ }7 r# K" c# E+ t$ n- [- t
复制代码
* v& c2 {' z1 v6 l  ?0 `& I  S
: c9 M0 D) S6 u* _* C5 i' h
V. 完全没有任何索引,那就没法子了$ t$ C% c! [/ ?, |
当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理
1 R& u4 _$ z' m理论上也是可以的,就是效率差一点;
6 U5 p9 d, l! I# c: R& [另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。& _- x1 v4 S  e
! @# m* ]; n9 C, ]; `* A+ _: _5 e
3、提高下载效率% A7 @3 s, o) V2 O1 F- ^* G
I. 多进程
0 D% k+ n! s" _: z上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。. u$ D' ^7 ]0 F1 |
实际抓网站时,这么做效率显然是非常低的。7 {; P6 r$ i3 N  L; @/ h# c- z
假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,% ?$ F: U# m$ r( B) D/ Z
有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。& [- d, G5 V- T
假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?! ]! Q' U! E+ L5 K, e- D$ z
要速战速决,就得开多进程。  @' Z) U5 O- |4 m! M+ N" D% k3 N
同样十万个单词,分成25个进程下,也就是28/25=1个多小时。
( ^6 f4 D8 k* \3 z$ k3 H再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。& ]6 o5 J- M1 w
在Python里开多进程,同样十分简单,* b7 I: I: \( w

  1. # @! ~' T5 M+ X7 L9 B
  2. from multiprocessing import Pool
    8 a" ?8 s7 w8 c4 S9 [1 Y3 e0 }
  3. pool = Pool(25) # 开25个进程
    , }- I/ v$ N9 B5 e
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数
    ' b! B) R5 j. O
复制代码
& t9 j$ o+ U1 l7 ?/ B* a
这就搞定了。  A8 d1 H! N" i9 p' \
# Z. H7 m; a) @$ ^# c7 X
对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,+ v$ t5 Q7 F* E
关于IV.,事先没有单词总表,就只好采用区间的概念,3 {; i6 g* g/ c
比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载
( K" n4 o; [8 a7 j
( v4 r7 F- J% h初学编程的人,一碰到进程、线程,常常有种畏惧感,
6 X! ~- p2 d& g. b8 M# k看到同步锁、共享内存、信号量什么的顿时觉得头大。
, Y1 c' l" A5 m- M* S" d# H其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,
9 L, g0 q: o, ?6 l* ^# \其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。
. r# A5 C  ?' `  g! o% P& D# m& F# b- E  j: f$ U+ ^& y
II. 断点续传, a0 o2 Y9 B% i+ y; b" F. u
事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。* l6 {! t* e7 y# l, a' m0 M
所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;% |+ ?8 w' F, V
即便无法自行恢复,也得容易手工处理,不然可有的烦了。3 @- E, n" V# e8 R9 q9 T! C% |/ E
这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,* w# V, z3 `- k, x2 s; R% g% {
直到所有区块下完。
# R! |8 P6 w: D

  1. 8 K% N; n9 C8 w" e; w
  2. def fetch_a_word(part, word, url, data): # 下载一个单词0 o6 z' H& g% [# D$ P, I
  3.     word_define, failed = get_a_word_from_website(word, url)
      B) K) }, j( q* W
  4.     if failed:  ^7 B8 |7 l: }, j, g* M% i
  5.         dump_failed_word(part) # 输出下载失败的单词及网址
    : x. k8 ^7 H0 k9 C5 }0 {# I/ g
  6.         return False
    # _0 K6 X$ I2 M* d5 ^% Q
  7.     else:8 W9 t6 j( P' ?( K+ A
  8.         data.append(word_define) # 保存下载成功的单词数据
    $ t9 `* r' i5 Y! g
  9.         return True
    & ~! Z4 K* U  L( u- n0 E* z
  10. . {. f5 n6 a6 ?/ o3 |$ ]
  11. def download(part): # 下载一个区块/ I5 ?8 W3 H+ o. K+ d1 y% J! m2 ]
  12.     words = getwordlist(part) # 读取单词总表
    ; G2 z: o! V( d2 B  N( l8 z0 I, s
  13.     if hasfailed(part):
    3 r: N( ^# \: y+ D+ C4 K8 p/ a
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址' ^1 h( u! S# E8 A+ `2 z4 ?7 ?
  15.     else:
    + ^# b  G. r! K+ A
  16.         word, url = words[0] # 首次从头下载
      \2 y/ E. E# W3 P7 Y8 b) f
  17.     data = [] # 用来存放单词定义
    / p5 ]8 g0 J2 }; l/ c3 P: f
  18.     while not_end(words): # 循环下载' U* c' [/ j) {! l2 l# j4 ~4 l
  19.         if not fetch_a_word(part, word, url, data):$ e# d' W. {- a' n8 h
  20.             failed = True
    # L8 Z+ `, C: q  ^% [
  21.             break+ b. x+ W7 n3 s" c
  22.         else:6 m: d) O: V3 }- C+ |. t
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址- f. p& @" |4 d- E/ }
  24.     if failed:- K/ N# P. j2 E' h
  25.         suffix = '.part'1 x0 D6 w% F- m. |
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'1 G  n4 h: t7 N8 J# O

  27. , g9 t- z* V! p" j" ^/ k, b
  28. def isfinished(part) : # 判断某区块是否下载完成
      `  h* L3 k* ]! E: k
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断
    1 F; l. l" u) Q4 y6 [
  30.         return True
    # m7 i9 z2 [3 Q$ e" E' e
  31.     else:
    5 g1 T! U1 o; J# W/ ^
  32.         return False
    5 y: k4 r, @8 O2 R
  33. " a8 @8 |1 \. M  C: V4 }. @! S& _
  34. def downloadloop(): # 循环检测未下完的区块/ f1 a  }9 A# d, d5 X
  35.     finished = 0
    : N! _. ^/ v6 \  I) C* V9 F
  36.     while not finished:; [8 D2 o, e8 ^$ W
  37.         nf = [] # 没下完的区块8 m  D* A1 c2 |* m! n" x2 m5 J3 x
  38.         for part in parts:! M, L0 e5 [6 t. |1 t  r9 K
  39.             if not isfinished(part):
    + p$ \7 M7 X& K2 K' e
  40.                 nf.append(part)/ D7 A3 x0 S" y6 ~+ t6 ]
  41.         finished = not nf
    & {/ u0 ]: H& ]) Y# L, f4 @
  42.         for part in nf:
    " P, ~. [: b7 V
  43.             download(part)+ ^) q) }9 R1 c0 i3 U, v4 H$ J
复制代码
, N9 h. {( W: l
/ t1 r! _/ I$ I9 ]3 E# d" w5 I
III. 高速下载网页的小技巧" u) Q3 d* K6 g6 i" ^8 p
Python里面有三个库都可以用来下载网页:urllib2、urllib3和requests。
5 x: o" S/ c- q/ z8 E7 b( W其中urllib2是Python原生的,urllib3和requests为第三方库。
# `7 W5 R. T+ Y& G(似乎Python3已经把urllib3收编为正规军了), w4 t; ^1 s- {; }
这三个库有什么区别呢?3 ^- l# a1 \- z! y
形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。
7 V# P% R) w0 {( [& C1 Z9 J! u再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,7 k# G; n: [" _+ A2 M( A2 P
所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。
) x0 G2 B0 S7 c& C2 h1 T! J1 j- X$ S但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。
- g1 [- X9 q) L& f# C2 o0 J这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,/ p  d1 E# ?& W; D9 d" e" s2 D
通吃一切网站。
6 q  [: I# _! C. F  {+ H2 e' w所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。
8 d. {# G3 ~1 C; L4 ]* j7 D  |这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:
8 J9 \" p2 a  F8 h% s* ]% l; Z  Ihttp://urllib3.readthedocs.org/en/latest/- Y; C4 y, ^! Z  g8 i; r
http://docs.python-requests.org/en/latest/
5 W5 f$ a; ~; n5 B4 }$ x" l8 r
  1. % W% T( C/ @) b% a+ V
  2. #urllib2/ }9 e$ C8 q- A" o4 [5 @* I
  3. import urllib2# M' g+ d* L* N; ]3 @8 U
  4. def getpage(url):
    * J& W9 Y6 K& \7 O- T; U
  5.     req = urllib2.Request(url)
    ( o" T0 T; R( \  p' F6 T
  6.     response = urllib2.urlopen(req)
    6 D/ h5 J( G' N$ B* P
  7.     page = response.read()
    : ]8 B' H0 n1 z/ [( {
  8. ! q5 Z; Y/ ?! h
  9. #urllib3: U  W" Z6 T& Q' D; K+ @3 M0 p
  10. from urllib3 import PoolManager
    / b9 n+ {" G# S, P
  11. http = PoolManager()* \4 ?4 U4 i4 {
  12. def getpage(http, url):
    # B) y' J$ v+ ~
  13.     r = http.request('GET', url)- q, c- E* ^0 C1 s$ _6 V. g
  14.     if r.status == 200:
    - K' `1 K3 ], \
  15.         return r.data
    ! k* A9 ^' N* p0 y8 M
  16.     else:
    4 F) m  L2 n; U9 K0 Q, r
  17.         return None
    / ?4 |: v% W8 x
  18. ; R" B. S7 R7 l& {6 }! h/ I8 n- E. W; ^
  19. #requests
    ' J0 A3 I) Q, n2 R+ A5 m
  20. import requests
    5 z' q" k) s" b# t4 r
  21. session = requests.Session()* V) S* u: [2 R$ L6 j2 T; A  V
  22. def getpage(session, url):7 T+ f6 _/ _7 p$ a+ C
  23.     r = session.get(url, timeout=10)
    * A5 U! j& @- j* c: E
  24.     if r.status == 200:' A' }/ t! i1 |, S5 i/ c7 E2 R
  25.         return r.content
    9 E4 p" z" y9 J5 s1 x5 }# Y
  26.     else:" l7 x! w# U9 G; D4 W7 z, B
  27.         return None
    ( L/ r& b- P. s: @7 A
复制代码
2 T) P) a0 Q( m9 L& r
四、后期制作' u# {/ l' Y" c4 B! F4 D& x
1、文本处理,是个特征识别问题。
- g5 j: h3 g! v5 ^本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。
; g7 u  \, \$ o/ [! }" z当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)
' C7 _6 e2 X# i5 }7 U0 I都涉及到特征识别问题。# n5 s  R, K* C# f$ e6 t. |
相比这些高难度动作,文本处理算是比较简单、基础。
( X- I6 C& o5 |9 Z) L& Y: K* g1 b) ePython里常用的文本处理技术:正则表达式、BeatifulSoup、lxml1 g, f+ i) p2 L2 G3 G  y
正则表达式非常强大,但没法处理递归嵌套的标签型数据
# @& q1 q% \8 h& Y( d$ k' H(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);# i5 X5 h5 z6 {4 @! f5 Q3 _6 x
BeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。
8 S" X8 w3 `" o3 f) O& `# Q1 s所以常常要结合使用。5 x7 X+ }' N  l. y
这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。$ |$ J: t! X9 z2 `

8 ?4 r. A# E9 w2、排版" c8 o- n8 ]" v5 k1 I. r+ V
HTML、CSS的基础知识:3 ]5 c& e8 [; \
http://www.w3school.com.cn/html/index.asp% S( I) h( {1 a  {# h% [
http://www.w3school.com.cn/css/index.asp' l) p: x2 H0 J
http://www.w3school.com.cn/css3/index.asp, N, f' Q5 R9 V
非常系统、非常全面。
8 N7 Q, ]4 {# C5 F; Y排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。
9 R) `- J: V, E8 W0 s3 K9 |& ?0 A: z; C1 }: j9 W2 U
五、结语
% ]6 \& l* `* ?  s$ F) j/ J. F花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。
0 w5 b" U9 p% }, f+ _所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——! T* a6 ^, y4 F- Q% I' O0 B$ W
大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。7 r% U) a, S3 Y# U  t

0 K5 u: {7 b$ a2 n打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。
# `' t- @' b3 R! _
4 ]4 d0 P7 H2 K0 b: o5 {. {( W只是拜托不要打扰别人,真想要就自己动手。9 [4 ]- [: P- i' y) M3 r
尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。
- B: i, H( R& T% Q0 L: d* n水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。! V2 C0 G  h# B
虽然每个人都觉得自己至高无上,应当受到别人重视,* Q/ w- h9 {$ L* W
其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰5 _' y) U0 x/ D1 u
+ H1 b8 O/ U2 e

4 O: |. i& X% a0 W' g& ?6 U========
2 D- Y& n; m8 {4 [6 S六、拾遗
. m$ B* k$ M: [' Q关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类
' y4 _8 Z) f$ O$ z) E/ ^确实如此, z2 c; B* ]$ t4 d8 l) d0 [: Q
不过这里只是举例而已,不用太较真啦 4 }1 F2 H1 g* ^, a
实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏
5 [0 Z" d, }0 ^1 A& b这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。
9 V0 W* g7 B; a+ Y8 Q( A) ^即,
; `! v/ p: a* \+ ~" g第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)- w& Z& [8 g0 d) v) ~! ?
第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)% F! C2 d/ Y& a
第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作8 R! @0 w9 y6 x; a3 Q' C+ n; ^5 `# X1 C
。。。# M1 s, B/ m  {. r/ H: ^' O2 t9 ^
直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空)' f! p* {1 Q& d4 y  ?! G  j# e
最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。
2 L! J& H$ z  N0 t, @! }. K形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。
2 G% s! \9 W- W0 W因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。9 b: a  g* P9 F# u, p" ~* h2 R6 Y

评分

3

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:41
( ~) E# ?2 J7 x% q2 p感谢楼主分享知识和经验。
3 l0 ^1 m5 J/ t5 w/ u0 {! M; t$ D$ b* S0 y0 N' i
每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...
* \! `3 B+ Z, G5 c- h
现有的mdx词典,其实足够绝大多数人用一辈子的了
% L$ f  ^: z7 k% W, M  A0 \+ r# g% p" {" {, a" h
本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。- p$ p1 `/ T/ p! i. S

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

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。
! E* e4 Q+ e# `( W: l- B其实只是你没有发现而已。
0 s  z* S/ o3 E0 \$ b2 j- nODE: http://www.oxforddictionaries.com/browse/english/( I1 U( f* e1 P0 _1 e: @. E3 ?
RHD:http://dictionary.reference.com/list/a/
( q/ M" _/ t7 TCALD:http://dictionary.cambridge.org/browse/learner-english/
7 B/ [. c3 X0 g& n; C0 E1 t) ?( C9 z* p6 v" R  y9 N
如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。+ t! i" r. P8 q( f/ C9 ^
以第二个为例:
# k, E/ K9 g# T8 tinurl:browse | inurl:list site:dictionary.reference.com. R; z0 J% m! e) v
+ f. `3 y- U$ k  A8 b
PS:最近才发现这里,发现资料很多啊。
2 Q. |! ?0 G. z

该用户从未签到

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

$ Y7 R; I* ]. l& b" x' W4 d, W/ z3 q+ f# {  _

) e9 G1 o# Z+ K# S) c2 v
( m# R% u2 w" J* Y% w$ T7 {6 c感谢楼主分享知识和经验。
9 p$ N9 x5 J5 l% S0 G" L( Z, K3 z
5 g( x% ~7 W8 p* l: i每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。
4 I5 N" g6 O; j' X8 m, Y2 a# v
+ {  w+ s! ], N8 n私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。! J; Y0 Y4 p0 K% }
+ t9 ~8 B! k0 }- x" o9 |
但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。
/ X* y- p  C- A5 v1 V- G$ x, q! O+ w3 t8 T, C2 Y
除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。+ ?/ q, L* G  d7 a

  F9 a, }5 x3 m1 Z
: f0 f/ y: H0 V0 G' @: o
3 w* [! b( d7 z7 a' @
9 D5 k4 e% \# Y  J  }! \

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧1 ~# v1 k0 y6 j9 M5 M* G
, l/ j/ w  u: F. l9 H, F
假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改
1 O1 k: |" W1 }* R; d或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下
! ^7 Q$ d& m6 U8 S4 n. Z. b  |结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。
+ s0 M3 y6 [8 q/ }) h9 V% v这里有个比较省时省力的小技巧,可以快速定位到想找的地方
; L1 d' N, v' c4 _% i5 o! g! D! O- j1 p$ `8 ~
1、Goldendict里,在想修改的地方点右键,有个“审查元素”:
0 j) h) k( R- o& O, K6 h9 G9 ]5 g7 o3 F. p% D  C+ G9 t; x
: v# F% V* W0 v+ Q9 U7 _2 w8 a
2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事
) n9 {4 X" G. m+ o/ x
/ X1 \" @  t/ ?* W) R) ~7 ]+ q& ]) v% k2 S3 J3 r3 L. z) ~
3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方' Y8 E7 e+ r  K+ N0 ?) W; S

% O2 g- D+ Z+ _5 {; f, E  u' r
4 @# S" r% ?; R0 h/ B* ^4 }1 [收工

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件
! ?+ q8 j  V! R0 [/ Y0 C
  • EmEditor
  • Beyond compare$ b( _0 N2 N' B& _
5 K) l: P) c1 o7 U" Y
( [* T0 g6 _" a$ c9 ?
前者用于编辑,后者用于差分比较4 s: ]! F/ {- C4 f' ^  e" S
处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考1 w0 k& S% r$ I+ s% G
" W" B- m; `9 a0 [! z: W, q
网页设计中最常用的字体有哪些?(中文和英文): A+ e3 a8 K, @. Y. Q
http://www.zhihu.com/question/19680724% I; [9 O; \& L2 ?

8 J9 D, f! W: M: b- G) v: G本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode4 Y0 p8 h& ]0 e  s  q' [- Y% X
这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全
. o2 f) o0 k$ P5 ?7 y4 U. ?另外Open Sans字体也挺漂亮" k) f" C$ i" m' b& q5 z

该用户从未签到

发表于 2014-10-22 21:25:59 | 显示全部楼层
bt4baidu 发表于 2014-10-22 20:21
( w& ~8 [, y3 M5 |最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...

) a0 K4 `; Y# b4 H1 ?' k: @( w$ |多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。
( ^3 @  I  R5 _# I$ [: A$ u5 H
+ b5 x+ F$ z$ Q9 h6 V" r我的一点网络小技术是很久以前在X客基地学的,当时花了几百块钱,没想到有些技术到现在还没过时。抓dictionary.com的话用一般的软件就能搞定,老牌的离线下载小软件(如offline等)或这几年流行的火车采集器(www.locoy.com)都不错。

该用户从未签到

 楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
大熊部落 发表于 2014-10-21 16:18- n, x& ]+ g# A# R
用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...
  A1 i2 E5 |0 ?; U) f# ~0 \9 s
我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件
/ R! r& P! y7 f$ n1 t
# }* ]5 t7 v- Q, m3 ~
下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
7 K: H3 y" g" }4 T# d0 u: }2 k
推荐一款可以下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 编辑
    / i& K& z% O/ \3 a: F
    4 P; `8 N( m- r, p写得很好。刚看前几行的时候,的确激动了一下子。虽然没怎么懂,但是第一次能坚持把这样的东西看完,觉得也是对自我的一次超越。谢谢!

    该用户从未签到

    发表于 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的每日心情
    开心
    2020-9-10 22:06
  • 签到天数: 45 天

    [LV.5]常住居民I

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

    该用户从未签到

     楼主| 发表于 2014-10-20 20:22:48 | 显示全部楼层
    本帖最后由 bt4baidu 于 2014-10-20 20:25 编辑
    , f: Q! ^8 O: x& t' u! Q, d
    ' u' Y; s0 `" n7 v5 n- djava和.net就是个垃圾,我懒得提而已
    : u! r# C( @  X4 V8 }4 G在Linus这样的大神眼里,连C++都是垃圾:- ]& I2 a7 `6 c1 n, I
    http://www.csdn.net/article/a/2010-06-12/218785# k/ y) l- I' f1 g

    0 _' X' U- G% o& ?如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。. b6 I5 g, m, b, |- {
    + G7 K8 z( `8 q, d4 o. m
    不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。4 u, l# b0 h9 g1 v
    我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。
      Y* z( V% [$ j3 x' p: h这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。7 |/ W* b' H- }3 L2 s9 F# d( h
    不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。
    ' g% R/ n% V4 ]) U为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?
    1 P+ p0 I3 }6 [% R, d因为垃圾代码太多了。* H/ r# D/ p: b- C( X: s  j

    $ u* b4 }- \. c9 y! K6 E# T. _9 I; K/ ?  v% s8 ~) y

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑 8 Q- I5 ]* s- Q5 T

    & ^! j  T! M! T
    5 |; t4 P; w1 F8 |. f算了,道不同不相为交流' [+ V  H) a; O8 K  V- S0 {1 x9 j% G
    想起某个梗
    * B! R. r3 `2 g3 H; V程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!8 N& q3 G6 V" X3 q  _, h: l
    # X. u  ^( m9 G! q2 Q
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。
    2 }' }; j$ Y  I/ `* Y* ~; E- [
    另外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
    2 R! V4 K6 T' o2 g" t算了,道不同不相为交流
    6 Y4 s" k9 x: f想起某个梗
    * S  h+ y6 Q# p5 m程序员眼中的编程语言

    , S& y, d6 c' a/ |6 k7 H: @. l3 i* M不同的语言适用于不同的人群:
    $ z( E/ X( e! r6 @; F7 b, T如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。
    4 v! S+ ^! f; i; D0 E3 L! l如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。( J5 Y5 K. D& }& I3 \- p
    至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。5 A: O2 U+ |6 i# s5 |/ `

    . d1 s: B* N5 ?1 {8 n7 n编程语言的口水仗永远也打不完,不争了
    9 z$ T( ^1 }7 y1 d9 ~( R3 L

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:35
    / u6 q; o5 p; h# z2 f不赞成多线程抓网站,但是好贴子要支持!
    3 c; a4 M3 ~4 `, \- W
    / c% z' I9 }& F* i8 j自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...

    / w: {( t- m5 H4 Y* ]' [: i下载软件?推荐一款?9 p- Z, A+ x  P( H
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    " l2 u0 H( C( l7 u/ S  |( f现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?
    " E3 w5 s+ Z, a- x比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。
      Z# A: n; g: ]* s1 N2 o# f# j" l4 c除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。; t4 ]; Y: q4 L. U
    目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。+ b- f; h2 |" D! o8 j# l

    5 S& z8 N- U! s- L+ ^至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。' g8 q. R8 a0 X$ b9 Q2 F6 F- ?
    对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,
    * a& o3 O7 v$ o目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。
    * F* C6 ]$ B- m" g9 [

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:. ^/ |+ Y: t) U, {6 z
    随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。
    # V) x; f: Q# ^4 \未来会出现一个新的行业:私人计算机管家。) `" w$ f- L( K, Q* C. x
    专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。
    0 k( H, H2 ]% P2 b8 x/ f但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:298 M5 R9 }+ z' s1 t5 m; ^4 m0 h
    下载软件?推荐一款?
    ! e6 I5 }' c/ I5 r# G最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;/ T0 e+ a- k5 T* D# S
    现在99.999% ...
    1 ?: ]+ }+ B+ Q8 E# ]
    用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
    ) ^7 r) g9 v6 ?' _% @- r
    $ [* f1 F6 O. \" I- D  b十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。
    " I+ o0 c% }4 \1 i4 d3 i5 B( ]7 h# X' t: u" r5 Y$ h4 n
    用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。6 `$ R6 i. n" ?

    2 D7 z+ Q: H9 z7 P7 ^3 W我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:21:14 | 显示全部楼层
    平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。
    1 k0 t4 \6 b5 @) o  |

    # v5 B, u8 V, R! m; U/ r; W最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差
    $ v, j& I  M8 [1 k; O: k, M. X计算机是用会的,不是学会的;  h/ b  [  Y0 s  C$ Z
    程序是调试出来的,不是写出来的
    / a: s; Z4 }7 l3 W/ N3 v. g+ V  J8 p% G, \2 H: |3 `& M. ?
    既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。
    6 P% V' {3 R: v3 T/ ^  ]你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。
  • TA的每日心情
    慵懒
    昨天 00:08
  • 签到天数: 82 天

    [LV.6]常住居民II

    发表于 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 |网站地图

    GMT+8, 2020-10-25 10:25 , Processed in 0.061092 second(s), 14 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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