掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 56331|回复: 148

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

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑 $ U7 D; l- f! e, H% P

+ ?8 I0 U9 J8 H$ c$ ?6 b这篇文章主要是给计算机小白和初学者扫盲。% }0 r# A' q8 j
本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。3 d- A; F% C; @4 |" I! C
只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。
' t$ t( I* I1 R& e# F/ r+ n/ p7 c! M5 d3 M( H
一、计算机的两个终极哲学问题
. ^, `% S$ p7 T. R9 [: g) a1 [1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。% x7 `$ A2 u* D, O; U) l. h; d
图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:
3 Q6 H/ s/ o3 {' E3 ]+ ?设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;1 `5 K$ n/ g. u3 F. k) D
机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。
# F/ r$ _! A: M9 I; k, r方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。
# ]$ F" O; W7 Z% S“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。2 V- q: j8 a/ q
# e& @4 t$ `8 w  h/ |: j" t7 `( L2 a8 r
那么要写出程序,立即就会发现不得不解决两个问题:
' @* q$ ~& c) K6 }6 r1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址
, W  w2 A6 ^! p2、怎么把两种方格区分开?也就是特征识别" f: Z! w; f& W% i9 S
这两个问题,就是计算机的终极哲学问题。# @# i0 z# ?* k9 G* P  }
理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。$ B; m8 v4 h) U4 S, ?7 a. T" W! D( s
下面的讲解也会以这两个问题为核心展开。
8 R2 \4 A% T/ ?" X; z2 ^
4 |: v1 \: ^1 z* U8 sBTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,$ L5 T0 B, v$ m& c" p0 C
——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。
  \$ L$ f$ f( o所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。4 T: Q8 Q% P; m9 d1 t0 Z
前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,( ?1 v, D+ r, M+ M: Q
而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。
* l* k5 c  @" ^$ }6 {( J具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。2 z1 E3 V$ b4 ^* \3 q% C# l0 o* ~

/ m2 T: ~$ J6 N: M, `$ i5 i/ I不要觉得自己上学时学的不是这个,or文科生,就不行。5 Y' l$ X4 T) S( Q- u
江民杀毒软件大家想必都听说过。. ]: K; v- M9 h. e& u
创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。
$ @- b- P8 D4 q4 ]  x: I2 H咱不奢望成为专家,写写程序总还是可以的吧?; V" V, b. W7 q5 ]2 x, I

" Z$ ~) p- ]: }+ B5 \二、采用何种编程语言
7 @7 e3 l' V# g+ C* [上面已经说过,存放、读取、组织、区分数据是编程的核心问题。! A5 k; _3 d5 ^% y
显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。( ^/ @; y6 h2 T9 R+ @( e
抓网站,恐怕没有哪种语言比Python更方便。+ u' W$ v$ _6 {2 J/ X
当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,, T$ M4 R. i; L
计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,
. P) I0 m1 U3 B$ }* O  |没有慧根就别吃这碗饭。3 n( \0 B' q9 K- n
5 ]1 ]3 q* {' J7 @
三、网站抓取技术
/ F" M' s* Y: H$ g$ w: z1、下载某一个网页,提取其内容
  c' u. l# u  I) c以前写过一篇,就不重复了。参考:
, {' R7 K3 d( ~" o' z用一个简单的例子讲讲怎样从网站上扒数据
, g, O! S) [" U1 W/ e. O6 G
1 r$ ]; b: n- {1 s2、寻址问题
) f6 |3 ?# j- {* I+ @! J, }3 q下载网页,自然首先要知道网址,也就是东西放在哪儿。
5 `3 y4 D8 {2 f; _5 m6 }' g6 F如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。
+ M$ G0 k' ^+ l6 I& s- Q但是大部分在线词典,到底收了多少单词,事先是完全不知道的,. O- A; Z# q3 P: z3 k
要把单词弄全,就要想办法得到每个单词的网址。
; m/ K& ?3 x4 t6 |8 N总结各主流词典网站,大概可以分为这么几类:% c. N1 z: \2 }" E8 c  h: x
I. 事先有单词总表3 _6 g$ W. g) B0 n: q6 M. y: ~
比如http://www.vocabulary.com就是这种类型。
: g+ L  X/ R* c: O. T$ a! |它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。
4 ]% ^$ C9 @1 u5 J! ?
: J+ u& Q- ]- e# r- m+ KII. 网站有索引页面* g8 z" E9 m6 \& ^" d2 `
如:+ z# P! q) T: \$ z5 M# ?7 J# o
OALD(http://www.oxfordlearnersdictionaries.com// i* ~. e" R/ J5 l& N4 h
它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/
4 O- g& l4 ]: c7 XLDOCE(http://global.longmandictionaries.com/
5 _% Q5 b: P& s: u& \' j1 v采用框架结构,左侧边栏就是索引页
, v9 e) c9 ~. b- m( T) JMWC(http://www.merriam-webster.com, c/ ^* d8 }+ R. P$ ]
索引页在 http://www.merriam-webster.com/browse/dictionary/
4 p( O' p$ i2 {: S& R7 s等等/ c8 N4 F2 n- o. o' V& _
这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。# G5 x/ Y3 S$ z/ U+ E- N
  1. 0 W3 y  B" Z* R( c9 a8 s7 n2 C1 Z# U
  2. urls = []
    : d* H! s4 d7 T. q7 x) c
  3. for someindex in indexs: # 循环所有索引页
    3 I+ v1 |' g( |% B/ M% D
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex])7 p5 e# q( ?; `2 Y* J  h! ^
  5.     browsepage = getpage(browseurl) # 下载索引页面
    * \5 v$ s0 f4 d5 g
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域
    8 T. p8 b8 u$ o% ~' f
  7.     bs = BeautifulSoup(browsepage, parse_only=target)4 Y" ~3 a: E+ i
  8.     if bs:6 h! i8 l2 ^: R
  9.         for a in bs.find_all('a'):
      F- u" N/ z+ {0 I
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接
    0 |8 Q2 c3 W. J. K, ~8 i- {& ^0 F
  11. 然后:0 a* }0 v5 P0 w5 k7 X
  12. for url in urls: # 循环所有单词/ B/ C$ {4 B: c& {
  13.     wordpage = getpage(url) # 下载单词页面
    . f7 V2 L" L; l, O
