掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 50813|回复: 148

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

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑 # H: a$ U3 }0 ~
' @2 b$ M" j! ]+ B6 n5 _
这篇文章主要是给计算机小白和初学者扫盲。
6 Z$ z/ A# Z0 Z6 Z) X& O本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。: P) v3 q! E" ?+ V" h8 m1 t
只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。4 z% C: p* q% ^+ g& \6 f" V; _/ u+ q
- @0 ^! M' j0 V
一、计算机的两个终极哲学问题7 Y+ L/ g8 D( Q) P  a
1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。3 \. r: x8 P$ M% ]& M1 a6 A
图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:
6 Q! J3 @- b1 ^+ r8 M: J设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;: W: M  J) m) J  Y) f2 R: l
机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。
% s7 \1 O$ i# j/ A2 {0 T方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。
% H  b; @% C3 V, U% I0 v“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。" P6 X. f* ?% Z

! L! g7 m: X; f" P0 E那么要写出程序,立即就会发现不得不解决两个问题:, h; s; j% Z" g  X5 Z! ?% I
1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址
. q6 {! n. h+ `1 y. O2、怎么把两种方格区分开?也就是特征识别
) v' H2 x. f( `/ U# u8 d这两个问题,就是计算机的终极哲学问题。
& J5 a& D5 R  V& ?9 R理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。# x% a$ I3 Z6 ^. o
下面的讲解也会以这两个问题为核心展开。
( D6 h% P1 n, a* |% |, M: U+ j
; q( m: L8 ]5 H4 B' hBTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,
4 u1 ?' p( V( @% J——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。; s9 V/ V* J& O6 k2 X# B8 t
所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。
; w  [5 l2 z. Y) `前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,4 O9 n4 d% ?' A: v6 g) O1 v
而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。, a6 P" ]: z! b
具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。
) J7 Q8 n2 _+ L' T" W4 M/ ]
: L' G% \- ]! n/ x" R不要觉得自己上学时学的不是这个,or文科生,就不行。
& g5 ]1 U7 Z- q江民杀毒软件大家想必都听说过。. V. |  e; `+ v. t
创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。
+ B9 g7 B$ L) U- E6 C& G咱不奢望成为专家,写写程序总还是可以的吧?* c9 Z; g: U* S: Z* T
# f! n) v. O2 B7 J7 U* _
二、采用何种编程语言! z- {1 F0 V& v6 I4 `4 t
上面已经说过,存放、读取、组织、区分数据是编程的核心问题。7 a8 V1 t# h$ d) }  d( y- v. @7 p
显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。
  ]1 q, D4 a( c! I抓网站,恐怕没有哪种语言比Python更方便。3 g3 X1 D8 j# f
当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,
2 X8 l& v9 S0 ^( C* |计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,' ]& @* J0 P) B* [9 }
没有慧根就别吃这碗饭。# Y" z9 s) D5 b0 c' ~. T, T

/ s' I3 }8 G9 R% c1 q9 q$ J7 x三、网站抓取技术( y7 D0 L+ E, _" }
1、下载某一个网页,提取其内容5 U$ u0 _: D' u2 H0 y
以前写过一篇,就不重复了。参考:
) r) h- H! @* R6 `- y0 \用一个简单的例子讲讲怎样从网站上扒数据6 ], f" s, r8 m9 C1 ^

5 W, m+ O5 F0 H1 p: N: J2、寻址问题$ H5 A2 Z3 o9 T/ h5 c; d8 i! h
下载网页,自然首先要知道网址,也就是东西放在哪儿。
7 N5 O% o  Q7 {9 u. x, z" z如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。
- b2 P) i! Z+ X5 n) Y7 ]但是大部分在线词典,到底收了多少单词,事先是完全不知道的,- J- S& O) Y& g0 X9 W$ e" G
要把单词弄全,就要想办法得到每个单词的网址。
8 d/ f/ z, j! A! i. G总结各主流词典网站,大概可以分为这么几类:6 o4 C+ \5 _+ r# _' }+ z( [
I. 事先有单词总表
/ ~- o) j, G% S1 D2 F比如http://www.vocabulary.com就是这种类型。
1 _# b- f  k7 h! M它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。
; V5 p: I9 v7 G  c" H) d& Q; u5 Y
5 Q+ M" z+ d' |& k- O* rII. 网站有索引页面
% g% x9 k% _& }# o4 n4 L- g! u如:6 S$ S8 N* C$ B$ L
OALD(http://www.oxfordlearnersdictionaries.com/
- S+ O2 O- i, w4 G: o* _  g2 k; L它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/
$ p" u1 B% z$ ^* [8 vLDOCE(http://global.longmandictionaries.com/1 l% k* V$ z, u# V: f1 z0 g  A5 ?" M
采用框架结构,左侧边栏就是索引页
% a. i$ k% N, j- |# NMWC(http://www.merriam-webster.com
; c$ j! m" P- D# V9 y$ x$ Z6 h  N索引页在 http://www.merriam-webster.com/browse/dictionary/
; ?: c8 B" Z9 v  p. K) u+ Z- `等等. {3 ]+ h- B# I' A* f1 k
这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。! j' T- w" W7 ~& f8 c

  1. ( g+ A4 A/ T1 j* Y8 |7 p, v
  2. urls = []9 X9 ]8 m8 ~: ]4 @; x3 e4 g% Z6 y
  3. for someindex in indexs: # 循环所有索引页
    2 t/ X2 \8 {* ^- D: }
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex])1 F% K5 C' l4 s) L6 U/ [% ^2 x
  5.     browsepage = getpage(browseurl) # 下载索引页面/ z1 G  ]& g# W. v9 Q) [0 c3 V, Q
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域$ C( N& j9 c- f# E% j
  7.     bs = BeautifulSoup(browsepage, parse_only=target); R/ }0 r. I% L
  8.     if bs:* o+ V, K( c9 E: O0 L2 U8 R
  9.         for a in bs.find_all('a'):% ^: V9 r& W7 d* o8 h, t8 Q% f, W
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接. Q( f+ ~5 k# a
  11. 然后:; i: B# c7 q* B# v- r+ q; H
  12. for url in urls: # 循环所有单词. e' g  G4 _) G& ?0 b: |
  13.     wordpage = getpage(url) # 下载单词页面
    : j7 ?" \  L0 R8 R7 _
复制代码
2 j5 l. k. t) m, _. C0 m

% V5 S2 E' w1 a) y: {III. 索引页和单词释义一体型网站
! v) ^  K( B  ^. G; B如:Online Etymology(http://www.etymonline.com/' b# D4 _9 x6 H6 g. C- T, x3 I
和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可& D  ~0 j( z( k* {# `

  1. # C2 @! S. |5 Y4 e$ x
  2. for someindex in indexs: # 循环所有索引页; O% Y6 J" s, C( C, G) L+ H2 M) X
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    - A( C. v! }5 G- E
  4.     page = getpage(browseurl) # 下载页面
    , I+ ?& l" G! [$ V
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域
    / @$ V( Y* K1 h" m3 E, w+ C
  6.     bs = BeautifulSoup(page, parse_only=target)
    ' N/ K3 \, i  Y: O( L3 v& T( G
  7.     for tag in bs.find_all(target): # 循环抠出单词
    8 {+ ~: W& J* K( N: u, L
  8.         worddefine = getworddefine(tag)% T! @; N1 i. O( m6 J1 |+ k
复制代码
" c+ {; Z! b* E5 _9 _  ~

% T6 N& B2 ^; h& X. q# u; iIV. 片断索引型网站
/ I# L6 n# L9 j: M, F# v. t如:+ j5 `& f- `) s& m7 Q1 ~7 v
ODE(http://www.oxforddictionaries.com/
" E& b: \9 @4 ]4 Y+ o# M( J! T4 C$ k每查一个单词,右侧边栏有个Nearby words
! H$ W3 F! m: g( P6 jRHD(http://dictionary.reference.com/9 `% Y" r$ }9 ]" J7 r) f9 `  @* X
右侧边栏有Nearby words2 _* ?9 q: M, I
CALD(http://dictionary.cambridge.org/, |7 z6 R3 D( m- T
在页面的最下面有个Browse栏,给出前后相邻的单词* \7 d8 H" F) ^3 q
这类网站没有总索引,只好利用它的Nearby栏。# t7 \0 _- C, P$ F+ [* g7 D  e1 D) f, K
思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,& O2 [% @: {2 j+ _
每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)
8 a0 h) [: l! v( ~
  1. ' V- ?0 R/ `, n: |% b+ t
  2. cur = 'a'; w% ~0 C: v4 r5 m1 a
  3. end = 'z'+ ]1 T# h9 b) D6 h9 j4 ^$ A
  4. nexturl = ''.join(['http://somewebsite.com/', cur])4 X9 @! h% e' T' m
  5. while cur!=end and nexturl:0 Y" k: r* u9 Y' Y5 ^. }
  6.     page = getpage(nexturl) # 下载单词页面0 t: A2 Y/ e" s3 i4 K
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接7 {: c. Q6 f& l( T2 D9 N4 A4 G4 L
复制代码
3 `3 v0 {- m$ G
) Y4 u/ C( K3 F% M
V. 完全没有任何索引,那就没法子了
  j% M( V4 U/ ?" p! R当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理
: A& S) X. N, B2 W/ v9 Q4 ?8 y' D理论上也是可以的,就是效率差一点;$ W% j: T* p* Q8 A: s
另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。6 R" m5 _# J- o: h% u2 E
" ]" \+ e0 h/ r9 k9 U7 v
3、提高下载效率9 J& b/ u. f# Y( F
I. 多进程
2 s! f9 C' @3 c9 U上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。
3 |+ S' m/ u8 _6 Z实际抓网站时,这么做效率显然是非常低的。
2 A7 w4 ~' d8 P; K8 M假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,
' q0 a$ n5 V- O1 k, Q- Q9 O有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。  U; r+ ~8 g  V* S  X7 {
假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?1 {; l2 j1 W1 q4 I6 v* u; O
要速战速决,就得开多进程。) a3 C$ f* m! {9 e: `9 o
同样十万个单词,分成25个进程下,也就是28/25=1个多小时。
: q, C0 `+ q$ g& e' D' c3 ]再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。
7 k* n' D+ }- H  B% E# O7 C: M在Python里开多进程,同样十分简单,5 [; |: [$ }3 ~% c* q
  1. 3 [1 e, x0 y& F5 K! {8 U
  2. from multiprocessing import Pool( `3 C* O0 n: K/ L0 J
  3. pool = Pool(25) # 开25个进程# Z+ M* A& O$ E; [9 K# \
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数
    ) p; F+ Q/ Q6 h" m0 A
复制代码

; Y0 ~5 m1 d6 O  r) ]这就搞定了。
" }; B4 B, D8 W
0 L7 T) c( g) o  l' d4 h4 I/ @对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,$ j- _2 Y; C5 f8 W! j& ]  {- y5 K
关于IV.,事先没有单词总表,就只好采用区间的概念,
& \& K; g4 F+ ~6 b' C比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载
- t4 q/ @/ c0 L- V( b$ X# g; j
8 f8 v" H! A" v! D4 H初学编程的人,一碰到进程、线程,常常有种畏惧感,
2 v1 ?$ z' }: ^: V% w! I% {2 I看到同步锁、共享内存、信号量什么的顿时觉得头大。) O$ F% m( M+ K& P7 c) G1 e
其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,
2 ~* [! U& C8 r3 ^& f  \2 ]其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。
" \+ m4 x+ S$ l/ u7 v6 G+ j2 z9 Z# g2 }- i+ Z8 I* ^
II. 断点续传' m* V2 I8 ?" V/ t7 \  {' E, i# [
事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。0 Z* e- Z* C* ^# B
所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;
( q5 d6 |. K6 }0 {' a6 Z即便无法自行恢复,也得容易手工处理,不然可有的烦了。
, _. h9 w/ y# n/ b  d! E& `这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,
- a4 }% M7 P7 x9 ^% E2 v, v& I0 g直到所有区块下完。5 ?4 i1 s$ p$ w- _

  1. 7 q5 y7 o& {2 H8 k! p3 _
  2. def fetch_a_word(part, word, url, data): # 下载一个单词5 p# ]% ~* x" G- k
  3.     word_define, failed = get_a_word_from_website(word, url)
    3 U! V# K9 Q0 d6 ?0 d
  4.     if failed:2 A% B4 @. Y* J4 x
  5.         dump_failed_word(part) # 输出下载失败的单词及网址
    3 O! b. p* s% i" p  l7 ?' @+ r& m
  6.         return False
    2 e: w  }' R( u1 @1 t7 C
  7.     else:
    / i5 H, C* y" \; X% w/ R* {* v
  8.         data.append(word_define) # 保存下载成功的单词数据: m4 ~+ U* d7 Y
  9.         return True" Z1 E7 B0 H# x2 {+ u  Z

  10. 7 y% E7 Y2 z# D! Z: u# n- o
  11. def download(part): # 下载一个区块# s& k1 ~3 N' }3 e. Y/ p0 N
  12.     words = getwordlist(part) # 读取单词总表9 e, ~0 {- d8 o% o" ~+ I
  13.     if hasfailed(part):
    3 }/ n6 j" z% ?7 e6 N
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址
    + Z2 E5 o' I) f, i! _6 ^1 L
  15.     else:
    8 W  i+ e/ r! v  H+ y5 N
  16.         word, url = words[0] # 首次从头下载8 }, B! \$ [- n
  17.     data = [] # 用来存放单词定义% m& |3 f# L5 P/ b* N; L! q
  18.     while not_end(words): # 循环下载
    ; O7 D7 j0 e5 {4 f( c
  19.         if not fetch_a_word(part, word, url, data):
    # {4 \4 R, d) e) [
  20.             failed = True
    & T+ G4 I0 x" A) T
  21.             break
    # s  f% t% f3 D# ~( M3 ^& d
  22.         else:
    ! C; o  r) G0 k3 [0 V
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址
    / {8 B: g8 ^1 L5 I
  24.     if failed:
    0 F8 a) A+ e6 g  v' @/ x
  25.         suffix = '.part'
    " s$ i, E4 ]2 _( c& ~
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'/ _1 m9 f1 A4 ~+ C% v) L

  27. 4 S8 I- ?' M8 Q7 H
  28. def isfinished(part) : # 判断某区块是否下载完成9 e+ b0 D' `. p7 V
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断  I5 t8 |& \& _2 k/ J
  30.         return True; |, }6 d3 S5 y& N8 N& o$ c
  31.     else:/ G/ u/ A6 D  K% z3 q+ B; [" L
  32.         return False
    4 h0 P) |: h6 ~. a4 E" h

  33. : n  D+ @) \- G* k" a5 L2 ^7 N
  34. def downloadloop(): # 循环检测未下完的区块4 U1 m; `2 o3 H! A& ~. \
  35.     finished = 0
      G/ e- N- K% \7 D
  36.     while not finished:. f* o- ~$ L) I2 f- H8 o
  37.         nf = [] # 没下完的区块% K; z7 _. e. w. p* _' N
  38.         for part in parts:
    ) j4 F1 N' U. y) o' r: ^4 S2 M% D
  39.             if not isfinished(part):) {  U8 ?, s! s2 p: d5 n
  40.                 nf.append(part)
    $ Q7 X. v3 v) l# ?7 [6 B6 \
  41.         finished = not nf' O7 U6 w' I0 }  D% I
  42.         for part in nf:+ z6 ^+ d& p# M, {4 y4 c  [/ }8 ]
  43.             download(part)$ g! y7 @- ~! q
复制代码
5 I7 C! R) T4 S% R& o+ O( H3 P) Y
6 ?( j; w! j: r0 T' |% M! H! N! N
III. 高速下载网页的小技巧
( N, h! v5 }: I: v. R$ K9 TPython里面有三个库都可以用来下载网页:urllib2、urllib3和requests。
0 y% V6 @# t9 O, H其中urllib2是Python原生的,urllib3和requests为第三方库。3 d5 W( j; T7 S$ U2 Z4 U! P
(似乎Python3已经把urllib3收编为正规军了)
! ^3 h; C& ^! K: E' |# f这三个库有什么区别呢?4 M) ?. B6 _+ F
形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。
8 M2 T7 P$ B. |, L' g再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,& y. |. ^/ V" K! z1 D" o! u
所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。' J  ~  B! w9 V0 ~" \1 _6 H
但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。
$ t# w% o" I% C& ]8 g& u' C6 |这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,3 O+ a) `8 W% y
通吃一切网站。
# ?& Q- s* `; g; M" k3 g所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。
. ]8 q( O& f, K9 g5 Q  G# Z7 r1 [' q这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:
% Y/ x/ N, X( j' L$ bhttp://urllib3.readthedocs.org/en/latest/! z6 ~  X* |, X5 V% R
http://docs.python-requests.org/en/latest/
2 z4 G3 P2 e# u
  1. , I7 k! c7 p8 z: U" G
  2. #urllib2
    8 t3 E! R' \2 N! V" u
  3. import urllib2
    ! W- f) I: h$ m- y
  4. def getpage(url):2 j9 n" j( F- v
  5.     req = urllib2.Request(url)* a" d9 ?/ O& m
  6.     response = urllib2.urlopen(req)
    ( }1 W+ K7 h6 @: Y0 g% B
  7.     page = response.read()
    4 [8 Y% x* N4 L/ X
  8. . {( Z& g2 w  k5 V5 i
  9. #urllib3, I. k0 R: k4 ]8 U9 |
  10. from urllib3 import PoolManager
    ( F1 j" b6 ~# |: m, ]
  11. http = PoolManager()
    6 T1 w9 T! a8 f1 ]$ W0 S4 w8 G
  12. def getpage(http, url):; Z, F: L. ]  Q8 S: c
  13.     r = http.request('GET', url): m8 |4 ~& g3 A9 m' c
  14.     if r.status == 200:
    " o+ T, A1 m" T
  15.         return r.data. z* a  W% a/ |8 f1 l8 V( e
  16.     else:1 \* z3 A0 K+ a: L; _
  17.         return None. g& H" q) b' S8 m: L3 E6 f9 E
  18. $ F8 g+ @- T4 N9 \1 A, P& }: Y5 h2 K
  19. #requests7 ^' j9 }% k+ C
  20. import requests9 b( [7 ~+ I& s' N4 }
  21. session = requests.Session(), T9 q" n2 v! w: k
  22. def getpage(session, url):
      h: l" D# E. J! H/ d
  23.     r = session.get(url, timeout=10)1 ?9 F* h. o, b+ I2 O- N
  24.     if r.status == 200:5 R8 m& \" O2 ~; n) w% m
  25.         return r.content& z: [# M% }4 }6 ]% Q, |
  26.     else:
    0 _9 R( |/ ]3 h: f7 N% g* ]
  27.         return None
    * A( }( s* I/ |3 J7 {8 m8 m, b
复制代码
9 D; ?+ e2 [4 z" F9 l& l3 o( O: [
四、后期制作4 e$ _9 u" U4 y* q/ l+ K
1、文本处理,是个特征识别问题。+ z1 a! _0 G5 O! U8 S$ o8 l
本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。( O4 |& N2 d+ [+ n( I! B* W1 _
当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)
5 x, V. h6 ~" _; e都涉及到特征识别问题。
8 \0 [, T: T9 ^8 ~. t& X% k相比这些高难度动作,文本处理算是比较简单、基础。
; X6 A/ U, v/ Y" I% Q1 |+ G2 uPython里常用的文本处理技术:正则表达式、BeatifulSoup、lxml
8 S" k1 f- E0 a8 v+ k. U: `& ]正则表达式非常强大,但没法处理递归嵌套的标签型数据
1 }7 ]' ?& {8 h' A. i9 D- o3 E+ u5 f(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);( }1 }! U0 _6 r2 n
BeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。3 r/ b7 E" q. w# @  [5 p( s
所以常常要结合使用。1 V& g3 E; G4 M: _  W" i
这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。, O2 p& [0 f% Q9 b% b+ E+ R; D% b& {

7 x  j/ n3 O9 Y$ }2、排版
6 X& [4 s# S) W8 P$ EHTML、CSS的基础知识:
' N7 m( X: }; q# I' K4 Xhttp://www.w3school.com.cn/html/index.asp
4 a  x3 E3 u3 v4 xhttp://www.w3school.com.cn/css/index.asp/ ?. d. d8 P" \* s) q0 |& `- ~
http://www.w3school.com.cn/css3/index.asp
+ O8 |# l. x, x# ]+ J$ D非常系统、非常全面。0 f/ V: j% j# F- d5 ~" z6 V
排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。
- b1 ^" O8 M. h1 \( Y/ i
  [6 f& E1 Z2 Q# N! _1 m9 {- j# E五、结语( E/ h& |# {( s/ e( T+ G8 M" g
花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。1 \/ W9 H3 ?( M  @/ H
所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——
# @7 Q, o% B( ^; P" y8 H& g大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。  h, a7 d* Y+ d" Z, s

9 }2 O$ H0 s' t4 j9 [打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。
: C# B. D) i3 d2 i; F9 Y% w1 i
' L7 B$ n4 m- O) T7 }6 W只是拜托不要打扰别人,真想要就自己动手。; R8 p+ a& i0 M  f4 j& T' U6 k
尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。$ m; e5 R0 K, V6 u0 Q
水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。0 H  V! i6 @4 M; s
虽然每个人都觉得自己至高无上,应当受到别人重视,! ^5 w! W! \9 P
其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰; n: B) P% v- N1 @4 v
3 c3 h0 A6 A$ L4 Q
+ V) v- z% O5 q/ s
========. L$ h  P% u6 P+ p
六、拾遗
+ w9 ^4 l. v5 ?: D  a关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类
0 p7 y5 N4 `1 P/ T确实如此
4 n* f- q/ S9 Q1 O, e$ i4 b不过这里只是举例而已,不用太较真啦
. ^8 H  F2 u! f' J* _. u# s6 f实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏: K6 N' l9 M6 p' Z2 \: j5 D
这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。# \( @5 `" B% \. n, H
即,4 h) S  w% a2 w6 u; K$ m
第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)' Z9 V6 n0 P3 a) l8 t& @5 z" \
第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)
) ?7 [' B8 @- @第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作
' x4 b9 G4 c8 f# U' j。。。
1 V1 ?- T/ b8 R; t2 j直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空)
: {2 {1 P/ V6 g5 N$ V3 M% s最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。
* k, G0 l. Q0 m7 V形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。+ W" C9 p+ d0 r& y; h
因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。
3 b5 C. a: ]3 t" b* s. z& m

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:41+ E1 z3 Y" m1 H* F3 o
感谢楼主分享知识和经验。
9 S. d4 I; n6 A5 V# n8 v
0 H  W* b$ c6 L每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...

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

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。
2 a1 x' Q) |, w1 ]: u) B2 S1 d7 `- ]其实只是你没有发现而已。
% X% o/ \8 m  H& `1 {  `4 j( J7 QODE: http://www.oxforddictionaries.com/browse/english/* }/ ~& J+ ?) m' }' l
RHD:http://dictionary.reference.com/list/a/3 [, K: w/ o' q- Q+ g9 ?
CALD:http://dictionary.cambridge.org/browse/learner-english/
. {+ q/ P, Y5 }: b' M; W; ^, g$ P1 ]' y' D, w
如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。3 c8 J1 i: R2 v
以第二个为例:9 O( A3 X* @5 P( Q
inurl:browse | inurl:list site:dictionary.reference.com
3 d. V1 U6 ~$ J- S$ q& A6 C3 n1 V- Y! f0 a) S
PS:最近才发现这里,发现资料很多啊。2 `7 P- a% M8 g3 |  r) {* z) j( e

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧2 V- X9 E0 ~- c$ W

0 k, T0 W8 \0 M' Y  j' n  I假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改
3 ~8 }* c: I! F4 Q或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下$ b% X0 ?5 H( h/ |5 A+ x$ H- v# Q
结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。
. g6 T3 j: ]- m6 F6 O这里有个比较省时省力的小技巧,可以快速定位到想找的地方, r( x- n4 R# @

* |  j5 b  Y: ~1 Z* T1、Goldendict里,在想修改的地方点右键,有个“审查元素”:
# P7 p+ I6 ^' r$ i1 L8 W& C3 N1 n/ i3 `

! q" {! ~  f' ?: O+ }2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事7 W$ `9 M" \8 f( H) H$ |

; T$ D& S4 F4 d) T
/ R2 T5 W9 a5 G+ A* @1 i3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方+ P4 j1 i1 ~. q
7 |: }4 o+ h$ g- [

2 v% o2 U; J$ w1 s, x收工

该用户从未签到

发表于 2014-10-24 18:41:00 | 显示全部楼层
( ~2 @) N/ ~; ~! r

+ U* Q0 X4 R$ j
: w9 {, K: U: H
* s- y: r+ Y; B4 T+ x& Y感谢楼主分享知识和经验。
  w! d8 e7 m5 t; [3 V# v& e/ v
% j( M: c7 _1 y每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。3 c4 W6 v3 G) {6 |! v8 Y) e
0 Z  c, [: M  @4 O
私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。% i: Y0 o  b0 s; o3 O

3 F  U+ q, X3 l5 o! A但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。0 i! L: p! m4 S8 w% n! h

) a7 a2 A8 W# [: H3 S( i除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。
6 n/ W' Q: J5 f. x. e0 c  h7 S1 M0 o- b

) a- t3 g5 h9 q2 U0 j" R7 a5 ]
; U& W' ~6 k( j8 U% ]# X) e  @+ b
; k* ~7 f, F/ z5 ]6 r' D! {

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件
0 u" n  l  J. Q$ x) s
  • EmEditor
  • Beyond compare
    0 E! R  O  ?0 b# W' z+ L5 @
4 G, t& _% q/ u# w9 R6 s; I
+ f; J3 _  G- J: ~1 P7 t, P
前者用于编辑,后者用于差分比较3 Z8 k7 a0 ^( U8 V! i
处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

发表于 2016-6-8 07:41:03 | 显示全部楼层
bt4baidu 发表于 2014-10-25 21:01( o9 o+ `  Z* s2 }$ t: s+ W
现有的mdx词典,其实足够绝大多数人用一辈子的了
6 I; m# f$ ^  @( n7 S5 u, H
$ p; _9 y9 s- a0 {/ y) V) `+ D本人前段时间制作、收集了不少,经过一段时间的比较 ...
+ @2 ?4 J! j' f: s: N) A
肺腑之言。

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考1 F5 _# E- D5 H7 l4 }/ N1 M
; G. C8 A3 S6 l
网页设计中最常用的字体有哪些?(中文和英文)* q4 {- X# u5 @2 c5 O: v
http://www.zhihu.com/question/19680724
7 f+ X/ x+ _$ l* d3 y6 {! X6 D- U) N6 o1 h! u# `. l  Y
本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode( v$ F: I8 g& r; W2 f3 X5 F
这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全
! g: F5 X+ V; b6 E) `" R另外Open Sans字体也挺漂亮% q: A# u) J/ f9 m' r* G5 K) ^( a
  • 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  ~1 E! w1 n+ D) R最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...
    ' h( \8 J, k5 K0 y9 S
    感觉找到适合自己的问题好少啊
    % h+ U: P, m0 V$ I0 C8 ]这个适合的话感觉是兴趣和难度+ e9 _5 z2 P% G+ ^
    想请教一下楼主是怎么处理这些问题的呢
    4 F% z1 b3 d% c还有种不系统的感觉
  • 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 编辑
    + v0 e3 M9 ?, X) u1 f5 `( v
    1 s/ ~# u( i/ `0 s: q+ m写得很好。刚看前几行的时候,的确激动了一下子。虽然没怎么懂,但是第一次能坚持把这样的东西看完,觉得也是对自我的一次超越。谢谢!

    该用户从未签到

    发表于 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 编辑
    3 v- r. f3 r8 b0 y, }0 Y  s2 ]
    . a/ u& l0 `) c1 |& j" p% Gjava和.net就是个垃圾,我懒得提而已$ g4 A1 y9 c6 P
    在Linus这样的大神眼里,连C++都是垃圾:+ Q7 ?2 h) ?, `/ c/ l
    http://www.csdn.net/article/a/2010-06-12/2187854 j5 f# w: W) L' d/ l
    * o$ H; @: c" `2 Q8 S
    如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。
    , |1 M8 ~: Y1 ]# d9 j
    7 f+ U# P+ X# u' i% y不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。; A. P1 H! ~& d$ u
    我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。8 y4 c2 l( A, A6 f
    这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。3 [0 b$ D4 i, S
    不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。5 M( Z& G. k+ p- Q. b% ^
    为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?7 W8 k9 S$ U- {' x4 E
    因为垃圾代码太多了。
    ) N) H; X" N5 r! M# N/ z+ a
    $ i6 P: V/ C: V+ {2 z) p, q1 ]8 D! v6 P* U9 e7 ?: c

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑 * _& T/ d5 U9 [' q% I$ r8 y

    8 q3 i) b  Y" b! V& }! v: T' k, e/ z  I" V
    算了,道不同不相为交流
    : s/ T8 D3 X. h* H. S1 R; I4 x想起某个梗
    5 S( r  o- f+ q程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!
    7 [7 a* j6 v- q9 Z/ c) h7 r% w$ z2 n6 f( c* K4 `/ c+ P
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。( h+ g) X  H% P; Q) Z) k& s
    # O& q) I3 g1 v  b4 F
    另外win95时代才是32M内存,win98的时候至少有128M,我一台老主机还是win98,文本检索速度秒杀XP。

    点评

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

    该用户从未签到

     楼主| 发表于 2014-10-21 11:28:36 | 显示全部楼层
    meigen 发表于 2014-10-21 00:07
    4 D% y$ D( `6 |! j, }  Z% J1 u算了,道不同不相为交流
    ! g" d; B* ~2 U; ~/ L! x4 r想起某个梗
    0 O* a2 K6 z3 O& s) n! t& w程序员眼中的编程语言
    7 m4 k2 W5 p5 w( W9 w
    不同的语言适用于不同的人群:
    " H! Y( q  y, ^7 V5 z- S9 G6 L如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。5 R) I% S. p8 O5 R; T. i
    如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。8 g5 B( m: C: W
    至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。
    5 K. _0 |* l! A* ]7 n6 |
    ( g! i$ F4 o' r! D编程语言的口水仗永远也打不完,不争了
    3 |$ b6 _9 _/ z' A- y

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:35
    % G$ N* n9 j, j不赞成多线程抓网站,但是好贴子要支持!
    6 |$ s. y7 {& \0 W+ I9 |  [" U, W! T, @
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...

    5 L. g7 E7 }: l* Q( B0 I下载软件?推荐一款?  D- e# q( V+ k0 j3 {, _+ _! i5 m
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    9 }# \7 O0 \" J- p7 h( p5 D现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?
    % E, E! ~# K  ~( |/ L9 ]5 N4 O9 N7 m比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。5 ^9 N# o# b, t! r6 I) U; _
    除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。
    ; N$ E( Z0 M# V8 r. Z* z# ]目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。' }# a4 Q0 X) T1 a- _* E7 h
    * c( a$ P. v6 B. L( y
    至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。
    * p& W" N9 w$ \7 J4 V1 d6 }对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,
    8 G4 e, R7 x9 `; ^2 g目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。
    # ~9 Y% b( b% Q$ z

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:5 j7 a' p. ~7 v+ U; B* @
    随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。6 e& Z6 u. ?0 e/ E# W- P5 y% w
    未来会出现一个新的行业:私人计算机管家。
    6 a9 A* k+ f1 n$ q专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。
    ! ~% C8 Y: |6 o% w, M- f但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:29( M8 T% a0 Y0 F8 a
    下载软件?推荐一款?
    % _8 T4 b5 @  w0 v- b/ ]& e0 O- ^$ U最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;- g2 x& H$ o- F- B  P3 m
    现在99.999% ...

    7 {, V8 {! o' H( z+ k用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。' f. O& d2 B, E7 A/ C1 c; {
    - _8 L, o& C) p! e+ U# p1 M
    十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。3 E5 \3 z: i& m9 g3 z9 ^. p( b' x- n

    ' `1 W/ c& P8 ^$ Z2 Y用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。
    , c8 w0 X3 o: P# C9 K
    % z2 s6 f3 _3 A" E- Y* a我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
    大熊部落 发表于 2014-10-21 16:18
    ( r; k+ C% D3 G  Z  W用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...

    & `8 j/ ]1 |/ r7 s我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件8 q3 c9 C% I; w5 Q  \: y
    ) ?' c; j: h0 Q, R$ L0 O! S1 X2 O$ [
    下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。

    * Z. S3 {# n+ X; e推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

    该用户从未签到

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

    $ g4 p& Q7 Y% I3 @9 o* k- H4 e8 q& ~. p" }
    最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差
    . H" ^8 [2 x8 t2 ~" x+ M计算机是用会的,不是学会的;5 T8 r! E% s5 B/ _8 ?/ ^1 _. f5 B
    程序是调试出来的,不是写出来的
    0 W. u3 P- x& F! u
    $ {1 J  {5 E$ a, y既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。( ~; j* A- V( ]
    你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

    该用户从未签到

    发表于 2014-10-22 21:25:59 | 显示全部楼层
    bt4baidu 发表于 2014-10-22 20:21. ?! W; i9 k8 ^' c. l
    最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...
    / Y9 k. H" f4 j& w5 ^% X  Y$ u* p
    多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。* _" Y' Z5 ~- v/ k7 d% S" K: }

    ; ?9 F- H. e" m" {; W8 `( D我的一点网络小技术是很久以前在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-19 15:46 , Processed in 0.115005 second(s), 12 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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