掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 50929|回复: 148

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

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑 * x  b, v# l% v. [% w8 j3 N/ c. K

! D/ ~, c1 O5 X; ]这篇文章主要是给计算机小白和初学者扫盲。1 a( B) [1 @" ]4 K2 C
本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。3 q/ H1 [2 S, @! o: Y# k; v; k
只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。
; M5 k1 m3 G+ V0 a; ~+ O1 O
9 l' v" t8 q; u& J一、计算机的两个终极哲学问题
  y: {* U* W2 k" k4 Z1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。
% @8 X5 G) v* x4 n( D) Y+ e/ z; q图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:% q' R2 J( T' ~
设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;
2 W6 |3 o$ T( U2 }# r( O机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。0 d- U3 A# M7 P
方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。- z5 L, X8 a, h/ q2 Z& W% J
“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。1 O5 M* _6 v( p1 k/ J7 Y
* v7 E. v: Z- |0 T
那么要写出程序,立即就会发现不得不解决两个问题:: j* e  i* i5 w1 l) j) i
1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址7 L. z# V, V+ _9 b/ y
2、怎么把两种方格区分开?也就是特征识别
% F$ U$ h# g9 X这两个问题,就是计算机的终极哲学问题。
* }, J' U% i& F& p) m理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。+ _' I* \# F+ s7 A  _$ S1 r
下面的讲解也会以这两个问题为核心展开。( ~* }7 m) V4 Z4 l2 F

