掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 67615|回复: 148

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

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑 ) D" S5 V4 ]7 g
9 x5 b5 L8 P, B
这篇文章主要是给计算机小白和初学者扫盲。
7 n- o+ R! O. ^4 Z6 s' W* f本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。' n7 h8 Z# m) `: W8 J3 H6 E) H, }
只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。, A( w# Q% d8 J

4 o5 j$ S3 E# `" k一、计算机的两个终极哲学问题
# a1 y# q5 W2 Q% [1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。
7 j; {2 K2 X9 q7 M# D1 c图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:
$ D3 e0 @+ l* c1 i9 w# n设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;
3 v; u* ]1 q% l2 K8 a. Z机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。, n' }3 o; [% M0 j/ H- ~
方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。* O7 m0 P' e6 u1 Z6 f0 K
“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。5 ]& R# w* e+ l2 m6 e) D
7 G  ~% Q) F' ^9 D. y2 z( S
那么要写出程序,立即就会发现不得不解决两个问题:
' i5 N3 L+ Y- q$ H% C8 K! K1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址
1 T  Q6 m0 p  g- q& U4 X2、怎么把两种方格区分开?也就是特征识别
- Q& E% s# m7 x  V& U3 K- s3 U这两个问题,就是计算机的终极哲学问题。
$ t; S1 h  u! b; o: F0 Z: J% }理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。
2 a& C5 T4 p- m1 D% Y+ B: c( U$ e7 h下面的讲解也会以这两个问题为核心展开。  k9 ]! H/ E! [" b4 p" G% u

4 n% O- c6 X+ d0 TBTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,
6 M) }, a3 z/ K8 v——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。+ l0 L* }/ Q) ?1 T
所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。
3 a9 r5 y! I) p! ]3 X5 |% |前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,
' P2 s7 U% `  ]而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。- u8 }: o/ u9 X' V% m9 o0 U6 B6 _) `
具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。! Q  a0 p& b1 u" L+ K
6 I0 V$ ]) L5 f' F/ i
不要觉得自己上学时学的不是这个,or文科生,就不行。$ i( z, Y- s* E0 H, h( c$ M6 J
江民杀毒软件大家想必都听说过。
' K  @+ Y& \9 h$ U创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。: \5 s6 K3 _$ g% n- ~5 V3 ~7 h, K
咱不奢望成为专家,写写程序总还是可以的吧?
2 _& B% h" ^3 H" D9 y- Y7 `0 Q
6 `0 ]; J' P2 \二、采用何种编程语言7 X9 D  |; g+ r# W' L% |7 R
上面已经说过,存放、读取、组织、区分数据是编程的核心问题。
/ x( C  J8 r* z显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。6 ?3 @% N% ?0 T; M" J  U
抓网站,恐怕没有哪种语言比Python更方便。
, E4 h4 f) W6 b; {2 J当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,
; H0 q/ N' K1 Y. h+ q3 {& g计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行," C* q  J5 v: q2 Q
没有慧根就别吃这碗饭。5 L% m5 y% v& ~* i) \" J

, g4 [- g* `! G三、网站抓取技术
4 M* Z1 z7 |& T, L* ]0 w# z/ k2 w& u1、下载某一个网页,提取其内容
" n+ C: z7 ~6 s& M' A) d$ ^以前写过一篇,就不重复了。参考:) H9 k6 H/ s$ v+ p- J  {
用一个简单的例子讲讲怎样从网站上扒数据9 j/ I3 t( U5 T* f

4 R3 c) `5 W* O+ {5 N# ~2、寻址问题
1 o# N" \; a+ m$ A9 z, `下载网页,自然首先要知道网址,也就是东西放在哪儿。; C  ~) R; u. f# \4 E
如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。
4 T6 u. o+ U0 X. a$ e' |7 g但是大部分在线词典,到底收了多少单词,事先是完全不知道的,
  h, i0 I4 {% b! ~3 [要把单词弄全,就要想办法得到每个单词的网址。, S4 p$ X& Z. `: }! R* C7 A* z
总结各主流词典网站,大概可以分为这么几类:
5 \0 b0 V  C9 X) ?% L9 zI. 事先有单词总表9 O) i; o6 t& K, T% z* D
比如http://www.vocabulary.com就是这种类型。- N! ?) K7 N9 _7 L- e' D2 q
它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。0 n' ~7 B6 y  R4 Y) [4 r4 G

: ?9 p7 T$ O* }4 ^/ Q' \II. 网站有索引页面
! X% z+ q2 s" c% r$ S如:* @( ^6 b9 c) E5 d
OALD(http://www.oxfordlearnersdictionaries.com/
8 @- z4 i( K/ G. W6 p5 Z8 O! l: w它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/
, @" f7 h0 n4 T2 U1 {8 m% `2 cLDOCE(http://global.longmandictionaries.com/
& g' z( ^. y" ^2 n8 |0 c" ^- J- _采用框架结构,左侧边栏就是索引页5 J0 C6 p$ `5 \
MWC(http://www.merriam-webster.com/ f+ Q9 d0 v% g8 H' D' \* @
索引页在 http://www.merriam-webster.com/browse/dictionary/
6 x2 E7 ?1 ?5 I+ a1 h等等
7 o7 k# N; K+ Y. C# z( f. ^/ A! n这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。! x1 V( ?# V8 v+ p0 \" I

  1. 6 @: ]  t/ a" |
  2. urls = []
    , i6 \9 }- s2 _, M4 a1 w
  3. for someindex in indexs: # 循环所有索引页
    / U. a$ N6 B( i
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    ( R& z. r) B7 B, [2 o9 ^
  5.     browsepage = getpage(browseurl) # 下载索引页面
    4 W7 F% o% d$ V0 d- f3 i. l9 _; F
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域$ [" ], c; m% D2 a( k5 o2 w
  7.     bs = BeautifulSoup(browsepage, parse_only=target)/ c) t) @+ \: P: o& q% U
  8.     if bs:+ y7 ~# P) j) V0 Q2 K6 r
  9.         for a in bs.find_all('a'):
    9 U+ K( F4 T/ d
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接4 S  a4 V; \. T) N/ s" l% v
  11. 然后:, C$ ~3 w8 ]3 d6 h
  12. for url in urls: # 循环所有单词3 X3 s' [. e  S5 F2 x0 \
  13.     wordpage = getpage(url) # 下载单词页面
    # O4 a6 O8 j  G  ]
复制代码

# n" ?8 x1 b/ w8 v6 v- _" h" C( E. I3 ~+ B6 x! Q8 ]+ n
III. 索引页和单词释义一体型网站
( f8 ~5 p, `& O# r& y4 T' I& \如:Online Etymology(http://www.etymonline.com/
+ }" Q3 h0 L6 O8 M* A6 ?# r和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可
' O0 |5 Q1 W; ?% h& O- ?. A
  1. 6 _4 `+ T- T' J/ m5 h+ d" I
  2. for someindex in indexs: # 循环所有索引页3 _  a2 F: X1 f" X/ b3 a0 c$ f
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex])2 _% }+ I% {- p7 P
  4.     page = getpage(browseurl) # 下载页面; _% K. \8 e  r6 F( N/ Q5 F
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域1 e) N7 n$ o5 P4 d7 K
  6.     bs = BeautifulSoup(page, parse_only=target)
    0 D* O+ W0 D" i/ I0 m
  7.     for tag in bs.find_all(target): # 循环抠出单词
    + S; l( r6 u1 F8 L. I0 K
  8.         worddefine = getworddefine(tag)- U: R1 F- B: K, t$ }
