掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 50855|回复: 148

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

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑 2 q/ ?1 b! y0 j2 l6 G$ a; R; A# d

2 r$ ?; f! I* K: j0 f这篇文章主要是给计算机小白和初学者扫盲。5 g3 m/ n- @) |7 W2 ]( `
本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。/ {1 c% f0 ~1 f! `  ^  x6 \8 M
只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。! t( |! n) O. H3 O+ m3 G  `
+ G' n" n! E) g$ C
一、计算机的两个终极哲学问题( D5 a3 s8 U# ~; S9 z+ X
1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。
1 T% {) ?- s" k$ [, z图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:
7 j  j* }$ n3 Y, W( S! y设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;
, |2 I. |- E( O4 |+ }" ~机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。
+ _$ P* p+ w( D! T; A6 b9 S方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。, o9 Z: {4 K' W- Z& z/ y
“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。) U  D3 i2 s7 L1 _! V9 Q8 Z

9 O4 r6 F; L, R# N那么要写出程序,立即就会发现不得不解决两个问题:
7 z8 B) ?$ Q3 }" |9 x" C) t1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址$ A) h( Z$ `% a2 c; E$ Z, s/ V3 Y4 x
2、怎么把两种方格区分开?也就是特征识别% _5 v3 {/ p: _2 o+ A  F$ x" V
这两个问题,就是计算机的终极哲学问题。  K0 }( E$ C  @$ H0 Z
理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。
. \  f, {' m/ |. x) Q4 s0 Q下面的讲解也会以这两个问题为核心展开。
, v7 z& g; {5 l$ u, Y2 o/ A" z+ A4 X/ e, i  F$ v* l) }
BTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,
. d2 W4 R  S8 }% L2 h5 f7 ]6 d——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。+ w% @/ N; w# E; W
所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。6 s; {  A, d0 g
前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,
6 y0 [6 r" X: K! [3 h7 {4 u. f而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。4 p( O6 Q& F/ B. W, T
具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。  C) `6 s, o2 c- Q
+ P5 C( J2 k0 T3 i- i5 @
不要觉得自己上学时学的不是这个,or文科生,就不行。
/ a* j! z# `0 ^, [. u江民杀毒软件大家想必都听说过。* O* x# [6 ]  n& |6 i* x
创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。" B$ s. J- w% u2 D* r
咱不奢望成为专家,写写程序总还是可以的吧?. E) ?6 v+ G8 y& [5 N( }; Z

- U% F3 I: w+ k6 ]二、采用何种编程语言  a, O9 c& o; M% b! O
上面已经说过,存放、读取、组织、区分数据是编程的核心问题。
2 X$ a% p3 E* X* T显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。
+ @9 q+ c& [+ p& ?" R$ y抓网站,恐怕没有哪种语言比Python更方便。
* F+ y7 e; P1 D$ J3 W. \: U当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,
7 w9 n$ Z! T7 G) j3 z计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,
# u& E! M- m1 Z8 A' F$ X5 \" l9 g! m没有慧根就别吃这碗饭。
4 X6 k& B: w: ]* c0 b! `6 H4 U; t2 ]. u
三、网站抓取技术
" C9 z& T: m% @1 s$ y1、下载某一个网页,提取其内容
, K$ `) l: i8 d8 E- c& X以前写过一篇,就不重复了。参考:" E3 V. Z: P& V( [9 ?5 s3 S
用一个简单的例子讲讲怎样从网站上扒数据
4 j* S( u5 ]2 {) u* Z
  E) |; T8 V  z! O* Z  R7 k8 X$ @! M: o% k2、寻址问题! p# ]5 K2 P1 n; ~4 N7 q" J
