掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 58118|回复: 148

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

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑
$ e3 n8 Z7 G/ }, L- W. k7 w3 t; F0 D" I6 y. a. [
这篇文章主要是给计算机小白和初学者扫盲。+ R' o; m6 J9 E# w% ]3 L1 D
本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。$ |) J) \1 }0 q* I. Y
只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。7 y) k& X" _6 w* g: L
& S2 G! u& F( M0 Q5 o
一、计算机的两个终极哲学问题
* L, I% O0 b; i2 [( [2 Z6 P$ j1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。/ ?2 N1 j- I. U' H
图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:
, `2 k. T1 {) f# I/ j# ^$ u; D设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;
+ ^! l3 X7 V( ^% b) N机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。6 e8 ]8 b: D3 G* V  j2 P1 L) C: t5 q
方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。
  {7 ~2 k6 U3 Z" H“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。% l# j  Z7 @9 @* x0 c' e0 L+ i6 W
6 s# [# C. S, v$ `" I
那么要写出程序,立即就会发现不得不解决两个问题:
  J! h- A9 s: ?; ]7 [, u1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址
, _" |0 V+ V6 m& f2、怎么把两种方格区分开?也就是特征识别
& m# N% s1 E  k3 P这两个问题,就是计算机的终极哲学问题。
- @3 q! M2 ?8 Z理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。
- I: B, D' g# V. c) g/ o5 e下面的讲解也会以这两个问题为核心展开。
  M0 F- j: l* V/ Q1 R+ v; G  L3 [8 J' S5 H* c5 Z
BTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,% e# l( S3 ?3 z: z  j
——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。
3 Z! x. y( ]4 b. d: ?8 _+ o. r所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。$ O% K- D! s2 C& o  j0 q8 }
前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,
2 U! _& y$ N; ?& O; m; B: X2 r而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。
9 D  S  b3 E* u! X具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。
! \: c$ P7 J/ L" I! N, J+ W: {9 `% P4 R9 L& T
不要觉得自己上学时学的不是这个,or文科生,就不行。
  C8 A" f5 v# x$ \5 P# u江民杀毒软件大家想必都听说过。  i- |9 ^6 C4 ?# C. f% ]1 E7 Y9 g4 M: |
创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。* [6 |! L2 c1 ~6 l
咱不奢望成为专家,写写程序总还是可以的吧?
& A3 C# [$ g0 H  W' E/ \6 q( T4 z( L, X" S9 r
二、采用何种编程语言& p' `) u% i/ Y& c$ ?5 j& l# O
上面已经说过,存放、读取、组织、区分数据是编程的核心问题。: Q6 e0 P+ h& N$ ?" P3 D' y
显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。  |+ ~1 {2 ~" f8 O1 t
抓网站,恐怕没有哪种语言比Python更方便。
1 o% h# F4 X+ ?1 c5 N: }当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,6 z! \) m9 {& p( M( s- i1 y- w* Z
计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,
/ v& E- Y- Q+ ]/ n5 b没有慧根就别吃这碗饭。
4 s( k- w9 J( M4 B& s5 Y. v/ m- R1 m9 s$ r
三、网站抓取技术
1 C; o+ Q( F" W* Z6 }6 Q1、下载某一个网页,提取其内容7 ~, ]' ^) n# V6 _& W
以前写过一篇,就不重复了。参考:3 U: y9 b8 C2 M4 M; S+ G
用一个简单的例子讲讲怎样从网站上扒数据# o' u+ c- J  L9 c( ~) C5 n4 u! t
  U/ Y1 T+ O$ d! a4 }, `8 L
2、寻址问题. h% s2 ]# w2 l& f" l
下载网页,自然首先要知道网址,也就是东西放在哪儿。- A* M- p7 Z, R
如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。( ~$ E8 A, h% O8 C7 n
但是大部分在线词典,到底收了多少单词,事先是完全不知道的,
+ X% v  H5 g; L% [( g$ c5 f要把单词弄全,就要想办法得到每个单词的网址。
6 z- Q$ l( m( u' q总结各主流词典网站,大概可以分为这么几类:
6 d& \4 P4 W  Y! h# U0 r: x/ TI. 事先有单词总表
( a% N% b. b2 s% k3 o比如http://www.vocabulary.com就是这种类型。- y% A( r% k/ t, o% ^) O4 |
它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。
7 i5 U7 c( }1 w8 k" z# d5 Q: o, K$ o! i; r/ T$ B0 ?! A0 F5 }4 I' E
II. 网站有索引页面# C4 n7 A4 q9 \0 Y
如:- p* x+ }& N6 t# f0 J
OALD(http://www.oxfordlearnersdictionaries.com/
. ?0 `: l* ]* e0 n- ?! Y它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/4 F& J# A  D* Z0 {" b
LDOCE(http://global.longmandictionaries.com/) H' r9 w/ i; v6 i, P  d
采用框架结构,左侧边栏就是索引页
3 K, k+ H* j' k% }  l' Y0 z5 b( n$ HMWC(http://www.merriam-webster.com. R0 X1 F# _# Q4 `" D6 G# U/ }
索引页在 http://www.merriam-webster.com/browse/dictionary/
. g* Y5 W, N( H等等5 p5 _  g9 r0 f- I# U# u0 `; o
这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。" a4 F. r' H  T1 x& {

  1. 9 j5 x. K$ y: _9 c) V5 v' Z; z! j
  2. urls = []
    ( d, U, Y# ?5 K7 y5 W; C
  3. for someindex in indexs: # 循环所有索引页$ k+ R. g6 ?  H, p9 \+ R8 Q
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    7 d( O; L4 D8 y7 H/ [+ H, o- h& F% s
  5.     browsepage = getpage(browseurl) # 下载索引页面* F" B6 k4 X' [- c7 E, u1 G
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域
    $ Z/ b4 I  L( J2 V9 @8 ~& M
  7.     bs = BeautifulSoup(browsepage, parse_only=target). `2 a! l- l1 r- W! D
  8.     if bs:3 r& T5 N# Y' O' @& e. c
  9.         for a in bs.find_all('a'):
    7 E' f9 O) B# r1 x/ I- x* g+ n
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接) ]1 |  d; L, Z3 O) {' k& @( N$ e0 j
  11. 然后:
    & [# v# ~) O/ L  D" D8 W
  12. for url in urls: # 循环所有单词8 v, b, E* P9 h& p. S
  13.     wordpage = getpage(url) # 下载单词页面
      ]. z6 a! w2 l
复制代码

" T/ V% [, O" O! b9 V0 o- r7 f# k- x; i; U3 L
III. 索引页和单词释义一体型网站
& D7 Q$ F& }7 K  \如:Online Etymology(http://www.etymonline.com/
$ `% n- ~  s5 t4 Z0 o和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可2 f9 S) V5 P( ~; q& g8 i
  1. , N; l4 t% b& \
  2. for someindex in indexs: # 循环所有索引页) i# j/ \6 z! @1 e, i% V6 |  m' Y$ S
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    1 Y8 `  p) ~+ o, |, k4 C
  4.     page = getpage(browseurl) # 下载页面7 @8 _% B* }8 a
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域
    ' t/ F' L* L& k; R
  6.     bs = BeautifulSoup(page, parse_only=target)% |% `3 O  f1 v! \/ m" w7 O
  7.     for tag in bs.find_all(target): # 循环抠出单词
    % L/ F5 l- }/ r$ P5 V$ O" H
  8.         worddefine = getworddefine(tag); ^& s2 ]' P5 H; K' [! ]# Z1 ~
复制代码

4 z6 v, D: E3 o& j! G
0 \; E% U$ d3 L3 E- V# @- tIV. 片断索引型网站
; f) ^- x# M7 t如:
8 R3 u4 T* u- dODE(http://www.oxforddictionaries.com/
7 w% u- A# A! _5 Z3 ^2 W( s1 W7 Q每查一个单词,右侧边栏有个Nearby words
1 A/ |3 c* v' M) f+ U& f3 }( M) IRHD(http://dictionary.reference.com/# |  o8 u& j( y2 e3 P1 X8 k% D0 Q
右侧边栏有Nearby words
; R3 e7 e4 x0 @% c& tCALD(http://dictionary.cambridge.org/+ ]- V. Y% e0 }# `# U( f* |; x% ^
在页面的最下面有个Browse栏,给出前后相邻的单词. q4 N8 B: n5 V* T6 g& l
这类网站没有总索引,只好利用它的Nearby栏。
4 T7 t6 `/ D1 x! c3 l2 K思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,
7 c, p9 t  l, I4 x; Q% u6 ]1 n每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)
1 ?& M' M3 U0 d5 r9 c" ~
  1. - @& I+ d' c/ A: a8 R9 Z4 ~" E4 v8 I& d* G
  2. cur = 'a'+ S% q3 }' C9 J' m0 ^2 `0 a
  3. end = 'z'- \. o. k0 c/ C: V$ C; E3 r* J" h
  4. nexturl = ''.join(['http://somewebsite.com/', cur])
    4 \2 p  i: }2 R8 \$ G0 g1 e$ n
  5. while cur!=end and nexturl:" S- a& z$ f- O! Z% x% \6 ~0 Q
  6.     page = getpage(nexturl) # 下载单词页面
    * y% c1 q$ W: A" ~
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接" K, m6 M, e8 \0 U9 c8 b
复制代码
) s& Y: P$ S, t; y! B  [

1 \3 m; ?3 O$ c, ^- \V. 完全没有任何索引,那就没法子了
$ a: W' m/ ]4 n7 o/ P& f当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理& h' \' F) D2 i+ S; t
理论上也是可以的,就是效率差一点;
2 g* X* ^- {! ~5 |, s另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。
* T  w* o7 a, S1 b" a. ]
1 {' ?3 y$ ]8 x! h3、提高下载效率  e; p) i/ _6 m# @; l0 P7 v6 V4 O
I. 多进程3 W# h& `; d* S7 ], u1 r
上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。
2 C% m7 ?4 S  m3 N. J, h& r实际抓网站时,这么做效率显然是非常低的。; x  t. Q: D" h& P
假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,# D7 V4 i9 ^% Z7 S
有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。
' `& K( H' [  u8 n6 h0 h7 Y假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?
+ D. D: X& O/ o" c3 Q  Z  E要速战速决,就得开多进程。1 f3 a$ c. F1 D0 b3 T/ }* Y
同样十万个单词,分成25个进程下,也就是28/25=1个多小时。
/ s9 r. l& Z2 d, Q6 H- Z& n再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。+ j( i5 C0 k6 J, l& ?
在Python里开多进程,同样十分简单,# m& T! |' s9 l! t) o3 ^
  1. 5 ]. p4 p. R0 i" ^/ W; U
  2. from multiprocessing import Pool
    5 D5 k$ X8 |4 s, Q
  3. pool = Pool(25) # 开25个进程
    ! }9 Q  J6 b2 M8 `7 G5 k
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数
    4 D, f' e5 e8 {! }
复制代码

; \2 V# F( B. c4 a9 Q5 W这就搞定了。/ c5 g7 F0 k" s0 D# x% e
; B- O. F% y- h2 M
对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,
9 D  Y: ?. s7 r$ ~# Q) v0 h关于IV.,事先没有单词总表,就只好采用区间的概念,
  D* j0 E! h7 `比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载# J2 Y, [& x6 K' E( b
9 T) q) M8 w% H
初学编程的人,一碰到进程、线程,常常有种畏惧感,
3 }1 K; W% P- T3 [: V$ b4 a看到同步锁、共享内存、信号量什么的顿时觉得头大。! {2 R6 P: u# f
其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,) R5 Z. h& d- C$ J% S3 _3 W
其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。# s5 m7 ]5 c# m; }* P: v% I, Y

1 ^2 B, x/ ~- u9 ^II. 断点续传1 s5 m$ C0 d: u# A" H3 r
事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。8 L( _  }' v. N" i7 R2 O4 N
所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;
# ]8 J8 f+ T5 B% ^3 X: E! X即便无法自行恢复,也得容易手工处理,不然可有的烦了。
9 z7 L! }' _1 I6 N, R这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,& D4 c! N  ~' w3 W2 }6 p8 w
直到所有区块下完。" L# T% r% i, I. u5 }' i. }& ^, D
  1. 0 b  [; m" y4 }7 B. H
  2. def fetch_a_word(part, word, url, data): # 下载一个单词
    9 [) q4 C# X% o: Z) w* l$ W
  3.     word_define, failed = get_a_word_from_website(word, url)3 Q! N& l# N8 {' y& y0 r
  4.     if failed:' \/ D) @8 H3 }9 S
  5.         dump_failed_word(part) # 输出下载失败的单词及网址5 [% m6 F  F9 X* X" g- \
  6.         return False
    5 a1 C0 e; x  b1 p! J- S
  7.     else:
    4 Z1 K2 J+ D/ ?& u3 s
  8.         data.append(word_define) # 保存下载成功的单词数据7 \: l0 P6 }' h9 d4 W5 v
  9.         return True, Y1 ]* G& Y# O2 Y% Q! K6 `' Y

  10. ( f& Z0 H" R8 [/ }; r( V% c4 [- x. E
  11. def download(part): # 下载一个区块
    * Z2 O7 s+ B2 N; [7 g
  12.     words = getwordlist(part) # 读取单词总表
    5 b( ]+ w& R' Y# N- V9 X& X4 h0 E
  13.     if hasfailed(part):
    4 ~* Y1 V. A- }5 N) N* U6 i5 M
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址
    3 y/ `" X& Z& j8 ^4 w, L
  15.     else:
    . ]; E5 `% F- B) C, i, E8 y
  16.         word, url = words[0] # 首次从头下载
    4 @4 A* Y4 H! W6 b% G
  17.     data = [] # 用来存放单词定义
    9 |7 E2 U4 @2 T8 R
  18.     while not_end(words): # 循环下载% F9 S+ s; K% v6 [
  19.         if not fetch_a_word(part, word, url, data):; f& |/ K6 o1 m1 b9 o) L( S
  20.             failed = True
    6 ]! u2 H2 V2 ]
  21.             break
    9 `; v' R. o5 v0 s+ L
  22.         else:5 x6 @, {/ m: k2 ~1 s0 s
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址
    4 w3 H. b& ?; Q3 k' |8 v4 c4 y, W- ]
  24.     if failed:
    - d, G! L6 x4 y$ p1 P1 H+ S
  25.         suffix = '.part'
    ) t1 i1 ?! o0 h: {% P' m1 A
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'
    / ]# d4 N% h6 I. c( j1 W* M, s

  27. - U2 N" k% H! u
  28. def isfinished(part) : # 判断某区块是否下载完成
    % a) d4 R  K4 Q5 t4 I  d- p2 E
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断
    * O6 _8 H0 K5 M! S: s7 e( b
  30.         return True
    2 Y  n& V8 ]- D! k. m' H$ W4 v7 s* Q
  31.     else:+ k5 I9 A5 h( c/ a' l
  32.         return False
    : ^5 A$ e/ p: c3 h5 r* W, \" c- L

  33. 8 b2 d1 b" B3 z) K8 ?5 p9 x! U
  34. def downloadloop(): # 循环检测未下完的区块1 P3 ]! G/ V5 S
  35.     finished = 0
    - o% ^* E* h( c" ?0 e# L0 S2 a
  36.     while not finished:
    1 O4 T1 Z( s/ k1 J2 C; F3 c8 E4 e. f7 `
  37.         nf = [] # 没下完的区块
    " m9 D$ x% E: x" ?% n
  38.         for part in parts:5 W* W' J/ o4 d% R* [6 r
  39.             if not isfinished(part):
    " u& j5 C7 e; Y. N
  40.                 nf.append(part)/ G& ^& \, j5 c0 Y
  41.         finished = not nf. o" e' D; i3 J) a2 |
  42.         for part in nf:
    + y. k* ?" v! \$ k6 T( c
  43.             download(part)
    + X- s. ]4 y0 F7 ~( d! e( x
复制代码

6 Z& a% I! R; r. @+ Z
* |. d  [6 w4 `6 T9 MIII. 高速下载网页的小技巧
: O4 P# I8 S& ]; Z/ \: PPython里面有三个库都可以用来下载网页:urllib2、urllib3和requests。
1 I  t( _( B+ N其中urllib2是Python原生的,urllib3和requests为第三方库。
, Q1 M* A% n( ]3 I% @7 ~8 @/ D% s(似乎Python3已经把urllib3收编为正规军了)
! V8 d9 ~/ I6 r这三个库有什么区别呢?
7 f) K/ S  x5 s4 Q形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。
8 }# P) b0 E/ T4 d6 Q+ r* O9 G: R再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,
" |, _8 U2 N- d# l% t* ?所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。* u" v- a' s$ A4 P
但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。
  V0 ^' `: @8 ~这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,; t! f, f  ^! ]2 Z# r" x
通吃一切网站。
0 B( y. t* Z6 G+ {7 s7 F3 S所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。
3 Q9 ^' J6 B% U# N4 h这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:+ |8 h: {3 i$ ?, e$ d! P' k
http://urllib3.readthedocs.org/en/latest/) C' o$ s3 w/ F; H3 X$ z, T
http://docs.python-requests.org/en/latest/
1 x" \' o% S  Q# |$ F' @, j/ L5 w
  1. ) y$ |. y' {* Q0 e* p
  2. #urllib2- J# k4 D4 l( ^  q5 N" u
  3. import urllib20 k0 t7 j1 @5 b# u% U2 W" Y
  4. def getpage(url):
    . g  U7 x4 C$ f  I1 e0 O$ I  d
  5.     req = urllib2.Request(url)3 u( n  L' a( t9 |: \$ P: ~+ k( P
  6.     response = urllib2.urlopen(req)
    . a) b! Z9 Q8 ?" s2 C
  7.     page = response.read()" C! Z+ N+ Y/ B5 B/ ?

  8. % y0 c/ N$ F/ |+ D! I
  9. #urllib3; U- V0 P7 |& a0 F" f6 ^
  10. from urllib3 import PoolManager
    6 Q& T4 d. l. ~; T3 Z& r
  11. http = PoolManager()% r. k6 k8 t+ `; q& i
  12. def getpage(http, url):' S& G' |4 [' g- ?  F( p! R! ]; F
  13.     r = http.request('GET', url)! g2 w5 v+ I, q" z
  14.     if r.status == 200:
    . \2 y( g5 f* V, {; y
  15.         return r.data% U! l3 d3 F- B1 d2 R# s
  16.     else:  n3 T: r2 g8 b: p4 n* E
  17.         return None3 r4 P  c9 S# F7 w, R2 x2 G& o

  18. / M+ J& F+ u3 M/ \% c+ [
  19. #requests& R% i' z6 i" W
  20. import requests- T$ a, s' _2 j/ o+ D7 o, y1 Z
  21. session = requests.Session()
    . G) I9 C  g; Q! q/ X2 z6 B" l4 S
  22. def getpage(session, url):
    7 u1 ~( V0 B- f. u" @! p  |
  23.     r = session.get(url, timeout=10)7 |+ w0 i5 [! F* V- j* F
  24.     if r.status == 200:6 i. `& F& s- X9 }2 B0 {' P9 a
  25.         return r.content
    % _6 l3 V  G4 o9 {1 r
  26.     else:( H' k+ h% \; d  ~
  27.         return None4 Q4 a& f: o. R/ D
复制代码

7 G8 J) ?- r. N) m! }0 e% s四、后期制作
1 q6 g4 q! T8 t0 {1、文本处理,是个特征识别问题。
* q" K6 Q4 o5 a$ ~# H6 ]1 e# N本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。
& j; a3 @7 [  C: K9 l当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)
5 e6 n) @1 a" c1 ~4 r都涉及到特征识别问题。
4 \& r1 C# K4 H) T相比这些高难度动作,文本处理算是比较简单、基础。
! @% j/ A/ C% TPython里常用的文本处理技术:正则表达式、BeatifulSoup、lxml5 e- v; _7 b+ ~7 F# ], h8 @
正则表达式非常强大,但没法处理递归嵌套的标签型数据0 g, E% F6 E1 Z1 K! U5 |
(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);4 o# y9 z3 D+ t# }3 I; Y! P) g
BeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。9 e* U/ }9 }' l( Q& t
所以常常要结合使用。
0 d' T, m- B8 {6 o这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。
3 ~6 P, m8 j! t2 _" J- s# q1 O3 ~1 f$ ?3 \7 L# S0 t
2、排版
# {8 Q& U! b, m* l( k9 NHTML、CSS的基础知识:  H$ e0 ^3 ^  z, ^& ~5 q. \
http://www.w3school.com.cn/html/index.asp
" }7 o+ R6 q2 E* J6 I" J3 mhttp://www.w3school.com.cn/css/index.asp7 H6 m+ P0 F! b6 S2 A
http://www.w3school.com.cn/css3/index.asp
5 Z8 _9 u9 e) a- y非常系统、非常全面。
8 w& J% e. F; a4 ]( g# z排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。
% [) `' X4 E& _! z2 g) N& y3 X
- t. T. U- T4 Q7 c1 W% W% }五、结语
- c# u: \8 B/ q5 V$ X9 k花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。" P' k9 ?& D: d  X
所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——% A1 y" A( Q4 |9 ~0 w
大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。. M' S; {+ |: O& e8 X( v$ ~9 y. O

+ W  w3 |, a3 G; v$ G" g- d打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。
7 J% l' F  c. x# H4 q9 \- P  Q3 m* K6 _. c5 E! q
只是拜托不要打扰别人,真想要就自己动手。, f8 ]' o2 t' n) d( w  ^
尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。$ t* ]) T% J3 |, r4 P
水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。, Y! Z2 M  l- f! b$ P8 ]7 x# m7 F
虽然每个人都觉得自己至高无上,应当受到别人重视,
. U0 v( h, p$ |0 h, k6 q其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰
: R+ W  K$ F4 b- Q' ~$ L5 P. x/ F: L  v* ]* R& c
/ F" k! L+ K) |; S
========
, L% j' v# A0 I6 |7 ~3 ^1 _3 @六、拾遗
& r: E" n* A) q; t1 S& F关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类
7 b5 S7 C0 R) f9 e  ~( @, s确实如此
. t; @+ V( _# @# u& a8 H6 @不过这里只是举例而已,不用太较真啦 : m( ~* C/ J0 ^% j
实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏
% L* N* b4 w) H# h这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。+ R. x; w4 O, b+ J8 r
即,; Y. ?9 P8 d. D  Y; m! `2 d5 C! X
第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)
0 V  @+ h& \4 J2 `% M  |; J1 M第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)
0 Y5 x+ R  }" g* j; J- D% n0 z4 K第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作: V: T! L: `3 g3 J6 h
。。。) U7 x2 i' Q8 N1 j# F: p
直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空)1 L' ?+ a. B; }4 X5 D7 N! d1 D
最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。) S, S$ J  [* e) s, T: F+ f
形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。  t; s& Q7 Y% B5 b
因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。
- w% r- C- \1 j6 z: ?/ q

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:414 Z( Y* ?6 m+ {& z
感谢楼主分享知识和经验。1 Q6 T+ d" z- z; Z

9 Y- L* B- _' Y每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...

' ?( o" B( F& t! C( k1 d# A现有的mdx词典,其实足够绝大多数人用一辈子的了
2 f; h, V  \7 s7 ?% w) ^5 }- C( R. X5 J+ y) U
本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。# W* F) X6 B. S6 l

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

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。3 m  j7 V. e8 k8 Q
其实只是你没有发现而已。# p7 a- \4 c# n7 \
ODE: http://www.oxforddictionaries.com/browse/english/8 A7 }6 N( N7 }" P6 m8 l0 r0 x8 X. ?
RHD:http://dictionary.reference.com/list/a/
8 V" ^8 y: _' R6 h/ F& `- t7 dCALD:http://dictionary.cambridge.org/browse/learner-english/
0 |) v0 t! L8 x* c) {8 _1 h/ h6 J8 W) e9 {! P
如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。
( n, \: y& L; b0 `7 s9 y以第二个为例:6 Y! g& s+ b2 Z# m& u
inurl:browse | inurl:list site:dictionary.reference.com
; O# c! O& I) r/ O
0 l4 _7 r+ D1 G+ Q1 {" M1 l) b( tPS:最近才发现这里,发现资料很多啊。
7 L2 T5 R+ o# V# P6 j: o3 e

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧
0 R, l$ C# ^. F( l, |' }% i6 ~: x6 d% C+ l! r- W7 f! @7 y1 P  F
假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改7 ?+ _7 c- I! H9 N# }2 p/ c& B- u
或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下7 {2 s0 h& T, b# ?* o
结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。
: J3 x' J& d0 K7 Z/ U* H2 D2 I这里有个比较省时省力的小技巧,可以快速定位到想找的地方
6 P2 m7 m! U1 I, W: \
: h* C3 }3 x, {1 f) g+ }1、Goldendict里,在想修改的地方点右键,有个“审查元素”:) D$ s% o  G7 p8 ?" }
" a0 j7 c' c! m' _: V+ ^! Q
. k9 b2 I6 I! j( n3 D+ B# j
2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事
2 u% l* d$ R! e, R) S2 R' H$ S) E
8 o* Y' K$ \+ E
- J# F/ l' Q% T, c3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方
5 z7 h5 m* V! H
* [8 U/ T, |/ [( e! Y4 m" ]$ K4 ?8 r! K1 s# j7 p3 Y! U
收工

该用户从未签到

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

; A) s: n% c% @* w% w9 m6 b5 u* E( U# d. k3 l8 P: A4 v' a/ U+ }
. D( T2 o- P5 e% P9 |
/ O% o2 w  I! e: ^$ k9 }: ]+ ?  H, b, j
感谢楼主分享知识和经验。. P4 \/ F$ H( f1 \% s

' J0 S3 r; H8 Z; F. [0 Z每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。
7 ^& i) [; e6 l- L
8 S' u. O. ~1 W( q: {私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。
1 \% k+ N4 h6 x# c; @1 `
# y5 b* A0 V5 @但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。
: ?5 b" b1 I; {3 L  |
* B5 Y: B" r* U' i除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。
, o2 c% V3 f6 W$ m) O+ \) q' }
  [  }5 S( u' [& i# ~8 K

7 A2 A5 N" G3 h+ n: @& f! O7 W, C
; q9 j! v# e/ R& ?7 q/ K

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件
# f# ~+ u$ j8 e' S3 c& n( C
  • EmEditor
  • Beyond compare( z1 y3 X. E6 r$ d0 F/ L9 d

) H: |) k3 f, H( w+ `& X& ^; z3 P2 {  e" O! v( ?, N
前者用于编辑,后者用于差分比较
' V! L- x$ P. ]  O1 O! |" h# Q% K处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

发表于 2016-6-8 07:41:03 | 显示全部楼层
bt4baidu 发表于 2014-10-25 21:012 s7 r$ ?" B! l8 E! |& G  V
现有的mdx词典,其实足够绝大多数人用一辈子的了
& T' q( ]$ d6 e: k: `7 X- ?) L- W. B+ C7 e7 M' s
本人前段时间制作、收集了不少,经过一段时间的比较 ...