复制代码
# w; b8 @* s* o' P+ K; _) O) w
$ B) d4 H# @9 \& u
IV. 片断索引型网站) O: |  B- \' R4 e- l2 a  }( F
如:) J) V0 m% ~7 U$ g4 T
ODE(http://www.oxforddictionaries.com/; d9 ]8 u6 R9 y% {: ^( L9 `
每查一个单词,右侧边栏有个Nearby words
2 P4 q/ x# }; b2 O8 N+ P) i! O5 rRHD(http://dictionary.reference.com/7 F1 g& i6 Z' _9 H& E0 s: p1 G
右侧边栏有Nearby words4 o8 B, j/ z8 P, Q) z6 U
CALD(http://dictionary.cambridge.org/
9 Q7 @9 L5 j9 n( z5 k# O在页面的最下面有个Browse栏,给出前后相邻的单词" T: i$ k1 @% F* I2 S6 r
这类网站没有总索引,只好利用它的Nearby栏。0 m+ n' d" \5 v% L7 d6 k- ]8 s- W  Z
思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,
+ e  Y1 z! J& g" e4 G, D' W每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)
7 m' W2 _' K9 q/ @. C7 o
  1.   F7 L6 S5 f9 W8 W, y# I' l
  2. cur = 'a'7 |6 [, K% }8 Q7 I
  3. end = 'z'
    # a, m: S& \( K
  4. nexturl = ''.join(['http://somewebsite.com/', cur])5 ]0 J2 V# S) j, h5 E2 Z: n3 v0 Z1 [: k
  5. while cur!=end and nexturl:6 U# {( @( R/ ]7 ~
  6.     page = getpage(nexturl) # 下载单词页面$ _$ d' e, h, d# J! k
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接
    & q) |/ x9 c3 G  J9 l! l, y