下载网页,自然首先要知道网址,也就是东西放在哪儿。" N' j/ I6 q& [; J, \$ T; {. @
如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。0 v# b" H! j" {: d. e0 F- p
但是大部分在线词典,到底收了多少单词,事先是完全不知道的,: o4 L2 i+ a$ P- I/ R5 o0 r
要把单词弄全,就要想办法得到每个单词的网址。& W) {4 f* G) M- V
总结各主流词典网站,大概可以分为这么几类:
9 n6 L9 _: P0 @2 r: d% aI. 事先有单词总表* s: t, k3 N% x
比如http://www.vocabulary.com就是这种类型。( b/ y  F9 @& k" q- t
它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。3 n; `! R9 {* C9 A
# a  Z: I6 S5 u% w' t
II. 网站有索引页面; o5 \: N6 z! v! w* L9 a) I5 r: ~
如:
7 m6 M8 J3 b% `( mOALD(http://www.oxfordlearnersdictionaries.com/1 E* s; O. S( l. f0 e
它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/
8 V5 E* s; T. B. m& }, V3 ^LDOCE(http://global.longmandictionaries.com/" x* s4 @; x( ?% ^0 P# A
采用框架结构,左侧边栏就是索引页+ h/ Q) ]4 @* E( ?) n
MWC(http://www.merriam-webster.com/ D9 F( s' E+ ~' A" |9 u
索引页在 http://www.merriam-webster.com/browse/dictionary/
2 n% F2 l5 b+ ~5 ~& E4 r等等$ n3 P! T& ?- ]* k- F* E5 k
这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。+ h7 s) P# M% g& \9 X' L

  1. + X* A! ^6 [, `9 ^5 u# A
  2. urls = []4 }" Z2 [7 D+ T8 m1 K) m+ B
  3. for someindex in indexs: # 循环所有索引页
    + r' K5 H. R  R3 p+ `8 r
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex]); Q2 ^$ v, \, u+ G1 T# X  j. C9 u
  5.     browsepage = getpage(browseurl) # 下载索引页面
    4 p+ v: d4 u' J  j& r! e
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域
    + e( T2 G, g. z7 f1 H; ~# U
  7.     bs = BeautifulSoup(browsepage, parse_only=target)% H+ i% e5 s  u
  8.     if bs:
    7 \  h* [! {  \. W& o
  9.         for a in bs.find_all('a'):3 ]* q1 R0 `! [0 t) P7 |
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接/ I# W) V6 K  B+ c+ x- s2 i
  11. 然后:
    % {  n, K( x% v
  12. for url in urls: # 循环所有单词  i& i0 j- w/ d6 N, }
  13.     wordpage = getpage(url) # 下载单词页面5 A( m3 Z, z2 [& x( c' c
复制代码
7 E1 ?$ }7 d" K1 S4 ?
) O7 ~/ Q/ L; m* D  U
III. 索引页和单词释义一体型网站
/ S1 F# _: x/ n如:Online Etymology(http://www.etymonline.com/# C1 g3 p7 m. }9 M, Y0 {
和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可' W4 Y$ h* z9 K

  1. * ?8 L! k7 P! p& S
  2. for someindex in indexs: # 循环所有索引页
    0 X3 g( w+ L+ ?, |1 g3 n
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    6 Z9 [& A7 C3 b5 F7 g' _8 R
  4.     page = getpage(browseurl) # 下载页面
    , b* m, B6 ~# \' [! G6 g  o
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域' P7 [9 ?( _; |+ H2 Z' d; p5 T
  6.     bs = BeautifulSoup(page, parse_only=target)% b* {' K" Q" M" t: `8 [6 ~8 H7 e
  7.     for tag in bs.find_all(target): # 循环抠出单词
    ; d  w, r7 B. O3 _9 x
  8.         worddefine = getworddefine(tag)
    3 j- `" U$ X" d: w0 u6 z+ [
复制代码
( r! Z2 Y. e3 K0 a
$ x( U! h+ S4 z  y3 N$ g) Z2 x: V
IV. 片断索引型网站7 W/ o/ ~% ?' ~# \- v
如:
3 y- O* E8 E8 P  p7 t4 NODE(http://www.oxforddictionaries.com/5 P( a1 E5 b) N5 v3 Z+ F
每查一个单词,右侧边栏有个Nearby words( i, p' P# O6 ^9 u9 T  _6 _
RHD(http://dictionary.reference.com/
% F, s8 o. ~7 Z) h* i右侧边栏有Nearby words3 v) y& ^  s" v5 |  H2 N9 q
CALD(http://dictionary.cambridge.org/8 D: I, h% ]1 T4 t- g. M
在页面的最下面有个Browse栏,给出前后相邻的单词
) B9 O1 {# h; V$ e' B! a- _7 M这类网站没有总索引,只好利用它的Nearby栏。6 p$ P" c& ]" Z, Z5 S1 W. l
思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,
' z. \. o  y6 K- d( N7 E' h每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)$ u3 `0 j! R8 V+ W& X

  1. . b3 V! d/ D; `: N% V
  2. cur = 'a'
    $ d0 z  h  k* F) I
  3. end = 'z'
    $ h3 v8 d- Y# @% P" E; M
  4. nexturl = ''.join(['http://somewebsite.com/', cur])" |4 V# {9 {8 i5 K
  5. while cur!=end and nexturl:, j6 y4 x0 U1 B0 w) p) c. v0 g
  6.     page = getpage(nexturl) # 下载单词页面; N2 x/ K. ^/ o# n: U
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接  i2 I! Z4 C; p4 B+ {
复制代码

; D7 H! U, }. ?4 V
. ^6 B) j" M2 B0 a5 Y& [V. 完全没有任何索引,那就没法子了
: J3 T* t* y+ V9 G1 n9 a  I当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理5 R9 B! i5 E3 m4 K
理论上也是可以的,就是效率差一点;
- O/ a, `5 Q0 B( h# [$ n, g: o9 r另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。
( f/ }  v4 `$ \+ z/ F
9 }& V4 F; l& ^! N3、提高下载效率; b, L6 N) g  M8 ^' N: F7 l+ p/ I' |
I. 多进程. O8 J* r1 y& N' H& l
上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。
7 ?# Y* _, g; ^实际抓网站时,这么做效率显然是非常低的。) j+ p; {6 P& J% r7 `" ?3 ?6 L. W% j
假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,
- R! u. L4 a' _$ v' ^有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。
- F  \4 A: J# ]  q; T假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?" {, E; f) g$ D7 _" s- p
要速战速决,就得开多进程。
" C2 n/ d- J% Q3 B+ L8 V同样十万个单词,分成25个进程下,也就是28/25=1个多小时。# |9 ^, U" T$ n3 [& r' M
再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。( s. o8 }! X$ v1 Y# f8 p
在Python里开多进程,同样十分简单,8 f1 H8 M, n# a$ ~

  1. ) ^: |7 }. F- o* E/ x5 d" @7 x
  2. from multiprocessing import Pool
    . ^. f- w, S" Z# w
  3. pool = Pool(25) # 开25个进程
    " A# z# a* J2 s9 \  P/ M2 R; U  D' T
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数# z( M* m3 E1 e! e% c. C
复制代码

3 \! U+ p& c. t8 }) P6 _这就搞定了。
& X' ^9 f1 z3 T3 P  [5 p' O' \& O& u" V, @0 O$ D% D4 C# x: C
对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,
5 r( f" p% S9 i& j* t2 f6 O关于IV.,事先没有单词总表,就只好采用区间的概念,
! O+ i5 l' y: x3 ^! {比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载
: J' y( X6 C" [; Y
: ~% c* U. z* I; }) C  T初学编程的人,一碰到进程、线程,常常有种畏惧感,2 C# n0 D( F- H; M) M$ G3 z
看到同步锁、共享内存、信号量什么的顿时觉得头大。" t" b, v) [& E$ r; |
其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,' |' q; a* `: u3 ?" p* l
其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。0 k( W$ D! a% S1 m0 I- @$ p$ m
! `% |2 J, S; i
II. 断点续传
- f! A9 {7 `& s& K/ }# q! Q* F事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。% f9 I" g' y$ H+ v6 ?) I( R
所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;
+ i- n/ v% _; i5 B2 P& X即便无法自行恢复,也得容易手工处理,不然可有的烦了。
* e( h$ E, \4 f3 B! f( d这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,  D4 s  q# R% h/ `; _- {
直到所有区块下完。- z9 J3 G7 m# t3 E

  1. ) J* X5 Q/ N/ E, i( l$ C# b
  2. def fetch_a_word(part, word, url, data): # 下载一个单词
    0 P0 |0 [5 e% s$ x8 }
  3.     word_define, failed = get_a_word_from_website(word, url)$ K% C  y, E7 ?
  4.     if failed:2 ]' W8 m5 }2 l" a5 z3 z& s- @% J
  5.         dump_failed_word(part) # 输出下载失败的单词及网址
    2 [' p  b0 s1 j1 f, l  F
  6.         return False& _3 U1 H4 X, {& d
  7.     else:" p8 S8 a7 n- m. E/ u' _: G7 t
  8.         data.append(word_define) # 保存下载成功的单词数据
      P5 W! b. p( k' m
  9.         return True: D* D( l. F1 a
  10. * L/ ~5 X" o  ?/ W
  11. def download(part): # 下载一个区块4 L2 Z7 D) A1 P9 @9 k! P$ k: M
  12.     words = getwordlist(part) # 读取单词总表  Y$ I" N1 `( y4 O$ d
  13.     if hasfailed(part):
    " d1 z) g5 [  A" }2 `
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址
    ( a3 `# R( f1 L2 i. m2 H0 ~6 x
  15.     else:# u) Y$ p# H% ^1 X: F! e6 Q
  16.         word, url = words[0] # 首次从头下载
    % g: Q2 l. x+ g6 @4 V) I  `
  17.     data = [] # 用来存放单词定义
      `3 S2 @) l+ b$ X  b! ?3 w
  18.     while not_end(words): # 循环下载
    ) B7 |  O7 E, c
  19.         if not fetch_a_word(part, word, url, data):4 `6 b; C+ A' K! e2 K1 S
  20.             failed = True
    1 S8 h  h; d5 C/ `9 X
  21.             break5 m& M  x# h( c3 }3 l9 L
  22.         else:
    / `5 x0 m3 x- }: ^2 Z8 k
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址% n* |9 X1 ~8 _$ L
  24.     if failed:
    ! Y9 M4 k5 ^& d. x# o0 {8 G9 M
  25.         suffix = '.part'
    % n4 u4 y/ g% O' ]0 ]
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'
    1 {$ h3 z( X4 q5 R7 @' c, @- `

  27. 2 ]2 L; G$ e) o6 F, K; N' N8 J
  28. def isfinished(part) : # 判断某区块是否下载完成, H6 o0 ?* R+ R+ j+ h! B7 V
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断/ x7 Q2 n9 |' q% J' M
  30.         return True
    8 y3 j3 ~, K% s5 q" X" {
  31.     else:
    $ H3 J( ?0 G2 O. X0 m, @( V* f
  32.         return False
    1 A$ v: H7 w: q' e" ^  l

  33. " b% e( e4 z2 K, p7 y; h
  34. def downloadloop(): # 循环检测未下完的区块
    4 Y. G5 v" y' k+ f# ]- H
  35.     finished = 0. {! e' W2 K0 c
  36.     while not finished:
    6 G5 C$ P3 P1 p& `! r/ A/ G  v
  37.         nf = [] # 没下完的区块
    . y/ A9 y, [- u# r* Z
  38.         for part in parts:
    - ?) P% a5 g, v5 M8 @+ Q8 U
  39.             if not isfinished(part):
    8 U4 F, q7 M; a7 _5 s
  40.                 nf.append(part)$ q% K2 {0 k5 b  c# t
  41.         finished = not nf
    3 a7 g; q3 v$ @6 u  b; P# ^
  42.         for part in nf:
    8 q9 S. b1 a7 i: s# A6 I1 q5 \  ]
  43.             download(part), y; L6 b% R0 v6 _: d
复制代码

/ [2 A" M! `3 o% Y4 M( h& y  w# a1 J) {, w& K7 |) o) Y6 x( ?' Q: E
III. 高速下载网页的小技巧
  |& \3 a9 f3 F$ @" C# [Python里面有三个库都可以用来下载网页:urllib2、urllib3和requests。
: _' S/ Y! b- _其中urllib2是Python原生的,urllib3和requests为第三方库。: _& y% K1 D* @5 W
(似乎Python3已经把urllib3收编为正规军了)2 j5 _$ t- B7 }  [$ ?  {. }) p
这三个库有什么区别呢?
+ }+ q2 k2 g: v, F* |& O' f9 O形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。
7 W1 C- |: W, z6 F再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,, Y5 F7 G/ h3 G5 C: f9 I
所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。
% i" ^4 x$ q( W但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。) D9 b7 l# i' V' D  ~% U: p
这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,- ^' [: b0 v& z0 l* C
通吃一切网站。
! K# c, R2 O; _- W  Y1 s所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。" ]6 c8 T* `7 |+ G. P
这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:
) z1 l6 t( ?3 n# Y7 S2 Uhttp://urllib3.readthedocs.org/en/latest/
8 H) h  x# f( c7 U8 H! B3 [http://docs.python-requests.org/en/latest/
% X; T' Z* V/ c& v: K: [- \

  1. 1 ]: v$ W- H4 @7 k
  2. #urllib2& n3 A& g9 T! J
  3. import urllib2; v$ D+ A6 y/ m$ N& K
  4. def getpage(url):0 |' O7 U8 d9 x1 y7 q4 M
  5.     req = urllib2.Request(url)
    / ~1 p; H, Y$ b, |+ }
  6.     response = urllib2.urlopen(req)( A: O; Z& }# ]% ~$ n
  7.     page = response.read()
    7 m8 [1 t/ r% j7 U1 _5 K9 W
  8. - {/ s4 {! E  M9 [7 S
  9. #urllib3: W) o" C1 o2 W: B
  10. from urllib3 import PoolManager; Z+ G( J, e5 R( O9 ^% W
  11. http = PoolManager()
    ( N& I5 n% J( [$ ]2 j9 y
  12. def getpage(http, url):
    1 A4 M, N5 m% }6 `
  13.     r = http.request('GET', url)
    2 b# @6 x, {& ?
  14.     if r.status == 200:* z4 }0 |) N* J; p9 y  M" X2 ?' a
  15.         return r.data3 I( V8 M( L2 F, C/ M* [2 \9 m% ^
  16.     else:
    , J. i1 j4 p* X( g3 M
  17.         return None2 F+ {' m. l5 A- s3 B: g% [
  18. 2 N# v) s# E$ n+ ^9 g- [. {
  19. #requests
    , q- V  b9 y1 \! J* F! ?# y* W% y
  20. import requests) E0 x  ]- _' m( n8 Q* [" C
  21. session = requests.Session()
    2 B8 @, O9 c. v* M( U7 n
  22. def getpage(session, url):) O  o" V: `) E# d4 I
  23.     r = session.get(url, timeout=10)
    9 r( ~- h* m2 y9 t" q! n
  24.     if r.status == 200:
    / Y  S* d3 i3 t% B/ v
  25.         return r.content0 ~8 [6 n4 t3 x4 \0 ~" i6 q5 x( D
  26.     else:! w% e; o: v# \- |8 N
  27.         return None# L  `1 F7 \1 g6 A) ]
复制代码

8 W7 n2 F. c8 W+ j四、后期制作" }# |, p# ]" Z2 p
1、文本处理,是个特征识别问题。- R8 L% [9 \3 t1 {: ~
本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。
4 v; C+ J/ }5 v$ \0 K0 W: S当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)  ?3 a8 u8 [+ b% }7 n
都涉及到特征识别问题。
8 y8 Y3 s* C- Q2 l& F相比这些高难度动作,文本处理算是比较简单、基础。
% G1 q/ {+ H, w& |6 o# `  i3 ePython里常用的文本处理技术:正则表达式、BeatifulSoup、lxml
# }5 _- I! _( ?1 O: v! G1 O正则表达式非常强大,但没法处理递归嵌套的标签型数据6 {) N5 |7 l- c* z! ~1 Q9 M' K
(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);% L; P3 b3 ], k- L
BeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。
+ z9 o+ x' F$ I( D: I1 t1 D所以常常要结合使用。5 B3 ^; m/ ^9 \' k8 c2 I
这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。
( M0 G# x9 s5 a" x' d  ^! n+ q2 r- _; m' t2 n  e0 N( ], g
2、排版2 q& v- q  U6 l9 Q
HTML、CSS的基础知识:
$ _* \4 c2 t/ z1 ^http://www.w3school.com.cn/html/index.asp! c/ X. w# q: w( z/ N6 |1 i
http://www.w3school.com.cn/css/index.asp" U6 d" ?3 d5 b2 n6 b
http://www.w3school.com.cn/css3/index.asp
; ]7 s1 q6 t; {5 j非常系统、非常全面。( `; P) d6 U: ]$ g( M7 r4 H
排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。
7 F0 X7 e' p% F5 q: s/ x# Z5 q) C# L  C& u$ L# w
五、结语) W5 ]" O5 n: ~6 x$ G( `9 t1 @" x- ~7 F
花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。. i& S  T: D$ J& O6 R
所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——6 y2 |6 ~$ _# l( D4 l0 Z
大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。( E+ c) K& X+ v$ I. O
6 P# ]- @7 u+ y6 ]# g
打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。. q0 D) j3 {1 l2 Q; v4 n" p6 z
1 g6 l7 K$ j6 \. a- k
只是拜托不要打扰别人,真想要就自己动手。8 B% h4 w1 I: D; s% `1 M7 j
尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。
5 ~) @  s) x7 p水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。+ H& ?, K- {) }2 [* }
虽然每个人都觉得自己至高无上,应当受到别人重视,
) v! A" R1 M+ z! S& i0 X其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰
$ X" I" J% p- Z3 ^
6 M+ F% e3 b7 S$ o. u
" V) R' Z" Y6 x2 k; z========+ _2 a* m$ ^' @
六、拾遗
6 ~. h: R2 z# |# |- O7 ]  t关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类" i5 O8 H/ v  D* w
确实如此' U" b4 u( w9 |; `  ~1 [9 Z8 x( N! ]
不过这里只是举例而已,不用太较真啦 ( t( w! _( V. ?' L' M- Q) Y' P
实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏
) }6 _+ ~4 W! l0 I$ \) ^( @+ E这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。
7 a; E& a1 x  v' d) Y. B即,
0 S" ~5 {- ]4 v) G9 X第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)
/ G( M: V4 ]  X第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)
: p" h6 C1 `; R5 R! h3 J% C2 q第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作
; j  b" v& ~6 P。。。1 Y( G4 |6 d* v& V
直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空)
8 B7 J( N* ~7 v最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。) ?$ V. K, |. i. Y6 W6 W( O' B
形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。4 b- N+ I& T: _1 A% C- }
因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。
' n6 N) L5 [5 @. [0 Q

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:41
, O/ n. F9 @- J0 m1 B7 ?感谢楼主分享知识和经验。
; c0 X/ A" m8 ~* d! ^5 d4 ^7 z+ j
  `* |( H; Z/ T1 Y2 C2 F2 {' P每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...

  _+ Q  _5 M5 l" {" M3 l5 h现有的mdx词典,其实足够绝大多数人用一辈子的了
! w7 p) L- `/ _  K$ {
" [0 I  ]( E, X* z3 A0 n, x本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。, M4 r# d, {' N5 i5 ^% G
0 l% R3 S" L- O4 j; m# ^  Z' ]  {
本人最常用的词典:
& Q! `7 o: \& ~3 ]+ A( B/ X3 n主力阵容:VOC、ODE、WBD。
7 m* @! H% N6 v: l7 P5 P. w三本都是中型词典,收词量均在14w上下,以本人目前的阅读面来看,还未遇到这三本里面查不到的单词、未收录的义项。据说史上掌握单词量最大的人是政治家兼散文家丘吉尔,也没超过14w。除非钻故纸堆,恐怕用到W3、SOED的机会不多。: U7 M  l9 @( V  x

( ?- v. K1 e! s; @( y替补阵容:LDOCE、词源、短语8in1、韦小黄&韦小绿、Garner Usage。* r: A: G1 l% s! C# p
LDOCE用来查常用词的惯用法/搭配、语法信息;
; M. {, n4 l; C/ W! n/ Q  i9 z; L) }词源用来辅助理解、记忆单词;
* k( f9 W2 t* }! Q& X" j1 ?短语8in1用来查漏网的惯用搭配、非正规用法;% h7 l, ?. U( K0 y7 l
韦小黄/Garner Usage用来辨析/比较同义反义、正误用法;
3 b1 b6 m% t. M- c$ z: r韦小绿用来辅助理解、记忆大词。小绿真是本好词典,有人说里面收的单词都是一辈子才能见一次的那种,其实不然。它虽然只收了1400多词,却几乎都是高频的大词。从本人的使用体验看,查得率相当高。比如最近看新闻说一种超大蜘蛛,里面有个词arachnid。别的词典只是干巴巴地说4对脚的生物之类的,只有韦小绿说了它的来源:从前有个女孩叫Arachne,编织技艺了得,把雅典娜女神给比下去了,结果激怒了女神,被她变成蜘蛛,终身织网。这种解释多有意思,看了永远忘不了。2 c( j& G( M  a6 `0 a( \

! Z. Q# H0 a2 K上述词典,坛子里都有,无非是版本新一点旧一点。比如朗文5和朗文6,有人统计95%以上的内容都是一样的。如果是完美性格,非要用最新版,那就只有自己动手。不会有人在词典出版的第一年就去挑战版权方的。
) y- j$ u! q% F“对于好学生,任何教育资源都应该是免费的”。虽然本人同意这种说法,也认为现行的版权制度存在重大问题——有人靠垄断知识获利,却完全合法;但是本人从未打算挑衅版权方,更未想过做Aaron Swartz那样的斗士。靠垄断知识获利是有点无耻,但如果没有利润,也就不会有人去做整理资料的事,这确实是个难题。
, V( x* R2 G4 u- N0 H8 c9 i1 q5 g, Z
还有些人没事喜欢收藏词典,收集了一大堆,却从来不用。说到词典收藏癖,想起以前的一位室友,那家伙每天最大的兴趣就是下载影片刻光盘,大概刻了几百张,还在不停地刻。但是从没见他看过,他也不让别人看。: K4 p# D0 f7 }# C# n" e: Q
这种癖好大概是来自于原始社会的一种遗传,人们总觉得应该储备点东西,说不定未来某一天就会用到。其实那一天说不定永远也不会到来,不如就把今天当作那一天好了。有多少人买了一书柜的书,到死的那一天都没看完,甚至有些书连封皮都没揭开过。0 y2 D1 N( q0 c

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。
% y3 l8 `' {% d其实只是你没有发现而已。
/ z/ m1 x& j2 e  K  B. ]) G( Y- v  BODE: http://www.oxforddictionaries.com/browse/english/
5 H2 ~! d$ t! `- i9 ^2 E1 u6 pRHD:http://dictionary.reference.com/list/a/
* K# x1 P7 K3 U* z- d) e( K% }CALD:http://dictionary.cambridge.org/browse/learner-english/
" G: y; F  ~8 B, ]8 j. D9 j7 v: J! L& y% G$ {
如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。' T& s3 M; d1 a3 n5 E: @
以第二个为例:
& x# D  ^# G1 Winurl:browse | inurl:list site:dictionary.reference.com" |( k( [& }+ f7 v; p. ]+ K5 @9 G

2 q- y6 f; _9 z# @  D. t6 _PS:最近才发现这里,发现资料很多啊。
' F+ s5 x5 p) J8 Q& F7 u

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧
4 n; @7 n1 o! B6 U2 {
5 T2 a7 F5 ~. |+ @* e假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改' }: h$ c5 a+ i' _' U9 b, C
或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下/ T& L1 Y  H5 b' e/ a4 g* O
结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。( \. g% p9 Z4 O% Z* A7 v# G! x* ]
这里有个比较省时省力的小技巧,可以快速定位到想找的地方0 v2 E+ E" V8 w* u. {
2 l! L! ~5 G3 k8 W
1、Goldendict里,在想修改的地方点右键,有个“审查元素”:8 j) @) k0 d% r3 H' F& _9 b

- M1 m3 L- a4 ]$ X  U! G% z" @, ~# ~7 r, i3 q/ L
2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事6 K/ o$ I+ y1 o0 n

; n7 u4 Z$ g% M6 k, @" w! M' F& Y- }1 t: }+ P+ ^+ ~& t) T$ W; h
3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方' G0 ?$ x9 ?8 b0 C; h

, F7 T# R  o2 P' q! F" r  c
0 q! N3 @' {9 C. d2 M+ y& n收工

该用户从未签到

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

4 l( [# d1 j; x9 |) c# {! l6 _" ]$ \8 A) {
$ r5 k* t/ |4 z

) V  d/ y  P+ H' B( h4 b) F. a感谢楼主分享知识和经验。
3 w% @# s( L6 W  [0 z: i, S7 w' a  ?8 e2 t& @2 Y: n- Q" a2 ?- ~
每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。
8 u. r1 W; Z' K/ Z  y; A8 J& D! _8 e* v
私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。, L* e3 H1 F- K" c8 i
. a/ N1 ~. _9 h' m
但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。
4 L0 U6 H# I) t/ X* u
: M& \; R; t$ O7 W' G1 R. R除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。" G; j) {, k/ j
! _/ H1 `% l$ t. G1 A) \! g5 C& v, |

0 ?2 I5 b# J4 t+ T, S& [% `
' |0 C6 m  |2 a* }+ _
3 q6 W; [! L; |3 E% ^% L) U

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件
( L' \" t( y$ J" s% o# \
  • EmEditor
  • Beyond compare
    ( c- _6 d' k$ M% D/ X

) I! Q6 Z1 K! S4 q5 c, |7 P9 j( I, n  s; V  E( F/ _1 R, P
前者用于编辑,后者用于差分比较  |9 d; ]! k# S! b7 z5 u0 \
处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

发表于 2016-6-8 07:41:03 | 显示全部楼层
bt4baidu 发表于 2014-10-25 21:01
" u  M% s, G8 M; ?( ?现有的mdx词典,其实足够绝大多数人用一辈子的了0 m# R" S3 N3 n! i4 `1 i
6 [% S( q6 S: n( S& Y
本人前段时间制作、收集了不少,经过一段时间的比较 ...
$ v. X  ]1 e9 a: \' ~6 t
肺腑之言。

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考! U8 |* W, u- v% I! c

* {5 b' X4 {. S  F. I. B! b7 u( T网页设计中最常用的字体有哪些?(中文和英文)9 v5 k) M1 T7 I9 V9 V+ c4 h
http://www.zhihu.com/question/196807240 z& X" ], R% q/ ^

# i# e$ s7 M6 e3 m" b3 B7 s本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode2 J9 N2 c% Y( g  t5 M& K
这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全1 D! E9 d- o% |& V
另外Open Sans字体也挺漂亮
  X, x# e# q& A, e) j" D
  • 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) q+ n5 {# @) s- H& M: X
    最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...
    . K; U$ s$ h" s/ p+ `
    感觉找到适合自己的问题好少啊( z, Y+ I; x: f- [4 r# r7 O
    这个适合的话感觉是兴趣和难度
    % n7 }' \. Z: u+ O: @3 [4 M& J- }想请教一下楼主是怎么处理这些问题的呢; n4 I# @' ~" x- b7 O4 T: Y, t
    还有种不系统的感觉
  • 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 编辑
    1 q) v# v0 v  [' Y8 v1 c7 o6 h4 s( X# 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 编辑 5 i% r$ r/ ]8 M! a

    4 H+ U# \% F4 L- P+ yjava和.net就是个垃圾,我懒得提而已
    & V5 ~8 _7 n5 v. {2 P在Linus这样的大神眼里,连C++都是垃圾:
    9 h% ~" i1 r6 M) d5 Q- ?% Ghttp://www.csdn.net/article/a/2010-06-12/218785$ i( S7 x3 }0 g( y3 T  z; r
    * f) s& O7 T1 L* l# A) q
    如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。6 ~7 Y* ]# a9 [* b( A$ Y  I4 v/ ~
    7 _$ p. n- w1 f* W( S3 d) G" T. X1 C
    不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。! |/ {; C6 x/ }) i) ^
    我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。
    2 i- p9 M# O) x这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。  V+ I7 Z% _: X$ {9 v9 _# r/ T4 k
    不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。; a$ c8 q- ?$ d2 e# E
    为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?! g3 |5 U5 B( k
    因为垃圾代码太多了。
    - u/ H: ~" }) {/ F& ^' W' W9 I% {3 `1 g: X( Q' N

    5 N; N% t) o  s' x6 c) S$ ]

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑 7 l* R# V. Q1 Z" @$ C0 V

    . b- h2 T* Q+ r( F$ F9 Q" m0 D
      g  m, I, z4 a% g+ Y* s* [算了,道不同不相为交流
    # \9 A4 x. B. K6 b想起某个梗" h- y# u" ^, X& p2 \
    程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!
    4 t$ G' \9 U; S: M+ J3 [7 D+ L9 l) c8 W
    9 P: Q3 J$ n! v( N' S5 J. {自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。; a. G: w* a! n7 b- T2 _" ^# U
    9 O1 U2 v# V6 [" E
    另外win95时代才是32M内存,win98的时候至少有128M,我一台老主机还是win98,文本检索速度秒杀XP。

    点评

    1999年7月我买电脑“金长城”6999,PIII450处理器,64M内存,SiS显卡,跑win98。2002年攒机可以配1G内存。光阴似箭。  发表于 2016-5-11 05:02

    该用户从未签到

     楼主| 发表于 2014-10-21 11:28:36 | 显示全部楼层
    meigen 发表于 2014-10-21 00:07
    1 `. Q6 ?7 s- c算了,道不同不相为交流
    & m/ G9 b5 @+ H# C0 a2 p& w9 a0 u想起某个梗1 m, h- E& Z; F" U
    程序员眼中的编程语言
    % P1 O- Z7 O9 \/ ?8 e1 N: p7 t( p
    不同的语言适用于不同的人群:; V2 ?$ }4 [& h3 q9 {
    如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。" _! P, E7 t) y" _
    如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。
    : k$ u* s# W2 N至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。
    ; L; E/ f7 W! ]" W" k- F! d2 J! ]/ J7 {# ^! l
    编程语言的口水仗永远也打不完,不争了
    ( ^/ a4 e' B3 ?. f6 ]. T

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:35- `& ~/ \( v' `( ^
    不赞成多线程抓网站,但是好贴子要支持!
    : N% h& |) y3 C0 N: _' q% H, [4 w
    6 x2 `. a7 E' v  A自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...
    - B+ h! Y6 k/ Z3 f+ Q
    下载软件?推荐一款?6 W1 e3 p5 D3 |5 ?& l# y
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;) O, Z9 d$ W/ O4 o8 S5 z7 l
    现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?- W6 \0 z3 S9 S$ R& n" W& Z6 H
    比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。# c9 ?. ?5 l" c8 c
    除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。! F1 P3 e: W. H. |6 W
    目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。
    $ u/ q$ p0 y2 I
    3 }7 o' Y+ F3 `! i& d3 d. b至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。
    ; J/ M. a  _; D对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,2 e3 a$ m) c5 z' R. d) g
    目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。; J+ s4 P; ?9 J! o  o( n# Y9 }

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:
    + H& I% m3 w# B& m随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。' G% r8 {; @' f: t# T% ^4 i
    未来会出现一个新的行业:私人计算机管家。
    + S( ^) }  L- S  r3 x8 \- H1 F专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。
    ' G; V% U8 e# z6 E但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:295 v2 z' n8 ?( H/ _/ b6 S
    下载软件?推荐一款?( K  `* _1 v0 w6 Z* Z$ R
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    2 A& v1 H' p- F3 m6 _! R现在99.999% ...

    ( R* k4 e; ~+ Z- e! C% c  }$ {用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。9 i6 D. E  Y. x% k9 F% @

    1 F$ z$ l3 }4 v, F十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。
    2 O! Q$ v* G$ |! U9 q' _; b3 h
    1 K9 |6 j) v3 p* F' \, H用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。
    # W5 \" D. G. w4 @0 \0 `1 s/ L: Q
    我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
    大熊部落 发表于 2014-10-21 16:187 ]5 l5 B2 h5 V; K/ c
    用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...

    4 D, k7 s! r* H! }3 u: X* h) \我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件$ p2 i' }" A1 c4 a" W: p* f

    1 O# ]" _) E9 m3 n( Z# @+ X# C
    下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
    1 |5 ?7 z* l$ N
    推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

    该用户从未签到

     楼主| 发表于 2014-10-22 20:21:14 | 显示全部楼层
    平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。
    ! p/ O! I- w- C7 e% d* w. K4 H7 f0 i

    0 D6 A5 z" |* G0 S最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差
    8 F# c/ z1 s, h4 u8 i' k/ k计算机是用会的,不是学会的;
      I8 p6 S. V3 `' @+ s$ T. `程序是调试出来的,不是写出来的0 F- ^# Z% }9 L% Y8 O

    ; L, _* q: O) Y( l既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。, V4 g2 {5 o' p1 i4 E' F# D
    你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

    该用户从未签到

    发表于 2014-10-22 21:25:59 | 显示全部楼层
    bt4baidu 发表于 2014-10-22 20:21
    " g$ o; _5 k5 C# i! d' p- q% P最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...
    ( `  V  g' o% ]4 M2 O" }
    多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。
    6 z& A& r+ k$ R2 B8 J6 z6 P6 P1 W; U0 e, W
    我的一点网络小技术是很久以前在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-23 13:29 , Processed in 0.096332 second(s), 12 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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