' F8 J8 ]4 k  |3 q0 o( I, G) mBTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,4 q9 T' h6 u+ v# V* i
——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。
  F1 {4 @# m* y8 E) h  ^9 i3 d4 }所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。$ B% G  z, e1 k
前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,
+ g8 A1 u+ m7 i! l而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。
; Z+ n3 B( T7 v, A( O3 v" k具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。% N/ ?. r  A5 _
8 J7 U6 N, k" a, @
不要觉得自己上学时学的不是这个,or文科生,就不行。
5 r6 Z! Q1 M; C1 n江民杀毒软件大家想必都听说过。
( Y9 K2 o. C0 L+ I  X( U8 l+ W创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。1 p5 c. w+ w7 r+ s4 a
咱不奢望成为专家,写写程序总还是可以的吧?% R! M! |4 o* @0 ^/ M4 c( @1 e! c

, ~: n- w5 m9 n6 b& e  K二、采用何种编程语言
- v  ^' [& }5 x9 A+ T' t. C上面已经说过,存放、读取、组织、区分数据是编程的核心问题。
4 `. Y; f' q: M显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。
: c  n* _& I  R' m: c) z* [4 _( B抓网站,恐怕没有哪种语言比Python更方便。! ~* y5 j& u: g6 Z# L" A
当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,
. T9 C! i$ k1 x; ]% z3 K: r3 q& d计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,( [1 j) m; D6 R" b3 k1 @, f
没有慧根就别吃这碗饭。3 W! }* U7 w8 ~: f
! F8 U" j5 D9 T5 Y, O
三、网站抓取技术, m1 B2 c, E5 ~7 A) H6 D
1、下载某一个网页,提取其内容
! |6 X5 z" M2 K  P3 ?7 V2 I" Z% S以前写过一篇,就不重复了。参考:# U6 D9 c! [! ]2 o7 F
用一个简单的例子讲讲怎样从网站上扒数据$ @2 J7 D( P" }9 [7 o4 ?; ~/ C

9 m* N" Y5 {5 p/ \2、寻址问题
3 N& i8 p& c8 p下载网页,自然首先要知道网址,也就是东西放在哪儿。
. F- C5 G- {  B; R- j8 X如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。
1 `3 F, c6 b9 d3 e$ @6 o" U* T) I但是大部分在线词典,到底收了多少单词,事先是完全不知道的,
& C* a% o& U2 o- _: z要把单词弄全,就要想办法得到每个单词的网址。- j+ u$ `. t% \6 ~% W( Y
总结各主流词典网站,大概可以分为这么几类:1 H! r+ B4 r6 ]( O
I. 事先有单词总表& l- A( ], M. E8 Y
比如http://www.vocabulary.com就是这种类型。8 g' k6 P6 M0 P
它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。
5 D) J* ?' i6 I- D- n
* N! A" J. |. KII. 网站有索引页面
+ `9 f9 D2 N5 [; R如:
5 G0 G2 J& G, w" u9 N! e9 Q1 sOALD(http://www.oxfordlearnersdictionaries.com/
* X$ J4 A5 ?$ ?2 Q4 f' I它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/
  h. b" c5 z9 a0 GLDOCE(http://global.longmandictionaries.com/
* K% D6 ^% Z) U2 h; a9 V采用框架结构,左侧边栏就是索引页
2 k  `7 ~5 t) |: y! jMWC(http://www.merriam-webster.com2 ^+ O: \( p6 o; q# k
索引页在 http://www.merriam-webster.com/browse/dictionary/
9 I! R1 p: z# _' x* {/ O4 b. s6 U2 a等等
6 Y1 u: P# N6 {% d这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。
3 v1 q% h. _. o

  1. 5 |, L( K( k! t! z' v4 t
  2. urls = []
    8 i- b3 y  c9 E0 n  T  a6 I/ z1 B
  3. for someindex in indexs: # 循环所有索引页
    3 @& C7 F0 g, n+ \
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex]). Q& ^: d8 q/ @8 X0 T
  5.     browsepage = getpage(browseurl) # 下载索引页面  b* \; u3 a6 w3 {: ~+ ~$ [' A. l4 W
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域
    , j5 y, _8 |  A' p
  7.     bs = BeautifulSoup(browsepage, parse_only=target)
      n, D+ H" y  ^
  8.     if bs:: U3 c+ p, K& |4 }' j# w
  9.         for a in bs.find_all('a'):: ]8 B" R( P( B/ t4 Y+ V
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接
    6 L% ]) @$ K. H/ ?
  11. 然后:0 q1 @4 y4 B/ S0 \7 {! r- A( W( H( b
  12. for url in urls: # 循环所有单词1 r9 I2 {2 w) F; `  }
  13.     wordpage = getpage(url) # 下载单词页面
    / a! \( p, |9 C6 Z) S! ~) i
复制代码

. A5 H4 X# f) x% G; \
( o% r1 V" p& o' ?* P* Q! IIII. 索引页和单词释义一体型网站6 d/ e* |6 {# n% A& s) Q9 y
如:Online Etymology(http://www.etymonline.com/5 W# m+ G: l9 U7 K; X: }$ ~. k, R
和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可
9 ?$ c1 r9 d3 C) ]4 j2 \

  1. ' o- y" w/ Y% Y% M0 c
  2. for someindex in indexs: # 循环所有索引页
    0 t+ C) }# s6 V' {, y
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    5 Q% F: k; W+ ]7 J, Y' a
  4.     page = getpage(browseurl) # 下载页面
    " S6 `$ k  J& @" ~1 W
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域
    6 h% w9 z  e, L9 Q8 `5 {" ?
  6.     bs = BeautifulSoup(page, parse_only=target)
    ( x) B; i; i) W' u4 |3 Q2 _- u
  7.     for tag in bs.find_all(target): # 循环抠出单词
    : |- C' ]) j9 R4 b) C
  8.         worddefine = getworddefine(tag)
    4 j  x# d9 h+ O# z/ C* D
复制代码

3 p0 ?/ S; H" S9 k( p% [. m; b' `* S, M2 p* k' t- ]
IV. 片断索引型网站
5 g- |. _; `' m/ {如:: T9 k0 V: R1 @- ?9 E
ODE(http://www.oxforddictionaries.com/
$ Q. c$ {+ M$ p5 ^每查一个单词,右侧边栏有个Nearby words9 G- |5 Z# d3 A
RHD(http://dictionary.reference.com/0 N- u- u% W! `; \! h+ Q
右侧边栏有Nearby words# U" ?* w) S  C7 d. W0 o8 u
CALD(http://dictionary.cambridge.org/
- ^7 I' g, K" B8 B) x在页面的最下面有个Browse栏,给出前后相邻的单词) J, H% m1 @) {+ R+ c. O
这类网站没有总索引,只好利用它的Nearby栏。7 [1 |. J9 ^4 L
思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,& @5 r8 V* R! Z" `6 `1 d. i
每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)
; s3 E9 t4 {) s* y) B* g
  1. / [# _8 A0 }2 s: z  z
  2. cur = 'a'8 c6 A6 V  T$ V( S4 Z2 E& E
  3. end = 'z'3 K% p0 W$ j6 j4 n3 k( k
  4. nexturl = ''.join(['http://somewebsite.com/', cur])1 w1 l4 v  F- `7 _- s0 }1 }- S, ?
  5. while cur!=end and nexturl:
    2 y* |" q- R6 k
  6.     page = getpage(nexturl) # 下载单词页面
    % V9 `5 ^' j8 a0 p7 y5 ]
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接
    9 K( U, v: L( U' v; `
复制代码

6 t" v6 e7 O2 [6 K
' H; Q! Z  b: _3 |; O3 k- ~V. 完全没有任何索引,那就没法子了
3 D/ h) D& ^% @0 \1 Y- O当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理
' J+ X3 b. T& W6 p7 V( [理论上也是可以的,就是效率差一点;
4 r. n3 V+ N2 y1 X另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。. l, f! N. G& `

2 `% l4 d6 k/ K, u( h3、提高下载效率
! w+ }- z7 V* fI. 多进程
2 R  q* |- T4 ]& m- m上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。
, ?* Q, c; v2 \& z# z实际抓网站时,这么做效率显然是非常低的。/ G: [: m  u8 T
假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,
: L& L; Z* ~! A) ^# T7 ?1 k有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。0 x. H9 o* g# K% U
假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?
) P2 |- {/ p1 y* R- E* Z# U要速战速决,就得开多进程。
. L7 }$ v/ Q6 Q1 f5 ]7 N/ h同样十万个单词,分成25个进程下,也就是28/25=1个多小时。
) Q, M6 v2 ~% l+ [4 N8 R+ G再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。; O+ L; c% E4 W. q
在Python里开多进程,同样十分简单,
0 N+ R+ O1 T( H. C9 i
  1. " V* Y8 e) I) [. I; i! B( ?; R
  2. from multiprocessing import Pool* U9 g3 {7 U+ U; J
  3. pool = Pool(25) # 开25个进程
    % w9 q' A6 @$ `) U3 y4 O2 D* K; F
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数$ x3 r  S6 _$ w: o4 G4 Q+ H2 D# _
复制代码

* Y9 ]( S. d% e( @- [; I: E( G这就搞定了。
) P; v3 H, s7 L. `) J& q) J( N- A- h1 u& a8 Y
对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,, m4 w3 E) D; o6 A/ e
关于IV.,事先没有单词总表,就只好采用区间的概念,: ?/ _7 O0 C. u3 Y. a. F& F: q- S
比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载5 F! }2 y6 m7 v

5 `1 i' `7 `/ U+ X- z. V$ f; L- |初学编程的人,一碰到进程、线程,常常有种畏惧感,
+ P! F$ ]* g, O8 ]+ _看到同步锁、共享内存、信号量什么的顿时觉得头大。
- t" C, r) O, T% y其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,
$ s( A; R* j9 H其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。
6 y7 E/ {! }* [3 b2 _' l/ L3 }/ I, |7 u- G/ a- J! X6 L
II. 断点续传
. c; b+ \3 x1 Y3 e' H) P事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。
, ~4 {5 k! D2 o. S% ]3 w所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;9 k8 u8 e5 Q) ?  N8 r- Z% v
即便无法自行恢复,也得容易手工处理,不然可有的烦了。* }9 H  f+ U! Z5 N
这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,
( G# H: _+ ?' O! f# o% `9 D& i2 u直到所有区块下完。  U3 I' f2 g1 z# b* e* `  z! z+ ?1 C
  1. # E3 f. _4 ^" c' e
  2. def fetch_a_word(part, word, url, data): # 下载一个单词4 d) U. o0 R  ?/ g5 {: |
  3.     word_define, failed = get_a_word_from_website(word, url)
    ' R7 r' L' M* |; k* ~; T
  4.     if failed:0 G; {  z, j" E' z  }7 ~" X
  5.         dump_failed_word(part) # 输出下载失败的单词及网址0 p4 h7 c* D3 [# N# F7 q
  6.         return False
    ( D# q1 t' C2 T+ ]
  7.     else:
    ' a, F9 P, c& V/ E
  8.         data.append(word_define) # 保存下载成功的单词数据
    3 z2 B5 T+ n$ L- c
  9.         return True! M" x0 D9 r- `: s- k; r) b

  10.   w& f9 ~4 O" j) n
  11. def download(part): # 下载一个区块6 t) {$ E6 v8 O* G
  12.     words = getwordlist(part) # 读取单词总表; g# O. w5 ?: r2 F+ g
  13.     if hasfailed(part):% G, v3 @+ g# J5 r* F
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址
    , e6 Y& w5 P' O% }. E
  15.     else:
    # W5 V5 d9 j& J* d
  16.         word, url = words[0] # 首次从头下载
    4 M& {4 e  P8 l4 D, `
  17.     data = [] # 用来存放单词定义
    . S8 G4 Z6 M. H5 t, L
  18.     while not_end(words): # 循环下载3 T0 V+ H% N2 ]- P; O$ X$ @; V4 g
  19.         if not fetch_a_word(part, word, url, data):
    8 _: G( v8 N1 O
  20.             failed = True
    / j0 f" n$ J) h6 M4 |: Z9 v6 v  Z- P
  21.             break  H% U' g0 a, {3 x! o) I- T
  22.         else:+ b) S& b( d9 v
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址
    & o9 Z' R! ]7 f# {8 \
  24.     if failed:- K6 X7 M  _& z( k, {  t+ t( h
  25.         suffix = '.part'
    9 X- \# o" f5 N* E* t6 y" \* d$ k
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'
    ; l$ d  v, h) D0 W7 ?& z

  27.   v5 b1 p" K+ i  Q/ c
  28. def isfinished(part) : # 判断某区块是否下载完成8 W% h3 D' Y1 `$ F" t& I- [
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断
    5 V$ O  U6 p. e! N
  30.         return True
    " B. f2 T  ^4 l
  31.     else:8 w# U7 R' T/ v
  32.         return False
    + x6 _9 Z0 l6 I) A, \1 ^) P
  33. " {; H: v. W$ x& [! \
  34. def downloadloop(): # 循环检测未下完的区块* O3 R; C) ?$ W+ k
  35.     finished = 0
    8 K- h0 Q9 u" \% c; r
  36.     while not finished:
    " v6 _' I2 I/ M+ i+ T, a+ P
  37.         nf = [] # 没下完的区块
    1 S8 }/ t1 _$ c" |( Y
  38.         for part in parts:
      O. W& l$ @: o+ n4 K
  39.             if not isfinished(part):* T+ I9 W" M8 w+ F5 \, V  l
  40.                 nf.append(part)
    0 l! }' O/ y3 d: J" V( y: c! y+ T
  41.         finished = not nf, ^$ ~& S6 _/ I6 ~6 }
  42.         for part in nf:' G( W  p, r, \0 s' l+ `
  43.             download(part)
    : r2 e7 y- }! v" h) {. G. G
复制代码

7 c% j8 z, \. z5 }: F3 ^2 S+ I) T) _2 R0 {+ L5 I& H* M
III. 高速下载网页的小技巧. R: q! d3 c2 E5 `
Python里面有三个库都可以用来下载网页:urllib2、urllib3和requests。
; Y  N0 g8 M4 P: m其中urllib2是Python原生的,urllib3和requests为第三方库。
) U* }" ]; M5 |(似乎Python3已经把urllib3收编为正规军了)5 B5 V0 s8 f7 @' M$ H) D
这三个库有什么区别呢?
. R$ L" m6 j$ T2 i形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。" m' k& O- \& ^# J1 `
再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,' V* ]' l6 g6 H
所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。
. D" H5 B, T7 R, [但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。
# w1 _1 w- M$ }这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,2 @; s5 w* o4 U) a
通吃一切网站。
' m9 D3 Q7 V) z. c所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。# |5 J- ]# E* c( o
这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:
  C: g& v7 I+ H# I1 i% ]5 @) [' m. I" ]http://urllib3.readthedocs.org/en/latest/4 a: ]' H' l8 m9 V# F