复制代码

( j9 Y+ F+ Z6 z8 s* U& z
* ?2 M! a8 N$ h* s5 s; EIII. 索引页和单词释义一体型网站
- w1 y  z8 P6 E1 T% n如:Online Etymology(http://www.etymonline.com/
- A$ \1 E, x3 f: _1 O和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可
# o8 ~7 }! p* e) s. {0 q  w
  1. 5 o5 a3 ^& m( d: M
  2. for someindex in indexs: # 循环所有索引页! B* G2 k4 v8 ^# V
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex]). q$ l; g4 z5 `- |0 ?
  4.     page = getpage(browseurl) # 下载页面
    9 C3 S: h* u& Y: ^/ D# }, l
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域
    2 U' W+ p8 h; V: C" K, M
  6.     bs = BeautifulSoup(page, parse_only=target)
    1 R) A) G9 L- G$ H4 `, O$ c
  7.     for tag in bs.find_all(target): # 循环抠出单词
    # U7 J) i; Y$ T2 l
  8.         worddefine = getworddefine(tag)5 @' p/ b5 ]3 H$ T/ j/ d
复制代码
$ t0 o& k9 G" \) q- z

; Y1 Y1 J7 x& p1 K' I( AIV. 片断索引型网站/ ~. s1 ^4 l% R5 A
如:! O2 y+ H  m5 t& `6 R' q
ODE(http://www.oxforddictionaries.com/+ v$ M2 g$ w$ _2 l" t. H
每查一个单词,右侧边栏有个Nearby words
9 J5 @6 E* m* c( g5 Y; wRHD(http://dictionary.reference.com/
$ N* T# l  ~5 l3 Z+ m右侧边栏有Nearby words
1 w/ S6 e" M! C! n5 L. LCALD(http://dictionary.cambridge.org/; Y1 e4 v5 a5 \5 u  y
在页面的最下面有个Browse栏,给出前后相邻的单词
* ?& m, Z6 [, H# G' R1 p这类网站没有总索引,只好利用它的Nearby栏。
" v0 b  C7 U: g# P: R& H思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,0 J4 I* |$ T$ f) \0 E8 N
每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)
% r7 h- C/ ~( i& E) e, B! f; H4 K
  1. 5 M4 o' x2 @9 L4 i
  2. cur = 'a'
    , W. t( ]7 v0 S! w6 h* C  U
  3. end = 'z'0 }. ^, `4 S* J) j8 C  _" M$ H' ]
  4. nexturl = ''.join(['http://somewebsite.com/', cur])
    8 x& Q) i9 T5 u* i
  5. while cur!=end and nexturl:  F- r, v/ z* i0 l0 I5 {
  6.     page = getpage(nexturl) # 下载单词页面
    6 V( f* \9 p* w  M2 l# Q. |7 N
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接8 F% m! x# ?: O" h4 D
复制代码

# Q2 m% s7 h$ e3 D; k: J! d4 S7 f  u1 E5 X. u* L
V. 完全没有任何索引,那就没法子了
, B! L* T% o5 b当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理
  ^$ z1 v% a$ s; X. J8 }  Y/ `' ?理论上也是可以的,就是效率差一点;
9 O7 D9 {) F0 p- m" E  }7 l另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。
! X7 r) w) [) \" d% i9 V' L7 |' n5 x' A
3、提高下载效率
  ~: V9 ?! F* P) ?! vI. 多进程) F$ h: N7 I. Y' Z2 A
上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。
  B' Z; W1 `; `5 K1 m实际抓网站时,这么做效率显然是非常低的。3 d6 x5 P( g8 }# a- I( v4 l% s
假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,+ `# |0 G  m* a5 X$ x5 j
有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。
4 G  E8 t' |. S% A! f7 i' g假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?  B7 x, _3 Y/ J
要速战速决,就得开多进程。
9 a5 p2 Z) r* }  D# Q同样十万个单词,分成25个进程下,也就是28/25=1个多小时。
  h  z1 J$ N, l6 W3 j) ?, ~( s再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。$ r% h" W8 [$ m+ U* w
在Python里开多进程,同样十分简单,
6 r( D1 M0 S5 \
  1. : V9 A8 v2 `* p  l9 p! ?2 |
  2. from multiprocessing import Pool, j1 O2 Z) z  k, o; _1 n
  3. pool = Pool(25) # 开25个进程
    . \2 [) p0 Z- L7 y* d/ o
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数
    # w( _' Q4 U& k* y; V! ?/ l
复制代码

) r/ _( Q* u5 ]) D0 N) |3 o这就搞定了。
* H) S1 V( |) S; Q0 j. E
2 C  V: h  @0 |4 N; |6 r- M. Z对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,9 B6 I# X+ E& N! b! o& c
关于IV.,事先没有单词总表,就只好采用区间的概念,
4 H# l& C$ [3 T: _- {# ?0 n" w比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载
4 w$ G( k$ Q; F
# P; N, p  K3 N初学编程的人,一碰到进程、线程,常常有种畏惧感,0 B: n# a( n9 k: s$ C
看到同步锁、共享内存、信号量什么的顿时觉得头大。
: E. |  b" B& s; n1 S其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,: w8 q& i6 E6 q4 D) j8 ~
其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。
2 |4 K( W, o# x' M
# l6 u; S6 t- Q' m; c) m4 v7 cII. 断点续传
) f# F, J9 S& ^' E事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。& m- I: I/ w4 c  v. _
所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;
: }1 a4 t$ j3 z& y& G即便无法自行恢复,也得容易手工处理,不然可有的烦了。
! Y. w, P& m0 v) X! `这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,* R: L; y$ m" n' ^) g5 ]
直到所有区块下完。; X6 q: y5 Z) L8 ?) W
  1. 2 D: T- C. H: y9 C
  2. def fetch_a_word(part, word, url, data): # 下载一个单词
    3 I2 \1 h4 N( r" T  J7 \7 R- U% {
  3.     word_define, failed = get_a_word_from_website(word, url)' K/ [9 v! l: G, e4 A9 F% k
  4.     if failed:8 j# T  R2 X/ x1 [$ d
  5.         dump_failed_word(part) # 输出下载失败的单词及网址% @1 o3 k8 ~$ Y- H# U1 Y1 |
  6.         return False% T! p9 U2 X" L- D# b
  7.     else:
    8 }: u/ u- |: I1 l, v. @
  8.         data.append(word_define) # 保存下载成功的单词数据+ b8 [$ O4 Z4 ?2 }, C8 {' V
  9.         return True3 A9 n4 {6 E# S( {
  10. 4 F' ?1 n: D; ~' y  B
  11. def download(part): # 下载一个区块
    $ i+ a& ^9 h: Z5 s6 `6 m5 ^
  12.     words = getwordlist(part) # 读取单词总表$ E* @6 R$ q; D- F0 J3 `  s
  13.     if hasfailed(part):
    4 V8 H( n+ v! G9 V4 D* T9 C
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址
    - S% ]! M$ a$ D# \. b
  15.     else:
    : q, s* }, d2 Y# r5 h/ o
  16.         word, url = words[0] # 首次从头下载. Y, t2 P* q0 p% z" X) \# z9 W
  17.     data = [] # 用来存放单词定义
    5 m* L: b8 ?9 r
  18.     while not_end(words): # 循环下载% j9 r" M/ v% e- l, V3 ?% x. B' f
  19.         if not fetch_a_word(part, word, url, data):
    ; S5 f% W6 D& i# f6 m: D
  20.             failed = True. Q6 I2 [# J+ f1 B2 M
  21.             break7 X* N8 K: K" a5 p# N8 v6 L: S
  22.         else:& A4 T# }- k7 n: z$ x0 e
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址
    0 |1 l" |6 z& u+ _( H
  24.     if failed:
    4 z4 W8 h% y0 g+ U
  25.         suffix = '.part'
    9 |+ Y6 b! m. |& v8 F9 U2 f2 g2 Q
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'
    1 q" M6 E, K+ o7 m& [* p
  27. 6 h+ q) r* _: i) f: S/ O9 p. T6 u
  28. def isfinished(part) : # 判断某区块是否下载完成
    * J7 m6 @+ k1 L* ~# ~
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断6 @' J% O! U4 L5 x- ^( ~
  30.         return True
    ! K8 B3 i, h+ V+ R
  31.     else:
    8 [0 g7 q  @9 ?0 q( ^+ ]
  32.         return False$ _& E* M; Y& [
  33. * x- T* X. j- _" \/ Y# i5 Y* E
  34. def downloadloop(): # 循环检测未下完的区块, _" {9 k2 S+ P( S( {
  35.     finished = 0
    & ~' d8 H: S; ^& W' A3 x5 S( N
  36.     while not finished:- y7 J  o0 S* ]% U9 j
  37.         nf = [] # 没下完的区块
    8 i7 I6 p) T3 m+ T% L# l% W
  38.         for part in parts:
    ( @# T0 X3 L6 t6 i* C8 H
  39.             if not isfinished(part):( J% E  W0 t% W
  40.                 nf.append(part)
    ' l8 i* ~$ Y6 E: w7 L
  41.         finished = not nf
    9 A6 A; ~/ f. t9 O3 ^' E
  42.         for part in nf:, _" g% [  k; P  f# n4 J  f
  43.             download(part)
    % l  D: J9 ~5 s1 @' ^1 \
复制代码

! v7 N7 i9 w5 w( A$ K; z& i: L: E3 _9 S6 q3 e6 V
III. 高速下载网页的小技巧
; r) _  U1 R, e7 L1 C/ LPython里面有三个库都可以用来下载网页:urllib2、urllib3和requests。
( ?6 S# M7 K6 t+ c其中urllib2是Python原生的,urllib3和requests为第三方库。+ n) T$ z$ h8 ~, t% V+ P& d
(似乎Python3已经把urllib3收编为正规军了)  ]- |" q- I0 r/ s8 |& L# O6 d
这三个库有什么区别呢?& d9 b! B1 ^( `* Z$ @. P+ ?
形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。
( R+ a0 f0 v  {8 S0 A$ X* P再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,$ p% Y/ z, Q' L7 Y+ {7 l
所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。
& ]& N* g7 m# T8 i但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。
5 F: O6 {. C/ Y' [! h7 @' \这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,/ ]' y9 g) h9 L7 [8 [$ g2 C
通吃一切网站。
7 Z8 S- |) o$ b所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。+ h2 ^, h0 s& g. u3 g0 A
这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:
8 a- `6 e3 k+ A; Vhttp://urllib3.readthedocs.org/en/latest/$ v1 Q# y2 f$ V2 L: Y
http://docs.python-requests.org/en/latest/
6 S4 _- B) c2 t& H& ?8 g
  1.   b; Z& y* r! p' B/ f
  2. #urllib26 I( O+ K* R8 A+ [# j
  3. import urllib23 s6 a( L$ k2 i3 I% n$ Y
  4. def getpage(url):0 }- z/ s- {, h" _
  5.     req = urllib2.Request(url)
    0 X+ R% L: \' r! f
  6.     response = urllib2.urlopen(req)$ ?; q) \* g& B) g  b4 z
  7.     page = response.read()
    $ g# l& D+ Z# m4 s8 m$ j$ A
  8. % L5 ^, w) x% [! _$ t' ~, `% }6 ~
  9. #urllib3* @% I0 z$ M: y- L3 ]7 S+ K  ]. w0 Y
  10. from urllib3 import PoolManager6 `6 {3 P5 U' x/ ^0 I7 ~* U9 Z9 Y& I
  11. http = PoolManager()
    , K; M2 ?+ P) _
  12. def getpage(http, url):; d  c+ O* i! L# P" ?/ ~% V+ B
  13.     r = http.request('GET', url)
    0 ]: i# v* X$ p$ k, d# G) L
  14.     if r.status == 200:
    : P7 T% i( A7 x! d5 u
  15.         return r.data
      X  c2 I! i7 ~  t  d+ {" b
  16.     else:
    5 l2 S/ T  Q: N7 {
  17.         return None
    # O& D/ i& p2 E& ]$ ]1 x7 @
  18. . B- X5 b" Y/ F0 o4 N4 @% k/ P
  19. #requests
    # ^' g" J0 Y- W- L, e& C1 m4 x
  20. import requests$ F' I7 L# C, [- D; m$ ^
  21. session = requests.Session()
    " t$ f2 h0 k$ W8 _
  22. def getpage(session, url):
    0 r7 p/ l! O1 C% m2 f+ r6 k. g  v
  23.     r = session.get(url, timeout=10)3 \. ]; H: V, [- A
  24.     if r.status == 200:$ r) q) J7 y! H4 R4 x
  25.         return r.content
    ( L6 D9 }& ~' U. X# C* M7 p, G, b
  26.     else:
    % k1 H1 H/ O- i4 K. K) ^
  27.         return None
    9 `* K9 J9 t: F! \/ u/ I/ P
复制代码

9 x7 M1 J' L# o9 r7 S四、后期制作) v' T- p' r% d
1、文本处理,是个特征识别问题。0 ?  J, j# ?% o" ?$ X" `0 B
本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。
" ~/ z, q9 `- a# a) b; w! L/ V当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)
5 x! I0 ]- R- T1 [都涉及到特征识别问题。
3 \$ ^6 k. i" \2 x, s' L  H$ Z相比这些高难度动作,文本处理算是比较简单、基础。. q: ]& k6 W* S, h! ?
Python里常用的文本处理技术:正则表达式、BeatifulSoup、lxml
% B6 d0 q- t6 q1 T8 N: P5 H5 h0 q8 g正则表达式非常强大,但没法处理递归嵌套的标签型数据6 T# G2 d( n& z) U
(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);* j* a* W4 ?& @+ ^
BeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。
3 {: d3 R0 |. f9 u6 q所以常常要结合使用。
: S+ W$ |6 v' S" w: s这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。
2 E# P: Y) B9 o: a( t% f; @) z: r. f% Y4 X; b* V, x2 p% Y0 ?
2、排版
: K5 d9 s" g' K: ]4 s3 k& l, nHTML、CSS的基础知识:
/ ^6 I- U# p/ t) r2 }' I- [http://www.w3school.com.cn/html/index.asp
, w3 V, `1 c7 E) ~- q2 Bhttp://www.w3school.com.cn/css/index.asp
, V7 C# ]5 s! Ghttp://www.w3school.com.cn/css3/index.asp
$ v/ ^( b0 d; K) j8 V: J非常系统、非常全面。; M( O# j* f3 y# s: I
排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。
# k& W. ^' O) f; s! C7 B7 s* d7 L" l! j6 Q2 n
五、结语
; ^' |0 g2 P4 g# e' \, \- q花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。
& c& F" v8 K$ y' `; h" p0 n5 H所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——* s9 Z- _7 l7 H1 s: y1 i
大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。8 V5 A- A) }" k3 E/ e1 @, P, E
6 U$ N' t% `% @9 D# a
打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。
6 `3 F% P! Z0 ~$ H$ p7 W- w2 j
$ `/ J  `4 X. ~- ]" r只是拜托不要打扰别人,真想要就自己动手。
  e! F, L+ W  J7 _3 {尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。
! C" t0 _0 B0 t* n: I水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。: s3 X1 Z' j4 Q
虽然每个人都觉得自己至高无上,应当受到别人重视,1 W5 y1 Q- W  h. ]2 u  @9 e
其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰# m/ v6 }# P8 f4 [3 T: U
5 T6 O+ J. T: [/ G8 [3 T  W
* ^' E' o) |/ v
========6 y5 |9 c: ~+ Q
六、拾遗
) t/ p) Y: l1 y( s" ]关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类
+ p! ~- `! C) @+ c2 i5 o确实如此
: \" p7 r' E3 Z' Z8 S; p; v, E1 m不过这里只是举例而已,不用太较真啦
: `7 T/ i# d, f& v实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏
- k6 |  `1 d6 t/ m8 v7 Z) q这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。
7 b* y, z; Z! ~; a+ K4 o' \即,
' m9 y( l. C0 {7 `8 ]  `5 E$ N. v第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)  D; ?/ h& n& S9 a9 K0 `7 z
第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)
9 u% D9 U0 Y9 {4 r) @2 s7 j; E第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作: I6 Z; i3 t' L& W/ j( h
。。。
8 f1 g  ]; O$ p直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空)
* j  l1 c( ?0 A最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。
7 D+ h3 i( S! L0 E2 b- K6 R  j形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。+ s9 m. \5 q% d
因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。
) i" U% t6 o9 t

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:41
4 C$ h- J6 O1 O* k感谢楼主分享知识和经验。% b' k* P9 ]+ q* y7 G1 }
+ l1 z7 z& O* G9 F9 E5 F; d& X
每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...

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

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。$ e3 m  Q/ p. I+ C7 R
其实只是你没有发现而已。
* L2 {( p/ K9 R. [' s8 i6 xODE: http://www.oxforddictionaries.com/browse/english/
) M- o! ]- C& y$ T! nRHD:http://dictionary.reference.com/list/a/
( s, `; _8 V! O. K" f! j! a! UCALD:http://dictionary.cambridge.org/browse/learner-english/8 l6 y" a8 m: E& S; e+ i% S7 ]) l
3 {+ y3 m( [& C" C" w
如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。( V2 B, J% B0 z
以第二个为例:& X4 @( S0 Y6 d) {' A
inurl:browse | inurl:list site:dictionary.reference.com
) o5 L/ J: V, }% Z- O! h5 L
/ i& v% m9 q2 E& o" R+ D. IPS:最近才发现这里,发现资料很多啊。
- g$ V7 @% x- @, U* ?) R

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧2 {+ P, s$ _+ |: J4 Y5 d3 u. L! G. ^

7 x( H2 t4 V% D# p/ c假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改
: j. E1 }2 ~. H) X; Z9 |或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下
. D: \2 J0 G5 P9 a6 r1 c结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。
6 ]' c: F5 t- V8 F' _, m  W这里有个比较省时省力的小技巧,可以快速定位到想找的地方
: \( O$ I9 `6 V& {8 u
4 c& T4 d) l. G, H5 @1、Goldendict里,在想修改的地方点右键,有个“审查元素”:% r8 l0 }3 O& W* O( t: W5 ?; d$ z
9 v8 c- ?, C  L  h
, Y+ P( L9 w' A7 d
2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事
, @$ ]* ]' S% P5 N# n. d( Q6 v$ _0 A8 ^  G4 w3 A
" T# d: z; I# Y. K  l3 g$ t
3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方
: d3 o- @) Z9 {3 n
+ ^2 q$ ]9 e' r3 [, P- ^" P; s  ~  G2 K  s# a
收工

该用户从未签到

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

# y) p  b& A5 o& y* S5 M0 v$ x/ J+ ^+ ]
( V; `. }" f$ f0 o9 f! q) a
, d8 Y7 C6 I  G. F+ ]6 r
感谢楼主分享知识和经验。7 S/ f3 W0 l# U' E  \8 g

, v. e9 l5 p: M: a: S每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。
, Q! @! y+ T  F* C' X8 n. {, Q: x. c7 [- O! H4 K/ i+ Z$ O) i
私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。
' p/ `' G3 Q  R" c% R+ X3 w) @' b# A. v5 _0 @7 Z% ?  f
但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。. [8 X. {. @+ [

. n6 ]- t) R" Z8 p- F9 e除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。# S, |  [* `) p, C
" s5 ^8 x6 E) i+ e$ \6 \

" N4 ?5 T& M) v* h% X' V
5 Q8 @# h4 {/ o3 i: q
) v  K% W) @1 q+ ]! j5 ^2 s

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件4 Q  v4 v; N# z: |5 c) k1 Z9 M
  • EmEditor
  • Beyond compare
    8 `3 `* K- l& ^" u
