掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 50909|回复: 148

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

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑
8 Y/ _0 f5 Z' c+ {% f$ j' J
, Y" H2 y. u1 y% X6 v这篇文章主要是给计算机小白和初学者扫盲。4 w. f& W# N+ u& d0 V/ A+ H( \
本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。, L/ a6 T# |  q. x6 C
只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。: m! G) e$ e. k6 `6 K( \4 `

# ]1 `- ?" l$ h- p" X1 ^2 E一、计算机的两个终极哲学问题
/ B1 c- u& C1 [2 m3 W1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。) |6 P$ k- |1 N; e) F; C& [5 J9 O
图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:" E, j% z" ^7 U0 O' Y' Q* ]  j
设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;
* u* C: E' e. |3 y$ B- A- i机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。
3 [( h1 u$ d2 R  f方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。
  P! C5 F& B# t! g; M; o3 y“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。  a) J% b* N: n6 h- \
* j5 F7 q- `9 L) p/ o
那么要写出程序,立即就会发现不得不解决两个问题:, `7 I  G. b: o$ j3 A
1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址
7 I9 d  s- {  A  ~. M2、怎么把两种方格区分开?也就是特征识别
5 D( n0 i" B: V这两个问题,就是计算机的终极哲学问题。3 ^) O2 k3 H& f6 ?6 ~
理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。2 j) b, o: c3 f, F1 U
下面的讲解也会以这两个问题为核心展开。
) s' f  E, c0 p; ~8 _3 v* D
% E: z) Y. b$ P/ W  E9 iBTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,
0 e" j. [) {: }2 P( Q. w——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。: D  A: X/ E& q
所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。; P  {5 F; z, D  _
前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,( \0 f! x* u# @+ f
而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。
# k+ t6 v# d+ m! ]; P9 _具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。7 r9 H. _% ]5 Y. ?  q
7 u1 ]' |" E9 ?. ^
不要觉得自己上学时学的不是这个,or文科生,就不行。2 j6 c  m; d* T7 W1 O) j
江民杀毒软件大家想必都听说过。
1 e, Y% v3 J7 H创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。8 K6 R2 J  P( C, V6 |+ H% b8 Q
咱不奢望成为专家,写写程序总还是可以的吧?
  c3 F8 z2 [! ^! h
- I$ C! `6 ^$ J; b& u二、采用何种编程语言
# P' ~$ @" S/ `3 g上面已经说过,存放、读取、组织、区分数据是编程的核心问题。* K- d# S6 z1 i! u: }. l- }
显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。
% t4 }- R: B6 v( v抓网站,恐怕没有哪种语言比Python更方便。
( I  d/ T6 w. {( s0 M- u$ L当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,
- P3 D8 q9 P8 L计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,9 h0 x0 K1 E- L1 `
没有慧根就别吃这碗饭。
2 q  ^* v; t  l" r$ W1 K( U" R, ?
! K* A" a6 ^8 W6 E8 M/ X' Y( S三、网站抓取技术# u* Y* l" b0 j; T
1、下载某一个网页,提取其内容
: }+ V# l, M7 }& d以前写过一篇,就不重复了。参考:
7 k& D3 p+ h& L7 u: U0 E: r- a用一个简单的例子讲讲怎样从网站上扒数据
2 `! j( O$ ?$ y' ~9 M7 U- b; A: B0 @5 a8 H4 Y$ E8 t
2、寻址问题: z' H! F" K9 S* H6 c$ }! ~' m; U
下载网页,自然首先要知道网址,也就是东西放在哪儿。
/ x( L" c' ?8 e% l/ C/ D3 B如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。+ U8 S7 F1 K* [7 s$ P' q/ E3 O' K1 \
但是大部分在线词典,到底收了多少单词,事先是完全不知道的," R1 ^0 }  J4 A1 f
要把单词弄全,就要想办法得到每个单词的网址。: }0 P, Q) O0 N
总结各主流词典网站,大概可以分为这么几类:1 U, i  p( {, g/ ]2 ?, p1 j- h
I. 事先有单词总表
6 P% ^( \6 `. J" [6 Q5 E9 X* L比如http://www.vocabulary.com就是这种类型。) o. i4 i4 l) S6 r
它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。* V! F7 _2 I3 X9 ^/ V/ e/ ~

9 ^. _9 u9 d* [& ?# U8 dII. 网站有索引页面
1 W# \$ e: K5 K  R, g; L: T# G如:2 j. b* N) G* D1 q  u7 J
OALD(http://www.oxfordlearnersdictionaries.com/" i" w- b8 s# ]  Q+ w3 `% ?
它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/" r8 ?7 E( {: g3 B+ R1 Z! u. R
LDOCE(http://global.longmandictionaries.com/4 I3 }+ F, l+ D3 S( z6 p
采用框架结构,左侧边栏就是索引页. o- i8 l" K! @# F( T5 I
MWC(http://www.merriam-webster.com' ^0 v. Z' y+ k+ f% u+ A
索引页在 http://www.merriam-webster.com/browse/dictionary/
, Y5 X) m" Z/ m8 F6 ~1 I等等) ^; S5 E% _2 g7 Y. [8 n
这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。
7 ^9 u/ G  R( r. x% P3 V4 k, ]

  1. 5 j  K) U$ A- w& T
  2. urls = []
    ( A$ \' }* y7 X, D7 J6 X
  3. for someindex in indexs: # 循环所有索引页6 t) t" d. G% Q. }( N6 A% f6 T1 O$ ^
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex])+ y% e; m' x3 h
  5.     browsepage = getpage(browseurl) # 下载索引页面
    - h; k7 t2 d7 f: s( c, U
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域
    7 v* d, f0 C5 u$ ~: O& m
  7.     bs = BeautifulSoup(browsepage, parse_only=target)
    & }1 {8 v. l6 Z- S( @' \
  8.     if bs:
    ; @( i* J, |5 U9 ~- J+ |
  9.         for a in bs.find_all('a'):
    / ~: g. C" e: b) g+ j# y
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接
    ; }. t) }3 P2 D+ P3 g) O- ?
  11. 然后:
    " F( ?; |4 V1 [
  12. for url in urls: # 循环所有单词
    5 `1 H2 ~' L$ g2 u8 ]$ k( s
  13.     wordpage = getpage(url) # 下载单词页面
    ! z" G; a- _( w, I& @; r8 ^# I
复制代码
7 ^- f+ N- ]3 x/ Z- t8 \
1 U+ r' ^4 M% W4 C$ b+ Y
III. 索引页和单词释义一体型网站
& |  C5 r% B7 Y如:Online Etymology(http://www.etymonline.com/
/ h4 z% ]. M& r4 F0 o( L, i和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可* M8 G* u, v7 K
  1. : W2 a1 G+ `( z3 V! J0 A5 _& @/ X% H
  2. for someindex in indexs: # 循环所有索引页
    : G6 x" f9 I9 h: x& V  Y
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    , Y# S/ p2 _$ |. x! A3 ]4 k: ]0 F
  4.     page = getpage(browseurl) # 下载页面
    % h& E: H( F4 P. f1 ~1 E
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域- z0 T( x  M( Y8 T
  6.     bs = BeautifulSoup(page, parse_only=target)' v: ?1 @; s- s7 Y3 L0 e: [; I
  7.     for tag in bs.find_all(target): # 循环抠出单词
    / h/ G" v" P+ B- q
  8.         worddefine = getworddefine(tag): t3 |( c, A. \1 l" P: _( }
复制代码

$ F6 x+ U* B. E5 K2 J2 l$ x! I* k% h8 ?" o( f3 J& B" u
IV. 片断索引型网站
; e. p3 `7 p" D3 j如:& v- o/ ?8 W0 i* E- W: y
ODE(http://www.oxforddictionaries.com/
9 I( L0 }$ ]0 g& h- d每查一个单词,右侧边栏有个Nearby words
1 x8 X3 P8 x  y# E9 |1 t3 p/ |: IRHD(http://dictionary.reference.com/! Y* l  h  K- e& {) A) H" p- R
右侧边栏有Nearby words
. q. P4 _! v* ^) S/ C$ ?6 J# X  wCALD(http://dictionary.cambridge.org/7 _, L0 n3 u. M- [, A' J
在页面的最下面有个Browse栏,给出前后相邻的单词5 X/ Z. Q- b) f
这类网站没有总索引,只好利用它的Nearby栏。
( M6 g, z& I  O8 N思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,4 {' P. I4 y: J
每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)5 A4 R- v( G) q+ o2 v& A2 W
  1. & u8 W& ~; D1 z# L9 o( {, l- X) K
  2. cur = 'a'3 I6 L: F/ r+ ]/ c! y3 ~8 o9 J
  3. end = 'z'
    5 k* l2 J- F: Y, l
  4. nexturl = ''.join(['http://somewebsite.com/', cur])
    * o! a* ]' k$ b# _9 |$ w
  5. while cur!=end and nexturl:6 h. z- v/ U1 O7 V9 l. t( v- X, c
  6.     page = getpage(nexturl) # 下载单词页面; E, C  c1 ]" S. f% M
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接
    $ e( t3 Z8 h4 ?" U& a, E" n
复制代码

/ q8 N+ r0 O; R0 n/ y" @, F9 _% ~4 C4 e
V. 完全没有任何索引,那就没法子了( }+ b* }; c  q$ D
当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理
/ c. s8 w+ I3 n6 K理论上也是可以的,就是效率差一点;
* L3 |# _7 y: `7 i7 A另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。% c- R7 y( l  R
" n! z0 l( {+ R
3、提高下载效率
- {( k) N# t" A# i3 rI. 多进程
5 c: e/ ^8 z$ q( r上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。, h8 s1 X* }9 l' i
实际抓网站时,这么做效率显然是非常低的。
. D) J6 W) q5 s( {假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,
; [$ q0 Q3 g% @4 h& r  _有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。
2 i0 T* C; n/ P% V$ a假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?8 Q0 q$ a: ?' l0 k. P+ \
要速战速决,就得开多进程。9 K8 ~- r7 |& |4 s5 h; |* ?: o6 a
同样十万个单词,分成25个进程下,也就是28/25=1个多小时。& O) n) ^3 L6 `+ \0 |7 c# U
再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。
! S& J0 ^1 Y3 h2 w# f在Python里开多进程,同样十分简单,
2 v: V* V- Z1 v" T; M( i' ^# }
  1. ; p: F5 s' P; |9 `5 ^
  2. from multiprocessing import Pool: S4 t; z, A) }" Q" S: y
  3. pool = Pool(25) # 开25个进程9 q' i% L# M2 J& q
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数
    ; R5 u0 H0 Y; B/ ]9 F/ X
复制代码
7 t3 {$ G: n% n" |" N4 B
这就搞定了。/ J) A, {$ E$ N, ^) Y5 F" G% E
5 p7 ]/ R& C% F
对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,
+ V+ S$ ^% F  c  I- o关于IV.,事先没有单词总表,就只好采用区间的概念,( k) z3 p7 f, l/ F; q
比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载
" P3 n: A; c- E" x0 M. J* l& {
6 C# D+ C8 H8 T1 K  A6 b初学编程的人,一碰到进程、线程,常常有种畏惧感,- Q" \9 a; B, T  ^+ [
看到同步锁、共享内存、信号量什么的顿时觉得头大。3 q" V7 N1 M6 j8 X2 X) n2 |* F
其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,
) X# n6 Z. q5 K* _9 {其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。  w3 K; C- o- \  R
+ ^. ]0 m) C. ]+ b
II. 断点续传/ H6 n- c  H2 q" b, u. `+ P$ Z
事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。3 c$ C9 _5 C) p: C  O+ E  @( z- G& ?
所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;6 q) C' n( A1 `; F& O4 ^% F
即便无法自行恢复,也得容易手工处理,不然可有的烦了。
# i" r, h: m- {9 B% u% ~这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,' F) w  `! d9 v- s9 R6 U/ z
直到所有区块下完。
' r. {, |, x  M1 z* E
  1. , [* F/ ?; V5 T. x! V
  2. def fetch_a_word(part, word, url, data): # 下载一个单词1 h( s' M; }- f  G: ~# h
  3.     word_define, failed = get_a_word_from_website(word, url)
    + ~, y+ v% c% @; q, {' C
  4.     if failed:
    / _' k* j2 t) v! G
  5.         dump_failed_word(part) # 输出下载失败的单词及网址+ C) j6 c) F7 k- S
  6.         return False
    ! h  T- r+ f0 |  E
  7.     else:
    6 V9 w0 L( A; z& k4 r
  8.         data.append(word_define) # 保存下载成功的单词数据
    9 s0 N$ [/ S+ f) a4 J/ u
  9.         return True
    + G+ K, V* T# ]  C% u2 W

  10. $ Q, ^  b- m0 ~& k4 f: T) I8 @
  11. def download(part): # 下载一个区块" a* _6 _6 ]2 ^8 c8 Y5 z* L/ f
  12.     words = getwordlist(part) # 读取单词总表
    1 f; d; y$ {! l1 S& o0 t
  13.     if hasfailed(part):
    ; K( i3 U; b& S( V  S. S
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址
    & [; F3 H% I: T2 s# w1 i" l( I
  15.     else:
    8 V# r  U# D& I* Y! L2 @# P
  16.         word, url = words[0] # 首次从头下载$ b4 N' F$ M% m( B. t  M
  17.     data = [] # 用来存放单词定义) p) Z9 Z; m" h( r! h* m1 \  k
  18.     while not_end(words): # 循环下载
    # G3 s, c7 `- ?1 \: K# ^5 Q, O
  19.         if not fetch_a_word(part, word, url, data):: W, E1 y+ W: o8 i* ]
  20.             failed = True
    . j# y- x) T  X+ k
  21.             break9 ]* l2 W2 D: Y2 {* \
  22.         else:9 c9 e; C& J3 F3 B* i6 ?
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址
    3 v5 m. f0 o0 A- C
  24.     if failed:8 u7 o- r, V/ v! A* W
  25.         suffix = '.part', V4 N6 b8 u1 f* m; P
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'
    0 _6 o/ V) t# S' _  o- o# ^" [
  27. 2 U- u. y( Q8 x2 y' p. ^% M3 ?4 L
  28. def isfinished(part) : # 判断某区块是否下载完成
    $ J3 _/ n. Z  {/ m
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断
    ' a; P$ e, q" L& S6 q* s
  30.         return True
    - V' B$ R2 Y7 C) V6 f6 \
  31.     else:
    7 H7 V! h; N* D( Q. N+ Z8 Z
  32.         return False- z/ y! `% x  b2 g7 `7 @

  33. 5 M- C6 j9 y$ A% C/ s3 S
  34. def downloadloop(): # 循环检测未下完的区块
    8 ]- |& \' f5 p$ D* m6 p* m
  35.     finished = 0
    ' `: o1 V3 \6 `
  36.     while not finished:+ F$ T8 j* m0 G* E( H# I
  37.         nf = [] # 没下完的区块, ?. x, \4 w+ U( i
  38.         for part in parts:7 z8 q+ {% R$ ^. Y4 E7 \4 P5 u5 s
  39.             if not isfinished(part):
    4 E- a; W/ T4 E6 m- g
  40.                 nf.append(part)4 Z' [- H1 u5 S+ {2 N- H
  41.         finished = not nf2 B' t) V( a+ n2 s/ d$ |4 n+ [
  42.         for part in nf:
    3 e2 c6 p" Y& B) P/ g1 A
  43.             download(part), X) e8 g3 j9 h' d3 F3 g5 Z
复制代码

8 k# a- }1 z1 c  I! t1 i+ b, y7 Q+ l6 f1 _; N5 n& d9 b  J" e
III. 高速下载网页的小技巧
3 R8 Z& Q! [/ X% g& N1 r) k: `Python里面有三个库都可以用来下载网页:urllib2、urllib3和requests。6 U' i; e9 b: F) g
其中urllib2是Python原生的,urllib3和requests为第三方库。! N) Q& c1 W6 L) n6 D
(似乎Python3已经把urllib3收编为正规军了)
1 [+ p7 P! T" j0 T这三个库有什么区别呢?
2 U, H! L* V( G; i; s形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。) Z  B) ?, r8 b2 s
再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,
3 o2 G; k1 N# n; |. |+ a所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。/ A8 e* y( Z1 {5 \
但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。/ a/ B1 ~5 v. Y
这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,+ T8 F3 o9 d2 K9 X5 D- x! `. {) y6 I
通吃一切网站。
  P7 l# e# A8 y" Y9 b& v( o+ P; T& _所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。
1 Z% ^! x6 u4 g0 L  [这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:) M$ B' l4 B( S' N9 {
http://urllib3.readthedocs.org/en/latest/6 `# z6 R# \& Y
http://docs.python-requests.org/en/latest/
2 m4 `) R. N, [% C" |/ J9 M
  1. 7 Z% M1 c  X3 V6 ?- U
  2. #urllib28 y) B- ]( p# ?3 p1 x3 T/ L
  3. import urllib23 C3 D: T; K" r! i
  4. def getpage(url):9 ^9 h1 x4 H  |* S9 N3 M% w
  5.     req = urllib2.Request(url)
    , d. n# w8 t8 j- V! T! Y
  6.     response = urllib2.urlopen(req)( b, k( Q$ q+ H* g4 G# B
  7.     page = response.read()
    $ ?" b3 k) Y6 Y9 @/ z! W
  8. + P) g6 y7 L9 f
  9. #urllib3
    ( E+ D% s1 m1 j) B! Q
  10. from urllib3 import PoolManager  |7 V' b+ \- Q" r- ], m
  11. http = PoolManager()
    # t! O1 D! C* V9 r2 L5 P4 `7 F
  12. def getpage(http, url):- g4 d# _6 m6 ]0 h
  13.     r = http.request('GET', url)
    ) E4 R+ ?3 O" t4 [+ N3 ^: n
  14.     if r.status == 200:9 w+ N2 P' k$ s; M& L& K
  15.         return r.data
    ) W* S2 V; ?. ^& ~) s" O
  16.     else:6 V! @& f: ?) C/ n" w
  17.         return None$ t8 Z; @0 c/ r! Q/ K$ s0 X, ]
  18.   q3 f1 g1 `1 h: q! e
  19. #requests) y0 X- S3 i( n7 x: y
  20. import requests
    4 @& L: Y5 N0 f3 I3 X2 Q* U, M
  21. session = requests.Session()
    ' ^: I3 q5 q' }2 G
  22. def getpage(session, url):5 d2 i) D- n  G" `% B
  23.     r = session.get(url, timeout=10)
    7 u* {4 e' ]2 N% @9 [5 q2 I
  24.     if r.status == 200:2 Q: h5 n& C; l
  25.         return r.content" i1 j  q. J0 z, t: R% d  d% l, E
  26.     else:6 \& ?6 x, I1 }! f
  27.         return None
    3 u9 y: ~( O0 G7 k- u% R
复制代码
# [7 e1 O$ u' o# T
四、后期制作
# j- B# \! n: i8 p( f9 H' h$ B1 G3 K1、文本处理,是个特征识别问题。
3 P$ `$ y4 h: j2 W, b7 G8 w; l$ _本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。
& }0 ~8 q6 F; D7 ]当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)1 R9 S, Y' _. L
都涉及到特征识别问题。
6 ~9 O$ {8 R+ L' [! S- |9 {相比这些高难度动作,文本处理算是比较简单、基础。
' s* K9 h6 Z  F2 T/ dPython里常用的文本处理技术:正则表达式、BeatifulSoup、lxml
2 ^" J: {; h* W/ h8 V正则表达式非常强大,但没法处理递归嵌套的标签型数据8 P$ C5 P1 C( e# c, V
(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);" j+ w9 g0 S/ l7 i  q
BeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。
+ ~# a; r: W; b  M: J8 R5 u所以常常要结合使用。  u4 ^5 k  E' i
这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。/ _( w9 E1 {. t, S5 R, Z

6 h$ ~% b; v: a, y8 V6 y9 a2、排版4 g2 @4 h- N7 r" ?+ \; b6 [
HTML、CSS的基础知识:
  a8 [8 _6 S( r8 Khttp://www.w3school.com.cn/html/index.asp
8 L$ u5 q4 g- Z1 lhttp://www.w3school.com.cn/css/index.asp; g+ w* N; j) M/ r# ?) w- B* E9 o
http://www.w3school.com.cn/css3/index.asp" s. J/ H% z; N% W  ~
非常系统、非常全面。
; _' y$ O' Q3 [; M1 \排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。" r; J/ I6 B7 f
) s* v) `4 u$ }2 l) t, K) ~. X
五、结语' Q. Q2 u. y0 N# w* |! h) D) b
花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。
! o1 C5 l8 ^7 g# S% @所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——
/ b- x" o- v( {8 p: `大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。; ]* ~4 p9 g9 k: L4 @% D
9 g5 ~0 @5 e) a: V1 l# T- u# H
打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。% k- b% j  z" R6 P! Z- q

( y9 Q- k5 Q( C& r只是拜托不要打扰别人,真想要就自己动手。1 X' Q0 `4 d! L' I) O
尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。; K. h" Z  V0 S, c2 ?& n9 p0 O9 w
水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。( Z. I" e5 Q& z7 G- T
虽然每个人都觉得自己至高无上,应当受到别人重视,
$ W3 V0 k/ H$ D" ^2 l4 Q其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰
  e5 r7 f8 H  `1 e" T( Q2 i* y  G/ R
* z: I' g$ {9 z# `/ _. Z
========$ l! _+ ^0 b$ X) d! c
六、拾遗
) n0 F1 E0 O3 ?+ E8 Y关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类
- X9 A# w4 T# o确实如此5 K( K% S2 n) B$ i4 K
不过这里只是举例而已,不用太较真啦 9 G1 ~# h! u# l4 \
实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏
9 Z0 `) B/ e" d- b0 B这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。
. a- c. S8 y) ^+ w! y3 @% D. U即,; _" [/ e. z  `1 A- X7 C1 j
第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)! @6 F( K. {3 T4 f2 @% w
第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)& e- v4 S6 Q- _( x
第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作3 r% j; b  m2 q1 U+ ^+ x
。。。
( ~  b/ n* [  S1 z$ j* B' |直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空)
+ W' F) @$ B( t& r- \  _最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。  K5 I. e! j+ u6 C
形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。3 ]# i* k' f7 K+ {! I5 V
因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。
5 N5 t! P- C" `' y

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:416 a$ E! K) F& y/ P& K- @0 R
感谢楼主分享知识和经验。4 ^/ `! N  m$ I% @  f

. Y/ t+ Z$ d, n每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...
  ^% C* L2 Y4 S) \7 l+ S
现有的mdx词典,其实足够绝大多数人用一辈子的了2 ]; q( E- t: k' C  d

* m1 b* z# B  X+ q# g本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。
6 A4 K. c0 ^5 n5 F7 z& q0 q" |
. T# Y/ Z; u1 n8 {9 l+ G本人最常用的词典:, F3 s: a5 }+ G& |$ v
主力阵容:VOC、ODE、WBD。
/ M( W4 x: [7 H8 G  @4 t三本都是中型词典,收词量均在14w上下,以本人目前的阅读面来看,还未遇到这三本里面查不到的单词、未收录的义项。据说史上掌握单词量最大的人是政治家兼散文家丘吉尔,也没超过14w。除非钻故纸堆,恐怕用到W3、SOED的机会不多。
! |8 o; U. A2 I! g/ R: `4 h. t2 w! ^5 v6 a* x5 ^& B
替补阵容:LDOCE、词源、短语8in1、韦小黄&韦小绿、Garner Usage。
" q9 c$ p9 H/ [% _7 F3 e! OLDOCE用来查常用词的惯用法/搭配、语法信息;
% ]) A2 o  [( J' T词源用来辅助理解、记忆单词;* Y& b5 N0 O) S, f
短语8in1用来查漏网的惯用搭配、非正规用法;3 w8 L1 O, c7 C7 T# g1 ]
韦小黄/Garner Usage用来辨析/比较同义反义、正误用法;; e7 `* I1 t3 b; p2 U0 ]
韦小绿用来辅助理解、记忆大词。小绿真是本好词典,有人说里面收的单词都是一辈子才能见一次的那种,其实不然。它虽然只收了1400多词,却几乎都是高频的大词。从本人的使用体验看,查得率相当高。比如最近看新闻说一种超大蜘蛛,里面有个词arachnid。别的词典只是干巴巴地说4对脚的生物之类的,只有韦小绿说了它的来源:从前有个女孩叫Arachne,编织技艺了得,把雅典娜女神给比下去了,结果激怒了女神,被她变成蜘蛛,终身织网。这种解释多有意思,看了永远忘不了。  R% K# V; x* B* H& A
' ]2 a3 ^5 ?5 U6 a0 w- B3 F2 p
上述词典,坛子里都有,无非是版本新一点旧一点。比如朗文5和朗文6,有人统计95%以上的内容都是一样的。如果是完美性格,非要用最新版,那就只有自己动手。不会有人在词典出版的第一年就去挑战版权方的。
& k1 Q" U- H+ l1 j3 t0 c" o1 B“对于好学生,任何教育资源都应该是免费的”。虽然本人同意这种说法,也认为现行的版权制度存在重大问题——有人靠垄断知识获利,却完全合法;但是本人从未打算挑衅版权方,更未想过做Aaron Swartz那样的斗士。靠垄断知识获利是有点无耻,但如果没有利润,也就不会有人去做整理资料的事,这确实是个难题。& R0 j  h: A1 q% V- s6 {

2 U0 F" \- V+ ^4 j还有些人没事喜欢收藏词典,收集了一大堆,却从来不用。说到词典收藏癖,想起以前的一位室友,那家伙每天最大的兴趣就是下载影片刻光盘,大概刻了几百张,还在不停地刻。但是从没见他看过,他也不让别人看。
% r# Q" a3 l. c! _" k) d/ i; D6 c这种癖好大概是来自于原始社会的一种遗传,人们总觉得应该储备点东西,说不定未来某一天就会用到。其实那一天说不定永远也不会到来,不如就把今天当作那一天好了。有多少人买了一书柜的书,到死的那一天都没看完,甚至有些书连封皮都没揭开过。
5 Z* e0 G& Z6 `" K; u1 g9 `

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。
) s% H& v* s" A; Y& H; x7 B其实只是你没有发现而已。
& \5 f) a0 R* w8 Y: l1 Y6 vODE: http://www.oxforddictionaries.com/browse/english/
& }+ C. }3 j& z# ARHD:http://dictionary.reference.com/list/a/$ x* j3 P% j( g6 y4 \9 o8 }
CALD:http://dictionary.cambridge.org/browse/learner-english/$ U' O) D! }& s: b+ {: _1 p: }8 g& ^
8 R5 J. O" N6 e
如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。
0 C7 w, a9 r$ K3 {0 P" u以第二个为例:& \$ P. L" u3 Q
inurl:browse | inurl:list site:dictionary.reference.com1 g8 ^' Y0 ?0 U" v* m& Z

( P5 k+ ?  ~; m4 m& |7 a8 W. |PS:最近才发现这里,发现资料很多啊。
: o0 s% _2 U  t4 m

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧
4 {/ I5 ]1 j! l1 C/ H# k
: W/ N  M1 x* r. J2 |' `' e假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改
4 X4 X  l; _: M0 V7 ]9 A或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下
" X5 O  a; @( H& J& {$ Q1 N结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。1 p$ b3 p. W4 N; V& W3 g( {
这里有个比较省时省力的小技巧,可以快速定位到想找的地方
( k9 \% v0 W: K. m( }5 g2 f
9 T! h4 f1 I- s: A/ e1、Goldendict里,在想修改的地方点右键,有个“审查元素”:
, n+ A' q" s5 G# M7 j
3 S) F% R' a. \# n" k( B& h, Z' W' e' a: |9 ?
2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事
" n' ]4 @- y* ]
# ^. y- X8 B" r# J( z9 g+ `
# c6 \6 y# M, E6 f4 _8 I3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方
- J2 s! T1 x, R3 I5 M0 s9 i  p, \* R; T: u( }; H) e