复制代码

- A% D$ u& _7 B" H6 g8 ?' p7 k9 L
V. 完全没有任何索引,那就没法子了
& y/ f) S4 b4 a: s# [, p4 M当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理' T; K, T/ i% J" {1 b/ f  ]: D
理论上也是可以的,就是效率差一点;
# V, c5 m/ u7 o# i+ D$ T& D另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。
2 s0 d/ x4 z" U$ D+ c0 B; w
4 t. q! g7 D& J4 j1 W; @! m3、提高下载效率
$ U; e+ p6 f& j4 C4 d5 O1 wI. 多进程; _# g4 X1 A9 M7 [) H: E; b
上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。
, V: Z9 T/ N: ~7 L# \( d6 Z实际抓网站时,这么做效率显然是非常低的。# e4 \; _: X  ?% W/ R
假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,
4 y0 `' _( g4 |- u( B有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。* y2 E, _& r! Q) F& b  x
假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?
3 C/ v, H+ |# r" m& I( }& G要速战速决,就得开多进程。6 F8 h; `8 A2 i* U/ p3 q
同样十万个单词,分成25个进程下,也就是28/25=1个多小时。$ M# M1 P1 A* d3 p/ u
再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。. D  p! p6 f8 ]  |+ T; {. W* Q
在Python里开多进程,同样十分简单,3 q6 n6 D' m  c! o% M" r
  1. 6 F& ~& a- R" K! b
  2. from multiprocessing import Pool# u' `/ z- p1 @  ~+ E. a
  3. pool = Pool(25) # 开25个进程
    ; h. ^5 ~8 J: g! C6 K2 z# K8 `, K
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数
    % o7 L( `6 ]+ j
复制代码

# h! c9 U: I8 p& M. |这就搞定了。, L0 W- r: Q& O1 F# z- c

1 P& L. q1 S1 h6 a对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,  v  ^1 p5 o7 S5 n$ v/ @/ }
关于IV.,事先没有单词总表,就只好采用区间的概念,8 @- C6 W7 v$ g+ k- \0 h) K
比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载
$ T+ k2 c+ j2 \% z3 I6 A6 [5 P  w* q+ V4 d" R7 V" B
初学编程的人,一碰到进程、线程,常常有种畏惧感,7 L' j: G- X% b
看到同步锁、共享内存、信号量什么的顿时觉得头大。* J2 T* r; T3 n+ c
其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,
' V0 K  |( x# u! v+ }1 L其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。
* g( `0 F& P0 a# ?: L
3 G6 C7 |) p* n) }' VII. 断点续传
' E6 W5 C8 i, X  T+ U8 H事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。
0 M* V2 _# J* L5 D! }! R所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;  R3 O3 `# A# \' p; G- k2 n
即便无法自行恢复,也得容易手工处理,不然可有的烦了。6 x- Z% V" {- F  r' b+ O
这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,7 E3 U. \; N1 v/ y+ o
直到所有区块下完。
% \9 I& ^" @. h8 ^4 X4 _- I
  1. & D) E) i" e6 ~$ [/ w# J8 S* R; I' z
  2. def fetch_a_word(part, word, url, data): # 下载一个单词
    8 x$ z4 s9 t* W8 N
  3.     word_define, failed = get_a_word_from_website(word, url)
    ; x$ @; K, `( y4 G% p6 _
  4.     if failed:! ^. I( i8 g! M) C4 P
  5.         dump_failed_word(part) # 输出下载失败的单词及网址
      u/ h1 Z$ w4 W8 K% A
  6.         return False
    ) v  l  _3 h+ R
  7.     else:
    ! `: ]. P3 G, O; @8 ~5 |7 h
  8.         data.append(word_define) # 保存下载成功的单词数据7 U( f- w6 D# c1 B* |
  9.         return True1 g  U, H: @0 v& ?4 a

  10. ' V& q3 k( K3 e) V& M& _) m+ L" C0 x
  11. def download(part): # 下载一个区块
    1 g+ a8 k9 X3 \) y3 k
  12.     words = getwordlist(part) # 读取单词总表+ F: L9 ~! u, A) s
  13.     if hasfailed(part):4 ]+ _9 ^8 L4 H, q8 w% l% b; s, ^
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址& d$ H  u- B9 y' O+ _. H
  15.     else:
    5 c4 L' G9 W4 E+ {
  16.         word, url = words[0] # 首次从头下载9 E- E# i2 t9 l9 g
  17.     data = [] # 用来存放单词定义
    6 O7 L6 z7 j3 m3 w# y3 J3 u- r
  18.     while not_end(words): # 循环下载% S$ E' A+ a7 j* d6 H' Z3 H
  19.         if not fetch_a_word(part, word, url, data):3 S4 W5 @) X+ o
  20.             failed = True+ d9 T! k8 B# ?
  21.             break8 G5 J8 b* s7 Z, H; `
  22.         else:
    & w" z2 p# i# w$ S! F$ h5 E
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址0 R: V' P& \/ Q% ~
  24.     if failed:
    $ r# `& M' s* g! |& ~9 F( c* e" D
  25.         suffix = '.part') A& \( V8 S1 @6 F4 ?( B/ {7 u
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'. `; I7 q3 a# b6 g1 i9 O% W

  27. 9 l) q1 o7 Y+ Z7 l. @
  28. def isfinished(part) : # 判断某区块是否下载完成* p5 z1 F# A) E1 W* j" l
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断5 `8 c: y  J" u* n  Q3 l
  30.         return True
    # k! n. B; v+ M: a, r5 U
  31.     else:
    ' d, H7 ?4 J+ Y/ p+ n9 E
  32.         return False
    , d, \$ E+ z$ x2 T) O

  33. / X. S# `8 c2 {( s& Y- I
  34. def downloadloop(): # 循环检测未下完的区块
    ) t0 R9 z; e1 `# A  I3 u
  35.     finished = 0
    1 R* d0 m: ?2 C. ], E
  36.     while not finished:
    0 D4 G$ h/ Q+ h! ]. ^2 J$ n, h
  37.         nf = [] # 没下完的区块
    # G, r- E4 I4 @# M. D0 i3 |
  38.         for part in parts:* \$ Z- h* ]3 f" U
  39.             if not isfinished(part):
    6 P8 F& T) I9 I: X  G' C% g4 h
  40.                 nf.append(part)
    6 `8 w9 r$ Z, T+ f  N; y
  41.         finished = not nf
    1 F5 E% W4 @; [3 v9 E
  42.         for part in nf:
    - B" P, E9 q! g2 `
  43.             download(part)' H1 \8 s# g7 K
复制代码

2 _; `: S& Z7 ~7 Z! [1 u# I+ K  \$ u" b4 f5 S$ S
III. 高速下载网页的小技巧- T3 @( n7 t/ R2 ^- o' x; u8 O
Python里面有三个库都可以用来下载网页:urllib2、urllib3和requests。/ |+ e# e' R- F6 Q' @
其中urllib2是Python原生的,urllib3和requests为第三方库。& W* S: A3 a4 [' b9 y3 E
(似乎Python3已经把urllib3收编为正规军了)5 h2 N) H3 \7 r
这三个库有什么区别呢?7 h6 G; J0 a% Q# }5 ?1 t6 z5 P
形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。
3 L) a7 _1 E% ?& \8 o, V! y再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,
9 Q5 r2 I6 G0 F; x2 F0 ^, L8 p% Z所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。
; t. V" b  m2 x8 k' R) \2 D' F7 [但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。7 P/ E  u  H+ T. Q
这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,
; v+ h/ y6 C; _, h, g通吃一切网站。0 |8 Q+ ~4 |; a$ z7 g0 s- s
所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。2 t; d/ E, @/ D9 N' Z
这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:
5 C' `, f( p  `7 q, W$ nhttp://urllib3.readthedocs.org/en/latest/! s9 A% i' L$ y6 x. c
http://docs.python-requests.org/en/latest/
9 v0 k. A6 @" r. k4 E8 @# a" M

  1. ' g) M5 |, J- K' L
  2. #urllib2! m1 b$ x; ^  l' R
  3. import urllib2
    % Q/ E  D  a$ R$ r! I! r  J. L
  4. def getpage(url):
    ) w) o# d' n2 E4 \3 t% v* a7 t
  5.     req = urllib2.Request(url)$ P. ?6 F: p0 Q/ u
  6.     response = urllib2.urlopen(req)
    - U  r9 D: q6 K7 b, Q, }$ |
  7.     page = response.read()' J/ E9 D/ c8 d5 ~

  8. / Q# W6 J9 P8 |4 L
  9. #urllib3
    9 V% N$ f5 z/ t4 w6 j. w% J# B
  10. from urllib3 import PoolManager
      `/ J% k, P! u" ^+ i. O9 h) ?
  11. http = PoolManager()
    - w' N2 L# z* A& Q; t9 `+ a' e
  12. def getpage(http, url):
    . k! {& z: a0 o( ?! f1 o  C: r* Q2 z
  13.     r = http.request('GET', url)3 K% k; M8 @3 b) ?5 x
  14.     if r.status == 200:/ y# E2 l; C+ |
  15.         return r.data. _; l( E5 x1 ]: @8 q7 I
  16.     else:
    * @  v% \6 c+ b( h$ m
  17.         return None
    # E$ O0 Q  n. M$ x1 D/ \4 S
  18. - A. V0 ^0 g6 r7 F" o7 ~7 M
  19. #requests
    $ h1 @, m& g5 o, K7 y( W: p& R2 U% O
  20. import requests' O+ h' @5 p: |, T. [, m( q: v
  21. session = requests.Session()
    . x& Y0 z. E9 R7 n) Q
  22. def getpage(session, url):* I% }# ~& N+ I( r, }7 v
  23.     r = session.get(url, timeout=10)
    " [( U' w9 s' x: A5 Q
  24.     if r.status == 200:3 o" |5 X' W/ h+ h) c9 I/ I) y
  25.         return r.content
    1 H) b( C, J- B/ \5 ^7 N) i4 H% L
  26.     else:& X8 N/ x7 E& N
  27.         return None8 c9 G* {8 t; v1 b$ {- u
复制代码
' y# U5 x8 h& G! R/ I
四、后期制作, \% V* |/ a' c# H
1、文本处理,是个特征识别问题。& }$ J7 U" F: c
本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。% p& S9 Q! U. i
当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)
* W* O  u6 p3 Z8 p" c" \' x3 J3 P都涉及到特征识别问题。4 z1 c& B$ B: b# w8 [5 j
相比这些高难度动作,文本处理算是比较简单、基础。
$ {! h* T0 U. I' \Python里常用的文本处理技术:正则表达式、BeatifulSoup、lxml  v- y& v% L  \1 ]; x4 Q
正则表达式非常强大,但没法处理递归嵌套的标签型数据; u( r; v$ w/ A2 B8 w! v7 p# T
(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);
, c) {( |  x: d; L: BBeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。
9 A0 s7 \( o& v# i所以常常要结合使用。
" j. r2 J" J0 b. ]% z/ y! G这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。
2 X9 g6 |3 [2 Z
- j* n7 d4 Z+ }1 L( ^- D2、排版- {' w- a' c9 w& ]
HTML、CSS的基础知识:
6 @; u+ N' t8 L4 ?+ l1 Dhttp://www.w3school.com.cn/html/index.asp5 p2 j  @( Z& C5 j  K4 T
http://www.w3school.com.cn/css/index.asp" Q" p# k& O2 c2 y* M6 o
http://www.w3school.com.cn/css3/index.asp# ^- G  @  x* c$ B3 }0 k$ M3 _
非常系统、非常全面。9 D) Z' d; O2 g& G6 |! M6 Y( U
排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。
+ x" f6 G2 t) e  G) a6 q5 K/ `7 u4 M6 }0 R4 e, R
五、结语
& z+ d+ p$ J0 J) r2 E花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。
# v" q  N1 x, e8 K& m( I7 B所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——
. z) R1 y8 l. C5 B% x大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。; ?+ D% G5 x0 H( o# _

5 n' t- O' r" S7 d, s: U打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。% h9 e& W& A* c9 h6 ^, a
( U$ B3 M1 c, o( p- }- [4 A" l& a
只是拜托不要打扰别人,真想要就自己动手。' O9 A6 U' u1 b2 h2 y. e
尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。8 F' S; d, a8 Z# A' d
水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。
* g+ |) b9 B" d2 N) B( Y虽然每个人都觉得自己至高无上,应当受到别人重视,
9 @* O; ^% `- M0 t其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰' F8 c% r( J% m, ~& r% G
  D. w. A( P+ X* W

! U) o+ q) W# x. f% W! o3 w1 ]========' V& q" f, @3 h' A
六、拾遗
! I) E; A* ]1 j关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类% L8 Z9 R/ t* M8 p+ ^! \
确实如此
+ c8 A5 a# L$ I8 |- M不过这里只是举例而已,不用太较真啦 ; v1 e, r" e' I% R
实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏% c  T+ c# ~& {$ k) k: p4 R
这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。; ~4 F! U& v# w( h4 R
即,
2 X. _( X! p* [/ o- j第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)
' ^9 f# @  Z3 Q1 \第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)
: y9 a1 |& ^( c2 b第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作7 Q5 w' W% u' L' I; E, o
。。。; H: j+ `+ Z" ]1 f' _" }4 d
直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空)
4 j* n/ G( {, o8 X7 v最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。) u' Q$ g. J/ O) S( _0 c! U
形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。
8 _/ r, w# ^  k0 z7 |- F因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。+ F4 M9 D5 E  A2 m+ t

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:41
$ U: f( q: P; U" r) \$ |感谢楼主分享知识和经验。+ J3 ^2 T4 A% f
, g. h* u3 s% C3 ?3 T; x6 z
每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...

' T) K2 H1 j! i现有的mdx词典,其实足够绝大多数人用一辈子的了
: _( B* \% k. ]$ _/ W6 N" B  T; o# C5 r0 }, Q" R
本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。6 [) \# x% p; a1 E' V5 [

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

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。
  O) I& `2 C  l% T6 D: x其实只是你没有发现而已。( k' h: e; k) |+ C/ Q* F" `
ODE: http://www.oxforddictionaries.com/browse/english/
) M2 J- W9 Z7 p  XRHD:http://dictionary.reference.com/list/a/
, S8 A: P7 k' w7 B% L6 uCALD:http://dictionary.cambridge.org/browse/learner-english/
. v, I# H3 P+ L8 j
1 [* s3 n( Y  \; ?( x2 x/ H* d如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。
6 m; P' y) o$ {9 F3 v; J以第二个为例:
. G) Q5 M# h2 P( n9 O9 G% F4 C* vinurl:browse | inurl:list site:dictionary.reference.com+ H3 I7 ~+ M  K+ h- i/ f
" m4 n" ?" z! b9 ?& k; H" F3 y
PS:最近才发现这里,发现资料很多啊。# H" r3 o* y: P/ r3 [! W

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧5 [! J, q+ y; f. q

# ^$ k# G0 h7 T# t; S假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改9 v( `* {) o% a$ h3 I3 {
或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下
1 z  [+ [6 j7 o* Y& `结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。+ C! U$ T/ H' I1 B
这里有个比较省时省力的小技巧,可以快速定位到想找的地方
4 j2 H3 F! Z) j3 v8 F( z# ?4 C
1 S; T( h' V/ X9 D* l, F( B1、Goldendict里,在想修改的地方点右键,有个“审查元素”:
% m6 U" f* F* w! ^
7 ?" I/ n& S3 l+ ?$ Z( k# E5 U* {" m" p* M5 |# I
2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事
7 d, u4 ^3 |* ?" h, w/ x& x) N
1 w- p5 d( T& |6 z
6 ]  b. P# ]# m1 ~! L8 Y/ Q3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方
1 x4 l0 H% e. G1 _8 }6 n4 T
6 ]. b+ A6 d: w& y: e' x/ }8 K- _: k$ ]5 i" L2 [
收工

该用户从未签到

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

2 C. T  w4 w% U0 |9 [% K1 ?; O* Z! }! r! j4 m
8 @  H$ ]; S; N6 h7 m, w5 D
$ p/ X* J7 E- @4 Y4 a: a$ V1 N
感谢楼主分享知识和经验。; i# k" |1 k7 {

7 B& b, p/ p. V9 w1 c5 ~' \+ e7 g! j每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。; g$ R3 F  b& {

  l1 [/ e" X* i8 v2 s& S, r1 N私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。7 n" W0 f5 P8 b( D. E  }

2 y, E" B* t5 U0 n& j但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。
0 T+ ?" k$ b1 u* h- I0 Q" i) W) {; Y4 |) ~6 B
除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。
3 n* g) }( _; J+ `: A
$ n9 |7 m- o  {5 f) |4 }. q8 K
" k7 }* B# Z: J, o3 W2 `0 j: t& d& k2 T) \, E" q) u* Q& h1 O# z

6 v7 v& o+ o2 Y3 F& X, X7 z

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件- {! H! ^4 Q. }6 g% t. u
  • EmEditor
  • Beyond compare- E2 ]! Q! {& R% E% l; K

, P3 Z2 i+ e' T% G: ~: h6 I  I1 y' d. m5 Q: ?
前者用于编辑,后者用于差分比较
6 P1 L0 M2 `& r- o3 {6 U( U处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

发表于 2016-6-8 07:41:03 | 显示全部楼层
bt4baidu 发表于 2014-10-25 21:01
2 g& ?* I2 O: |" V2 c/ @现有的mdx词典,其实足够绝大多数人用一辈子的了) [6 W6 c' m2 H! l2 n
' r+ s. b5 S; C
本人前段时间制作、收集了不少,经过一段时间的比较 ...

8 n! y8 o# A; r5 W7 K, ]肺腑之言。

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考
7 j5 G  H7 W- r) P: v6 W& v% z6 w" F+ M) Y1 n  k0 N, d6 Y: ~
网页设计中最常用的字体有哪些?(中文和英文)) o, ~' N5 Z& U
http://www.zhihu.com/question/196807243 f; l, r; D) A( |% d9 t% l

  d5 L; X% E$ W" u/ D本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode6 O5 h, v6 G9 |
这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全0 `/ X( K! [' }" c" v( w  M
另外Open Sans字体也挺漂亮
& _& |" j' M5 i; Q+ Z" ~. `' @! {
  • 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
    5 v) g, v+ j* |0 T5 z9 Z最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...
    ' F0 T+ L2 F; F: O8 j& I0 I+ V3 q
    感觉找到适合自己的问题好少啊
    : _$ w/ K/ v& a这个适合的话感觉是兴趣和难度. o: R0 q: g/ L+ y
    想请教一下楼主是怎么处理这些问题的呢; r" J. q9 `4 Y6 j  Z% l5 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 编辑
    : ~# `' j- q' c, f0 n$ O3 r- N4 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 编辑 * J' U, P1 ]: c- _5 A& M" W; s

    8 F. }0 \# ]0 }( C6 Y9 Kjava和.net就是个垃圾,我懒得提而已
    ; q" R" C! s) @. R5 l在Linus这样的大神眼里,连C++都是垃圾:
    * V- P' @9 C9 p: s7 }http://www.csdn.net/article/a/2010-06-12/218785( n8 c+ i9 }  n8 e6 \+ b! W% `
    8 h% w" B6 |* G
    如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。
    . h9 A9 C+ ^$ u) x% |+ U( Y8 g5 g3 W6 A3 X8 t) o) L& c
    不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。
    ! T- J% w' F% y$ T* @我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。
    & b& s4 E) F* Y2 ]( ~这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。+ P* ^0 }/ G  |5 r
    不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。0 }8 F! h+ \) }* k
    为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?; v) y. v1 ?% q
    因为垃圾代码太多了。
    2 z( ~( n& f0 Q3 O3 C2 p* `, J9 R5 C9 Y

    1 H8 @+ C& o( v6 z

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑
    9 ^0 _# g4 N) G. c9 ]9 u6 N* ~0 y; J, e

      t, e" f, o4 y算了,道不同不相为交流2 k- U6 _4 v. C( S8 M+ _2 W9 Q; P: A
    想起某个梗" W" I7 z3 D8 B! S
    程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!
    3 E! J1 X& V, G2 b9 j0 H5 r! v+ u6 [3 m$ d: ~5 b
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。, w1 V0 I4 B0 f2 f  G1 o
    8 ]! Q0 _. E5 _' B* j4 P
    另外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:070 n0 l( c$ x3 `
    算了,道不同不相为交流1 ~* W, q/ I* J9 v+ S
    想起某个梗
    , C, q  c( y8 y1 |程序员眼中的编程语言
    ' I  H0 G. o9 O9 R8 \4 g
    不同的语言适用于不同的人群:
    / o. T  T0 T7 `! \4 j. L如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。* m- U. D3 x* B, ?9 }( u& z2 P0 f
    如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。; u" c8 R2 S9 u7 n6 x, ?
    至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。5 \' R( j  W4 H- U' A

    + {1 K5 c% g' t. T6 f0 D编程语言的口水仗永远也打不完,不争了
    ) m" i, n+ C6 ~9 J/ M5 i

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:35
    4 t& @2 O- n% k- C' L4 X  f不赞成多线程抓网站,但是好贴子要支持!
    : ?: ]  C9 T1 @+ k8 o- y3 s1 Z
    % i. R8 c7 s: [; U' u* I: M自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...

    , k  r1 X+ N4 ^: m! h4 C& s0 f# o下载软件?推荐一款?
    & j! k& r2 J* B+ |; L4 b9 G最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;- S& D$ O1 K/ ]; p( P; q4 ?
    现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?" K" P6 U  g, W, L  H- ^: V) R
    比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。( T# h9 i3 ?0 c2 ]+ ^* g7 m
    除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。# x. _, z6 R8 {! \/ Y: S  [& ~
    目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。
    2 N' A$ A3 _% ]( r
    1 v9 Q( f7 y$ z4 P  A) Y+ _至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。
    2 [7 u& Q! u* s; o对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,7 [  O6 X/ W7 C2 H- T' D- z
    目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。# {$ K: ]3 ]- z9 @

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:# C1 ^+ K* W6 ^/ P/ k
    随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。
    8 Z( p1 \  g. b. P# M) B未来会出现一个新的行业:私人计算机管家。; l* ?& x) T# j6 ~3 H+ }! S! G
    专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。: b3 a- `% n: u7 y9 s  W
    但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:29& v% s5 {5 Z( }- j
    下载软件?推荐一款?
    0 Q: s% }3 {2 `  R: f最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;$ z! K2 V4 f2 l
    现在99.999% ...

    . v/ f4 T, B  r! d8 |用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。4 b9 G& G% b- o4 F: s
    ! S& v5 D/ s  m
    十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。" [9 v. d) E0 f( V# e

    & K) O( t. B/ j1 H, |用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。- l' ~, c1 x' v* Y3 F6 v
    % ^# v3 Q( |- M0 v5 D0 J
    我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
    大熊部落 发表于 2014-10-21 16:18
    4 S# d) C/ y- G6 s用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...

    ! f9 q' G* C; `9 v  K$ o我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件
    0 i0 ], Q0 A7 H1 E9 a. P, {2 R
    - o* G4 Q. O. g4 T: k
    下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。

    . e: ~, Z+ e! r" U+ ?4 [推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

    该用户从未签到

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

    ; U2 O7 p8 A; v3 U/ c
    , q6 y6 l' S8 s7 c最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差
    8 ^, S. Y+ I1 i! r, w5 N- q: S, h计算机是用会的,不是学会的;
    % R9 c  }0 F1 G, i9 U8 o程序是调试出来的,不是写出来的" p3 ?, j) f6 R+ o1 ^7 M! J

    / L: C* _1 x- Q/ w% L4 V4 E既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。
    9 B7 L/ Q4 \! m' W/ Q* v你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

    该用户从未签到

    发表于 2014-10-22 21:25:59 | 显示全部楼层
    bt4baidu 发表于 2014-10-22 20:21
    3 X. K) Y- @: _- x最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...
    ; n# q9 P4 I, ?* [
    多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。7 J" k+ s3 o, [  o

    - }. B8 ^0 S' `我的一点网络小技术是很久以前在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, 2026-8-31 06:10 , Processed in 0.041939 second(s), 30 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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