http://docs.python-requests.org/en/latest/* Z; K8 p" Z: P) m4 m! D

  1. ( n+ G  Q, J) v6 z8 Y, e! m" V
  2. #urllib2; b% e6 E! e& T1 }
  3. import urllib2
    * J6 O, T( C( p! z
  4. def getpage(url):" ~# C( }: T6 _; ?
  5.     req = urllib2.Request(url)
    / @6 p8 B/ W3 `' o1 w( r8 j4 o- e
  6.     response = urllib2.urlopen(req)
    7 Y: O1 x, T) z( Q' w0 ?6 ~* e
  7.     page = response.read()# ]& E0 @( \$ E7 g7 O; _7 s  J# }

  8. . P6 j- ^8 V- N* d" P( g4 z
  9. #urllib39 D; C. Z1 r5 w5 t
  10. from urllib3 import PoolManager+ Q7 |' d7 L' w
  11. http = PoolManager()/ C0 ]6 T! s; a( q5 j1 {
  12. def getpage(http, url):
    1 u, G2 V+ R8 L+ i& }
  13.     r = http.request('GET', url)1 ]1 ~: J- i7 o1 r% ^; I4 O3 _! M
  14.     if r.status == 200:
      c' ^8 u8 l  Y; F3 t- Y
  15.         return r.data
    : c' B4 X! V% n$ S$ J2 Y) K
  16.     else:  D4 k* `7 l3 V  L- r
  17.         return None3 A1 y8 g. y. ?
  18. * c7 k; a+ M# w- e8 t/ Q9 g$ |
  19. #requests( y" N5 ?  l3 Q: ^6 g& H
  20. import requests
    ; P; H+ Q- ~1 ?- e% W
  21. session = requests.Session()
    2 z) Y$ j' t, Y( t& P1 q6 {
  22. def getpage(session, url):  G' y5 L2 t, n8 ^1 ~1 C  l* X
  23.     r = session.get(url, timeout=10)
    4 v8 v; V7 t: E% T& t6 V
  24.     if r.status == 200:
    7 J$ [8 w% W. t' _$ P9 v0 p
  25.         return r.content  s. x8 ?' n9 [$ n# Y
  26.     else:
    9 D2 t; v7 Y4 p2 T; k
  27.         return None8 D6 ~5 S! F& Y& A! J% [1 K
复制代码
/ P% L) t/ e+ y+ B/ o* [9 Z( f% J, x% O
四、后期制作
5 @$ k: f! }  u1、文本处理,是个特征识别问题。
* s" O3 ?0 o* E* t7 Z3 l本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。+ |1 X7 L/ G1 R1 A& s5 U6 K7 n* x, w9 z
当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)# o* Z# c5 H; f- r7 t
都涉及到特征识别问题。0 C& D  q8 g/ t+ z; ^
相比这些高难度动作,文本处理算是比较简单、基础。
) @3 @( \% `- QPython里常用的文本处理技术:正则表达式、BeatifulSoup、lxml
4 x: B+ @8 @, t: E( l$ ?0 b7 t正则表达式非常强大,但没法处理递归嵌套的标签型数据
+ ~+ @% F- B; V9 t9 Z(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);
* q' i* H; X* Y7 I, F* Q9 PBeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。8 `' W8 w8 m! K( v0 V& K
所以常常要结合使用。( M; x: `* a' l6 ?8 |2 m/ k
这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。
. R3 w5 B5 V% W+ C; j! f( `, j$ p1 ~% Y9 T/ }) Q9 D
2、排版
9 h  T9 S2 E6 b1 A( {+ XHTML、CSS的基础知识:. M+ ^# Q+ g0 v
http://www.w3school.com.cn/html/index.asp
. c5 z, t# b& @$ k9 W2 E4 ]3 ]http://www.w3school.com.cn/css/index.asp
. B. Y/ n9 x/ Q0 ohttp://www.w3school.com.cn/css3/index.asp
. W4 @4 }) J- ^) m" o; ^非常系统、非常全面。
( m* B& q7 Q7 t+ q排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。
* M: |: T1 j3 \. D  @" H
0 @$ u: a6 }9 m9 i% T五、结语
+ r* `2 Q& w4 j# |7 ]) c花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。4 c! b! S8 Q; f* F1 e9 h9 C
所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——
7 W, L6 E0 H0 g2 N大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。9 X$ V. J; y' F9 d8 b/ H# @: p
7 A: L9 v/ y- G1 ~
打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。
$ j7 |" B9 u) I2 p, z
- A5 z5 H. O+ ]只是拜托不要打扰别人,真想要就自己动手。
& J7 W7 R9 Y7 N8 |尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。
0 R, Y+ i6 y9 ^3 ^水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。5 k" ]& _, }! q. X" o1 }
虽然每个人都觉得自己至高无上,应当受到别人重视,
' [- k4 R1 \$ \, m( s2 v8 P5 f其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰
" l5 [9 n$ m; g" ^/ `. O9 R8 z8 @7 M; r0 i1 }5 o' b% ~