& e" c) b3 ~" ^5 e6 f6 z$ D! d, V收工

该用户从未签到

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

0 b) a4 T- f% T) T. L* i8 Q
  R  R4 ?. |6 B7 L 3 ?9 H* @+ P1 \8 s2 W% S
, G) f# |  |2 Y( ^' w' J
感谢楼主分享知识和经验。  L$ d8 u4 h( F9 O, c

% m& x; G7 y; L6 P: U, b每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。: W/ c% B: \: t$ U

- h1 _2 w0 v7 b7 R私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。: u. N' d- S8 M/ x# G' i$ |

; z  t* s2 X" n# X2 N: z! ^! ]但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。. G' H0 L, {* Z/ @3 Z
) P1 w% n; t. H4 W8 M* Q$ u
除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。
4 }* T8 T6 y# j  m! J9 r/ L
' x0 y' s/ e/ z  S+ M- @* ^
% P( G8 C( l: Y: n9 A7 u$ d( p; t/ S; [6 }' `& W, c

0 y, `* e8 P1 X& s8 i( a

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件2 E( G. ~- g7 q) l0 [
  • EmEditor
  • Beyond compare
    . o- ]8 I0 N* |! W8 T

8 g$ E- g! j( S5 M
$ O1 {- P  J9 I: b前者用于编辑,后者用于差分比较8 ^6 u; {( J, W: }7 \
处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

发表于 2016-6-8 07:41:03 | 显示全部楼层
bt4baidu 发表于 2014-10-25 21:01
0 e7 B! N7 J2 V现有的mdx词典,其实足够绝大多数人用一辈子的了2 K' W% f% N. U
& M2 u1 [( ^5 P: f6 w( S- f1 _
本人前段时间制作、收集了不少,经过一段时间的比较 ...

7 p" |) M; J! f/ u2 W- Q6 \7 {肺腑之言。

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考( A2 P) g( v8 w" @# v
% E8 ~( N! l8 v) v9 B$ r
网页设计中最常用的字体有哪些?(中文和英文)7 R/ I2 o& R$ x. F0 f/ g! z
http://www.zhihu.com/question/19680724# h6 l; X- H  b# W4 W
2 K5 Y' a( ~4 ~/ p+ E
本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode
/ M9 a; {8 a2 w; b这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全
$ z+ x; U2 d- i4 v4 i8 D/ a/ t另外Open Sans字体也挺漂亮
: D+ Y; h( K  f* O  t4 p
  • 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$ r$ ^: H2 y% L) u
    最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...

    ( J% J9 A5 Q) L) c感觉找到适合自己的问题好少啊/ Q* q& @; A# a2 u9 M
    这个适合的话感觉是兴趣和难度! F( _3 y: A$ q# j% Q4 Z
    想请教一下楼主是怎么处理这些问题的呢4 l' Z  h1 i. [: S3 ?
    还有种不系统的感觉
  • 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 编辑
    $ ~) X6 w6 S5 B9 J4 d! W% f: u+ V& p, R# 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 编辑
    ( r. ~. j9 R& R3 t  F2 r1 G8 ^7 H8 t8 h/ G+ m, l
    java和.net就是个垃圾,我懒得提而已
    ! Z* f* o  @, W! z在Linus这样的大神眼里,连C++都是垃圾:! h" K: I4 H5 t/ U' E: P
    http://www.csdn.net/article/a/2010-06-12/218785
    ! K! ~2 m4 X  x9 u2 O+ C
    ; w( v. a' I! L* }. h如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。
    . ~! @) v) }- {3 e2 y
    1 n: a- g6 d7 K7 s/ K* d不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。' t0 C+ i$ E: k: o
    我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。0 a2 u+ U( m9 r6 G
    这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。; H7 y2 v3 I8 f" e2 A8 I0 E
    不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。% t- z" _# x6 c6 I' E( k
    为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?/ n  f, M3 K+ n& }: ?  _
    因为垃圾代码太多了。, t) r+ ?) a6 g$ i! R( D/ u
    . A0 P" m2 @) j; [1 g7 _4 D

    * W* }5 L7 r) t8 o) P7 Z3 ~7 T

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑
    7 Z. g9 r/ s: Z3 _$ ?  k9 V4 R4 K) }4 ]' W" L6 [7 m0 w
    % V0 H% l! S$ g- j& z1 p
    算了,道不同不相为交流
    2 X( L( @  k) ?7 v" ]9 @想起某个梗. u9 m5 B/ Z8 f. r
    程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!
    ) n: A2 H1 b' j9 F1 ]3 O1 r% C4 n4 a7 C
    * g# r* Q+ t4 }% I, ~6 Z自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。
    2 |* k& {; m% v. ~6 R1 m/ c9 R$ K* J+ {- j. J$ |! }. l' G5 Y  d
    另外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 k* \; D. H9 \
    算了,道不同不相为交流. @" }+ m' Y5 q
    想起某个梗
    / h" g) s/ e- ?1 z# O" t$ I程序员眼中的编程语言
    . e# R8 ?. L. C. _; o  w- p
    不同的语言适用于不同的人群:# l# j$ N; H! g& |7 I4 [
    如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。
    , `1 C) ]& q! {如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。
    ; _" V. Z& p9 e) b3 T) g1 k至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。, v) E+ C* m: A: n& J& e

    9 h. _2 F" N/ Z3 }: X. Z. t6 i编程语言的口水仗永远也打不完,不争了
    + p: T. g5 `. p& Y7 w0 m  i: m" {

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:35
    5 E- D( X5 t3 C- j不赞成多线程抓网站,但是好贴子要支持!
    ) O! w4 u& k& a+ ]8 M6 T4 C. `8 P; x: w  }
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...

    : P% Z7 Z/ p$ {下载软件?推荐一款?
    , K8 A, z4 C! @, _! \' y最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;- K- v8 W. {2 S7 x6 H+ V8 y( `9 y
    现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?
    * s" [" V7 P) Q; c2 B! }9 B比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。5 v2 x3 z8 Q0 P9 O# X% P  ~
    除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。
    5 m7 [5 A6 A6 j目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。" \) f. g, s9 n6 C* w
    + R3 Z; _1 U( c8 z1 c  m: x0 _7 X' V
    至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。! \8 M/ R, a9 B
    对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,4 n. c- n3 F9 v- B
    目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。" B" I& N5 x. P1 T5 x

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:
    5 E$ v) z7 _% J: b) M5 z. o随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。# x% R8 j+ n2 _  Q1 L" z  n" {1 P
    未来会出现一个新的行业:私人计算机管家。5 c# \# ?" U! ?7 d. {. f
    专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。
    6 O% W* ~5 @, `% j0 A' M* V- ~但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:292 c' d1 Z: t/ m7 g1 K
    下载软件?推荐一款?# g$ M% q  U9 ?0 J- ?
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;/ |- f; e8 K+ n: F# I6 Y, R
    现在99.999% ...
    + G- B# J& r( s- ?6 H
    用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
    6 a6 l/ e) @1 }! c1 f
    ( B! I- i! ^; }- K, j十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。
    5 I- o/ ]1 d( ^! a
    ) G3 {, ]) W5 g* R' s用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。
    9 j$ K2 Q! S3 f3 d
    ' P% e( p* f7 \; l. m3 \我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
    大熊部落 发表于 2014-10-21 16:18
    3 D& a, {6 m/ G2 H" c用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...
    + v3 Y- I4 b0 c, I. @3 @1 {
    我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件
    5 L5 U% r5 g& I. X/ P7 E
    + {0 M% c- w& Z3 x
    下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。

    - S  i. s! ]7 u5 i! R% M+ K; `/ y+ v推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

    该用户从未签到

     楼主| 发表于 2014-10-22 20:21:14 | 显示全部楼层
    平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。
    ' @1 X* r, e) u3 D; K
    * M1 b* h! o- c( Z, h2 [
    最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差8 b5 f5 q# V( A; K" v% C
    计算机是用会的,不是学会的;& j- M2 W  \$ r# u
    程序是调试出来的,不是写出来的
    ' C2 O2 R* c/ u8 p9 l
    8 H1 {2 r( G' y0 N/ P& b既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。% a! [# p: ]/ X. |2 d
    你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

    该用户从未签到

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

    - K4 V8 [1 {* b5 K多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。
    & d; H5 o) J, l/ Z  x) C5 O5 M' y& s+ G( l) p% `+ 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-25 17:33 , Processed in 0.095054 second(s), 12 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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