2 W" a; q% j( x- e3 J

% c; M( |- X# W  O& V  E$ Q) ~前者用于编辑,后者用于差分比较
- O7 ?  w2 {7 |7 X* t' K6 C$ ]处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

发表于 2016-6-8 07:41:03 | 显示全部楼层
bt4baidu 发表于 2014-10-25 21:01
/ f) s6 ]. C7 d现有的mdx词典,其实足够绝大多数人用一辈子的了
: S1 m5 ^4 ~  x5 ]
6 w. B: x) z8 a- a! g本人前段时间制作、收集了不少,经过一段时间的比较 ...

& V3 b) d$ `/ m+ L1 i7 }6 ~肺腑之言。

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考1 b- d3 G/ ^- B% {' y3 G& i
& Q8 U& W) ]/ Y
网页设计中最常用的字体有哪些?(中文和英文)
& K6 h- L  t4 [5 I$ w8 {% {7 Uhttp://www.zhihu.com/question/19680724) C  N9 }, B; |' B# S, D% N
9 w7 U  Z! H- s
本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode& h- x- h* j- b# N% H, R' c
这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全/ M; H0 I! w% P! P0 a( S
另外Open Sans字体也挺漂亮# H' n% Y, F" Z9 U8 Z3 ~
  • 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
    . r5 y& a$ H& p7 N/ q  D最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...

    0 N4 U3 x( z8 [# E& D/ a$ d* F1 `感觉找到适合自己的问题好少啊( F3 B$ t  d* U9 \# w9 R
    这个适合的话感觉是兴趣和难度) h3 o# g( g6 s! p/ p2 I
    想请教一下楼主是怎么处理这些问题的呢; c% a* m0 M/ h' W& x* y& p
    还有种不系统的感觉
  • 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" G; t' w/ Q7 g9 g2 Q# g
    5 v* y: T) w- s+ a3 R& U写得很好。刚看前几行的时候,的确激动了一下子。虽然没怎么懂,但是第一次能坚持把这样的东西看完,觉得也是对自我的一次超越。谢谢!

    该用户从未签到

    发表于 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 编辑 , l. w$ d$ ]# Z9 d! x9 I& G0 L8 w/ Y3 V

      L1 `9 _1 T( `# l, L  p5 Vjava和.net就是个垃圾,我懒得提而已
    ' |& Q7 g  S* U/ e; A# a: B5 R% e在Linus这样的大神眼里,连C++都是垃圾:
    * C! e" L: `" ~4 \$ u  dhttp://www.csdn.net/article/a/2010-06-12/218785
    " d1 q4 p$ K0 }3 u$ }, y  l: q& ^) s. ?
    如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。* c2 h; |9 J9 v5 F' j$ N
    6 G& B8 _8 O, c0 x; K
    不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。
    + @0 q+ o0 d, h; }7 s/ l" w5 T$ _我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。7 ]- @* ^) }1 a6 d: P% T" v
    这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。, R0 _6 y7 F% {) _
    不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。; W3 ]; g9 p# H4 A* _7 [+ t
    为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?
    . A# R8 I" W$ O因为垃圾代码太多了。
    ( F( {! o$ t# d
    % d! b- l' D3 i  n  C4 I
    * ?3 }( {6 u' ~6 J

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑 ( a$ I" v9 y: v+ u4 f5 _0 B

    $ }, h' @5 t2 _8 H- U4 J; Z( C, B6 j) n& v7 Z. w
    算了,道不同不相为交流
    5 P; e* G! h" E! g想起某个梗
    6 y$ p3 N* E/ I5 V" l- ~: L程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!4 b7 Y% A4 g; z9 L3 B9 u

    , R' M4 w) L( n自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。
    & c8 k+ Q" J% F; d3 _1 Y& H
    " W; n: C8 t( h+ u& k另外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:075 j& ^1 @3 M! E% h5 h8 g5 J
    算了,道不同不相为交流8 ]0 ^# O  E3 J6 b3 t. N+ ?( H
    想起某个梗
    / i5 Y# v0 X7 Z6 c程序员眼中的编程语言
    . H4 ^- w* E% W* c2 M' K% d
    不同的语言适用于不同的人群:& H- {6 o" M0 P4 |$ p+ B( o, z# I
    如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。
    ! j/ S  R0 A3 v  \- L如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。6 d$ A( ?# I% x& t, A
    至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。" p) v0 j4 e( ?0 `
    9 t2 u; a* I  m+ |. {) m2 r
    编程语言的口水仗永远也打不完,不争了# P# Q( d- u3 Y) a* y9 \' x  O

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:35
    5 V0 n. |+ P" }4 n7 q不赞成多线程抓网站,但是好贴子要支持!
    8 r1 C( [9 N/ d: p1 S' s0 I: R9 G* v6 G) R# K  D( z& ?. x* b
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...

    / Q  k) P, u1 T$ L  o9 v: X下载软件?推荐一款?
    4 _% M8 g( ?7 r& Q# L5 B最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    7 b& A- B. t2 `! a6 a现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?
    ) d. x% Q$ H1 V% y8 l比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。
    & f2 Y$ ]; `: x0 P9 Y9 `除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。5 z( q/ v- \8 a- H0 c. v1 ], W
    目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。' e) m3 q: R( Y8 @9 b5 R! W8 q

    7 @+ i/ B4 n* |; J  ?至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。0 I0 e0 B, d, X4 d9 e
    对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,
    $ E* e! r+ |, E" l目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。5 K. F3 ]2 k* |3 W4 {; Y

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:
    ! {/ ?/ o: K" E* V1 G随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。, G7 m& m3 r& t& S8 K% M
    未来会出现一个新的行业:私人计算机管家。) B: @! B7 |( [: W8 w! Z$ q
    专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。
    9 L/ O2 Q) e: C5 x6 {+ E$ ~但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:29, f) q- u) G+ y  t; n! y
    下载软件?推荐一款?( z# A# L* f* |7 g7 b& e; s
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;2 p$ R- F, `/ K# i% L
    现在99.999% ...

      Y8 o% g% K1 R' p! f! Q用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。# y9 Z$ c$ G0 [" U, ~8 S7 x

    3 B5 \2 ^' ]0 M7 H# E- ]十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。, A8 V( k  A  D5 x  p' [1 f

    & u0 O2 A3 ^# e& T用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。" \- L% ^' I, M) G2 \0 d$ H8 y

    ! D- D- D3 |8 z( V" L我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
    大熊部落 发表于 2014-10-21 16:18
    4 T# }% p# l5 j+ K1 I7 O7 n5 e用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...
    2 q" M( s  e4 W9 Q! E; D0 r. w
    我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件
    3 M2 f) a- L( a( J% g3 v+ j, X: W7 `
    下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
    8 d- M2 L& }2 t' R% v
    推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

    该用户从未签到

     楼主| 发表于 2014-10-22 20:21:14 | 显示全部楼层
    平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。
    $ |" p" ]2 o* R: y- s8 M6 }. V: g

    ) z2 x0 u5 ^, i' ]" A6 J最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差
    2 _$ J/ Y8 ]+ p计算机是用会的,不是学会的;
    ; v1 G& h- M  `! d程序是调试出来的,不是写出来的
    8 S+ E. `4 J% v; {( N5 f' W
    6 d8 [. J  ?) ?# A既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。
    1 G+ `( R8 w8 N你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

    该用户从未签到

    发表于 2014-10-22 21:25:59 | 显示全部楼层
    bt4baidu 发表于 2014-10-22 20:21
    " t3 Z& M3 h; v! p6 O# S最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...
    ! B/ h2 E$ U. O5 {0 o
    多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。
    + I" N1 ?0 m4 w) c
    : C4 ?8 ^/ {9 S8 l我的一点网络小技术是很久以前在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-4-27 00:50 , Processed in 0.031702 second(s), 27 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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