0 S, g+ L8 j& i& p- R========
$ ^& @' U3 h" v* m六、拾遗
2 g% ~8 g+ D! V$ U' \' n3 `4 t关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类
  k+ b' h6 o: d( y确实如此
1 q" }0 u7 r4 S9 H9 w不过这里只是举例而已,不用太较真啦 4 i. ?( Q6 z) h, ~7 _7 _" p
实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏
* v  f8 b6 K8 ^' R" N1 x0 R这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。. |. x0 q4 q# E6 ^) H
即,# B$ e) O5 r& l
第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)" Q- y- \% A1 L$ @: n
第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)
! v4 M8 a6 A- _7 W1 ^3 g0 V7 N第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作
5 n( C" X8 u3 c。。。
, Z) U6 n1 G- q" I+ P. [& M直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空): j  `/ j7 p1 S2 g6 @
最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。2 w' _0 {- z( \7 ]& N1 y
形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。5 `6 ~; T$ R! X8 o" M* c9 I4 ?$ m
因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。5 n1 w' b* U% e% ]- p8 W. M$ Z

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:41
2 F! y' j$ _  c' a; N% Y感谢楼主分享知识和经验。
7 H8 t3 U+ a" e6 J" U- {9 Z
5 Z& @( a: {! ?4 N每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...
; Z" [* Q. z. j$ @
现有的mdx词典,其实足够绝大多数人用一辈子的了
/ c3 R9 b) d3 d% Z% Y4 h* s; I/ u2 \4 H. P8 J6 Z! ]
本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。
7 p' \$ @$ z' ^, w( M5 A+ B) t  P9 f0 V; H( G
本人最常用的词典:
0 ^$ x' X* S( u$ u9 j& N主力阵容:VOC、ODE、WBD。6 D5 B' b/ {( \8 @6 u9 D
三本都是中型词典,收词量均在14w上下,以本人目前的阅读面来看,还未遇到这三本里面查不到的单词、未收录的义项。据说史上掌握单词量最大的人是政治家兼散文家丘吉尔,也没超过14w。除非钻故纸堆,恐怕用到W3、SOED的机会不多。7 m# Z  i% F& t2 f
" x1 J; Q' P6 z  Z$ X  o
替补阵容:LDOCE、词源、短语8in1、韦小黄&韦小绿、Garner Usage。
) Y( D: `# ], y0 g7 PLDOCE用来查常用词的惯用法/搭配、语法信息;
4 r% t$ Z( _/ l! M* p1 z& z: ]词源用来辅助理解、记忆单词;
. J* s) v0 g: L2 u短语8in1用来查漏网的惯用搭配、非正规用法;
. ~* \; A6 N4 @# u/ {' n6 Z; Z韦小黄/Garner Usage用来辨析/比较同义反义、正误用法;
3 r* P# a# x8 N7 o# ^/ ^韦小绿用来辅助理解、记忆大词。小绿真是本好词典,有人说里面收的单词都是一辈子才能见一次的那种,其实不然。它虽然只收了1400多词,却几乎都是高频的大词。从本人的使用体验看,查得率相当高。比如最近看新闻说一种超大蜘蛛,里面有个词arachnid。别的词典只是干巴巴地说4对脚的生物之类的,只有韦小绿说了它的来源:从前有个女孩叫Arachne,编织技艺了得,把雅典娜女神给比下去了,结果激怒了女神,被她变成蜘蛛,终身织网。这种解释多有意思,看了永远忘不了。/ i) @3 k% ~  r3 v% _
( W% s! \2 {* V* U
上述词典,坛子里都有,无非是版本新一点旧一点。比如朗文5和朗文6,有人统计95%以上的内容都是一样的。如果是完美性格,非要用最新版,那就只有自己动手。不会有人在词典出版的第一年就去挑战版权方的。: X; x$ j) x5 i; E
“对于好学生,任何教育资源都应该是免费的”。虽然本人同意这种说法,也认为现行的版权制度存在重大问题——有人靠垄断知识获利,却完全合法;但是本人从未打算挑衅版权方,更未想过做Aaron Swartz那样的斗士。靠垄断知识获利是有点无耻,但如果没有利润,也就不会有人去做整理资料的事,这确实是个难题。
5 q2 _+ C: @7 X  Q" j
' y" \  v: N4 R2 h! d% }还有些人没事喜欢收藏词典,收集了一大堆,却从来不用。说到词典收藏癖,想起以前的一位室友,那家伙每天最大的兴趣就是下载影片刻光盘,大概刻了几百张,还在不停地刻。但是从没见他看过,他也不让别人看。
, [& f- E+ n5 p6 y; {( [这种癖好大概是来自于原始社会的一种遗传,人们总觉得应该储备点东西,说不定未来某一天就会用到。其实那一天说不定永远也不会到来,不如就把今天当作那一天好了。有多少人买了一书柜的书,到死的那一天都没看完,甚至有些书连封皮都没揭开过。( C( ?( l* ?; B1 C6 ~

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。
) @5 J' z( i) h& ^& Z, \. v0 V其实只是你没有发现而已。
, I2 h: z2 y' o- Q& zODE: http://www.oxforddictionaries.com/browse/english/
" P8 r+ d/ K9 |RHD:http://dictionary.reference.com/list/a/
/ g7 n( e" L4 L6 ~. N" BCALD:http://dictionary.cambridge.org/browse/learner-english/
) Q$ y9 ^2 I( [; x. G. s2 U9 s/ J0 a
如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。( d! j( o  g1 C
以第二个为例:5 p) _! M3 a- N/ |+ `& P* z
inurl:browse | inurl:list site:dictionary.reference.com
, n: d) L8 g$ m
2 @% P# b( V$ c) s# g/ f  `! {+ ePS:最近才发现这里,发现资料很多啊。
' ]4 |% b$ y6 f. H' k

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧
# o- k& b& v' |; c/ N. |. ?
. [/ R5 A" L+ D假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改
$ j- v) B/ M( }或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下
" m7 \) N9 K. I结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。$ k* m) d' x: A
这里有个比较省时省力的小技巧,可以快速定位到想找的地方7 e& z7 }6 }" I& R: u: L& X& p

3 F: o' B. `. w  L" _) G$ [$ o7 z1、Goldendict里,在想修改的地方点右键,有个“审查元素”:
* w: [- O* e" g% Z+ A% @; x8 V7 Z  f* K

! \# D1 y- O1 x, |) e" A2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事
% W+ z. u$ p8 c2 x8 w) }/ p& I
( l: n& d# Q" A9 R) [8 \7 t' R! Y6 E: R& b8 {* v
3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方5 }2 I& m8 ?% V# |4 l

/ A9 z3 v9 b( Q8 B# N5 ^+ M' p, @( K  y7 `* i! T+ v
收工

该用户从未签到

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

( `8 [3 V/ a- ]; O7 Y4 g5 o
4 p6 A, s) w( B$ B; \
4 x! u' M$ b: T- N& ^2 O2 D4 ^% g5 ~/ x& ?9 p& E& y1 y
感谢楼主分享知识和经验。; g5 [+ P4 ]/ S, ?. s. S/ N) E+ S

1 J* X* Z+ N7 @/ I5 c7 E6 |2 D+ b每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。# h1 ?7 C  {0 O8 |' q
4 r3 r. Y, f8 n3 B: w4 a, p
私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。
2 X7 p5 s6 L3 g, _0 y8 I
7 @5 y+ T* m: S2 |( |) d5 A但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。
9 |0 o( l0 n, y( R; b5 s. a, `' a/ a$ G2 L; o
除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。
1 \% y6 V9 I; `+ M; H
- ]5 v: x0 Q+ x! |
3 g% |# J  H! V: e9 r5 B: @5 A$ m1 ]4 F# g& j

! p# u: f9 F+ O( X- G' k1 A

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件
5 @) v( ?3 X! h7 @1 M
  • EmEditor
  • Beyond compare( z" g: g2 p( D) n
- p6 `# ^4 ~+ H; T) Y
7 F4 Q; i1 a7 L9 y" e  K
前者用于编辑,后者用于差分比较  Y. c+ T) N- Z% B+ s& Z
处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

发表于 2016-6-8 07:41:03 | 显示全部楼层
bt4baidu 发表于 2014-10-25 21:01# }( H+ J7 ?0 S. K- z: j) h8 X
现有的mdx词典,其实足够绝大多数人用一辈子的了
) D# n- s6 S) z; B) d0 y2 M$ f) M9 ], E* D  o- J* c
本人前段时间制作、收集了不少,经过一段时间的比较 ...
8 P; l  s& D. p: ?7 @$ h
肺腑之言。

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考
8 ?, t; h0 \# t# ~7 C; F
& K2 s2 d  e" u, K网页设计中最常用的字体有哪些?(中文和英文)9 h, k2 r1 j4 p2 g9 ~
http://www.zhihu.com/question/196807245 Z) d! r% V  ]0 F% n0 a

/ J+ X6 |% B4 Q6 y2 ?. e/ a本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode
& i3 B' Q% P# I3 Z* c4 J  h& h! x这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全
% Z6 J5 Y1 A9 w6 M8 ~另外Open Sans字体也挺漂亮
& i% a2 l3 ~* I# x3 @, @9 K
  • 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# D/ r, ^# P9 H  t, m; h& S! ]7 J
    最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...

    ) I" {9 t1 r. w/ @感觉找到适合自己的问题好少啊0 I8 f7 X1 o" `( H, j. }5 ]! w# d
    这个适合的话感觉是兴趣和难度! r5 a3 ~6 Y1 o3 P# B# l( T
    想请教一下楼主是怎么处理这些问题的呢
    1 Q  e; `$ a6 G. \还有种不系统的感觉
  • 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 编辑 & v7 I0 S0 I1 P9 \1 j- c" w
    * Z6 j  ?  b3 E7 q' T
    写得很好。刚看前几行的时候,的确激动了一下子。虽然没怎么懂,但是第一次能坚持把这样的东西看完,觉得也是对自我的一次超越。谢谢!

    该用户从未签到

    发表于 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 编辑 $ I7 t4 Q" P4 U) X! n

    ) x# g) D, k; j5 w- ~' y0 n0 v6 n8 gjava和.net就是个垃圾,我懒得提而已! G( L/ K) U' U$ w  x: T
    在Linus这样的大神眼里,连C++都是垃圾:% q  \. D$ z  j% R+ Z1 j3 Z  \
    http://www.csdn.net/article/a/2010-06-12/218785' ]0 _$ f# U& u/ W! a3 I
    ! ]' d: Q! D4 o2 z8 d
    如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。
      s, ?0 ~; M0 t& _% M  ]
    ( w, Z7 ?4 e- I5 O0 ?3 N# ?不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。1 O: n- C( K8 f
    我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。
    " y" ~0 x- s# _这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。
    ' T! @6 v% ?& Q! a% `不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。; z! l! X5 L) _) a6 \: w. D
    为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?3 H- |- ?7 o6 B) ?' l# R. q
    因为垃圾代码太多了。
    - O' G3 R+ e2 v- t
    " ~( {; S6 l4 R: J8 `4 i6 h; s

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑 4 @6 f1 A( G! s; n0 u1 u
    3 R2 N9 d5 s: n& [! i! v, c" \

    / ^# K6 q( b5 @+ d算了,道不同不相为交流3 a( \# B  K8 k
    想起某个梗
    1 q$ t) q* l% _( n$ d程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!
    & O) c- H* O( N! c6 c% c1 F0 E  W- q% S, ~+ m
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。& P' l3 t; H4 _9 T1 n. ?
    + k3 S! G' ]' D  q+ S# S
    另外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
    4 P3 ]* Z; X1 U1 a算了,道不同不相为交流
    # e  ~8 M( \8 a( [- W想起某个梗
    " Z! {) w6 X5 m5 I' o! H8 Y; g4 m程序员眼中的编程语言
    ' ?/ M2 m2 x( g" D" u9 H& e: v
    不同的语言适用于不同的人群:
    9 a; K9 R2 ]8 u; K# R2 `$ l如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。( h% ^% j/ E1 B6 j7 l9 e) \
    如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。
    7 g" w( Z- l: [9 x/ h/ `) G3 i至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。
    6 }, f  s5 q! Y8 U3 I# e& L, ?: F0 b. g3 k( ?6 D3 V
    编程语言的口水仗永远也打不完,不争了
    / E; I* C7 e) q/ i( D' M, x4 d* P  y

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:352 k8 F4 j8 P, s8 s
    不赞成多线程抓网站,但是好贴子要支持!
    8 y* N* }* t: w. }) s- E+ Q" P8 ?2 F- q
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...

    ; `. T5 e- }. j下载软件?推荐一款?
    - S, ?% G& a) ]! C2 I6 N7 L! R6 W最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;6 _+ g  J) |6 S# [* W* z. D
    现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?8 L# @- g9 j9 c0 B* |
    比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。
    % {! N$ g  m. l除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。9 B+ t' Z; S) B; h5 `3 h1 j: @
    目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。3 U0 o* W, S* Q! S% R' {: d) Y& n( f
    + [3 i, S+ T# {, u# S: V
    至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。+ i, a3 J7 z8 ?+ }+ N; O# x
    对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,
    - Q' i9 y0 N, g目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。
    9 ~; E; M0 }# x6 a  D6 ~4 K0 P

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:5 y! s4 z! s9 N  w. I. M% }
    随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。' R% k9 E9 d0 {7 M' m; o! U8 N
    未来会出现一个新的行业:私人计算机管家。( H$ j3 M. X" c& V1 z  j$ v1 q
    专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。- {5 [1 Z5 |/ P8 ?
    但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:29
    8 T3 i2 d4 \0 Z6 S8 ~; F下载软件?推荐一款?
    % z( e3 R  S0 U# ^; C; j最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;' u$ O1 f5 i2 }4 S% w$ o
    现在99.999% ...

    & E' l6 O0 @0 F2 J- A4 H0 s用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。9 ?8 G( Y. ]  m
    # o: J; o/ d  Z8 ^8 h
    十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。
    2 [4 S$ O; g4 |5 d2 U1 ~% L  M; [6 |
    用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。
    2 F# D- R& {" x. m) S9 Q$ H$ z  r) n) u2 [" r1 \" w, t
    我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
    大熊部落 发表于 2014-10-21 16:184 w. i# }; n6 T# t: n  F
    用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...

    $ `6 Q$ N9 T3 R0 F3 n/ A我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件5 l9 v2 w; _" N  o1 ^$ K$ p

    # _; T( W# w8 U* ~0 _  {
    下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。

    $ u. y4 K0 u) m推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

    该用户从未签到

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

    1 L# t, t8 i% h" [: H1 ]! w5 `
    + [* D3 A9 L; G: U最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差
    ! c- D9 \1 A* L& Z  X" |计算机是用会的,不是学会的;6 J* \; y: ~% A
    程序是调试出来的,不是写出来的
    # \3 N  i! @8 S+ p
    , W+ h( M6 `; _6 h. p3 ?# n8 o既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。, Q2 L# M' b; O5 v1 c* @
    你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

    该用户从未签到

    发表于 2014-10-22 21:25:59 | 显示全部楼层
    bt4baidu 发表于 2014-10-22 20:21
    , J8 T2 \- g" N* k1 b6 h$ W最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...
    : J' U1 Z  ~( l. A
    多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。
    6 H0 s+ K) r$ D/ D: q& ?5 s" e
    . F6 T+ @; w9 C0 [2 B我的一点网络小技术是很久以前在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 08:21 , Processed in 0.126402 second(s), 12 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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