$ {) R0 _: g, P! t8 ~* g  }肺腑之言。

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考& i( v$ J- J. w6 E9 |
' ]3 ~7 N1 @: B# A7 \7 c+ C' |# ]
网页设计中最常用的字体有哪些?(中文和英文)
* i8 F3 U* a+ A. _( X: Khttp://www.zhihu.com/question/19680724
# J2 J! F5 e" u* G* b
4 K$ Y; W$ J& B/ E0 y; r) z本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode! @  Q2 p; i6 z/ R
这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全& c9 C% v) q2 Q" \- u' h- e0 C
另外Open Sans字体也挺漂亮
! E) V& S6 [2 X
  • 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:219 z% d+ Q# b8 _3 d/ N
    最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...
    * X+ I4 E% O3 X& }5 z6 M9 B1 O
    感觉找到适合自己的问题好少啊$ i4 h6 V3 a( [! r# {, m* W8 X9 u
    这个适合的话感觉是兴趣和难度0 c8 Y& p% `2 D2 h3 A
    想请教一下楼主是怎么处理这些问题的呢, I( g$ ~! X, _4 i4 h+ j
    还有种不系统的感觉
  • 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 编辑
    ; i, _- Z8 i" n; E
    ( e" U% E% g6 }1 v1 x写得很好。刚看前几行的时候,的确激动了一下子。虽然没怎么懂,但是第一次能坚持把这样的东西看完,觉得也是对自我的一次超越。谢谢!

    该用户从未签到

    发表于 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 编辑
    ! ]6 D- ]7 |6 U" u+ ^: R7 W/ N* n+ G4 C! m
    java和.net就是个垃圾,我懒得提而已/ w+ v/ A% Y) w& }% t
    在Linus这样的大神眼里,连C++都是垃圾:! o( g3 @/ o# z/ D8 h% q; R
    http://www.csdn.net/article/a/2010-06-12/218785% B  C, S+ v( _2 q

    ) B- j1 A( G, p8 M$ v如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。
    # m' F" j3 y3 a/ U: X2 u
      h; [' L5 k7 J- x5 X; G不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。  I& u9 O9 M1 e' l, z& g8 t7 Z
    我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。
    : c6 y( N5 L8 k6 b8 C, d1 T这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。
    ' I$ k) `; D- |) O不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。( ~7 h+ T/ W8 t% ?8 m
    为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?
    # z" z. Y% L1 k9 q* ]因为垃圾代码太多了。# }% I0 U8 A% f4 L1 q/ M) q

    * t" q+ L1 z' M7 ~* |+ p
    % e, H8 O8 z3 o* u2 \; C

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑
    ' |) S- q3 h8 p+ A$ k) ~/ g- ^! d; ~

    ) q; Y. `3 S+ r/ c1 u算了,道不同不相为交流
    7 }2 \5 |' a' m想起某个梗, D3 i5 i1 r3 K
    程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!) p* V7 y; E$ T# X# u
    & W' @/ i/ U# Y1 M& J  e( _. h
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。
    ( @7 n% i7 ?5 l. R$ G; ^. l7 h' A* R8 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
    , O: u5 ^2 }# y% c3 n5 W; R算了,道不同不相为交流
    $ Q/ h3 M: p+ O: U: Q( a想起某个梗; Q6 M- h3 I" [, |+ E
    程序员眼中的编程语言

    . q6 S) ^0 [8 h! Z# f6 s不同的语言适用于不同的人群:
    ; v& N, ]7 Y& k. ]1 ~6 Z如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。: z# x6 m& C' W+ s
    如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。
    9 w, |& [3 V( Z5 m至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。( e2 ]' s. B% p3 G
    / M9 i" i/ ?0 e) |* e) s
    编程语言的口水仗永远也打不完,不争了
    ) Q& I: H. E5 `' d5 c

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:35. B( a: ?6 C" t; U' Q; E; m0 R
    不赞成多线程抓网站,但是好贴子要支持!+ S" f4 w6 @2 G% u. t

    * X# K9 P) N9 Z+ O自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...

    8 U# u& c8 _/ z2 C下载软件?推荐一款?
    $ _$ E1 V- W6 @% n最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    6 H/ y  Y) K0 }; S: ?' q现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?- \( [" ?7 I" G" Q& @% v2 J
    比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。, x1 Q# V6 S2 N
    除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。
    0 S* t: w" g' q, h: J% x目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。
    , ?  _% J% B) N9 N" m% u* b* F
    + n  o9 @) m' \8 K8 a+ F至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。
      `8 v/ ~4 A+ t7 B* |: A' \9 B对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,
    : y; s* {3 c1 F* f( |) M目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。
    0 ?$ ]/ X4 G! ?% V

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:
    5 O* u& f: p+ v  Q  y9 |随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。
    + {. ~2 }+ g: j- |' X, x4 ]未来会出现一个新的行业:私人计算机管家。
    # q) x" Y" g) w8 n: J专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。7 W6 g* z7 {9 r* J* Q* \
    但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:29+ `- Z3 _; X: m( O
    下载软件?推荐一款?) w# c/ p9 e4 ?4 U, O9 H! ^
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;( P3 l4 F" U/ Q  S- I6 w: ~* o
    现在99.999% ...

    : [' {, o7 l0 P. P* d用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。1 h+ H1 Z+ J+ d1 E; s" ~3 s

    2 c9 O, p& i# X十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。9 R5 r! N6 M  V& \
    6 z. |, \# n" h! ]7 D8 j
    用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。; N5 d% M1 A1 f( ]" \
    : x3 n. k+ P* h7 f* O5 q7 a" \
    我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
    大熊部落 发表于 2014-10-21 16:184 e/ b! L) O9 x/ ]6 ^; h( [& T' a
    用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...
    ) C% H' C5 e3 i/ u) Z7 w
    我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件* _, `# d7 R, n: x' h

    $ M/ P' s' R7 M! Q! x4 y
    下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
    ; |3 Y( V$ u3 g
    推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

    该用户从未签到

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

    # T: p; G6 h5 |6 Y1 e4 S# C2 F3 ?- o! Z) i. a, O; K
    最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差9 f3 m7 s/ ~; B1 B
    计算机是用会的,不是学会的;
    # u- B$ P  d8 Y/ D9 g3 C* G程序是调试出来的,不是写出来的% e7 e2 d" a" a7 N' C1 h  X
    / {' V1 j2 h3 J
    既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。' C2 U' K! [& m) X
    你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

    该用户从未签到

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

    1 w5 s$ L/ ~1 f. }. b1 w多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。
      S! ?. F# ^! p, Q
    8 Z, j5 h5 l7 X6 `4 V$ J1 \' v我的一点网络小技术是很久以前在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, 2025-6-16 16:41 , Processed in 0.032020 second(s), 27 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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