掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 66176|回复: 148

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

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑
! s4 Z% N4 o8 e2 z8 s1 }/ R5 T
; ?" M: U3 @; W) e! [$ O; U这篇文章主要是给计算机小白和初学者扫盲。
/ [7 n1 }: U+ e% o$ n) d本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。; ?  H- L/ {8 Z/ C8 k# x) X
只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。* U0 ~5 Q* ~, y5 y2 `
! n' K9 G' x! P8 m) `6 _7 ^
一、计算机的两个终极哲学问题0 E- J0 m8 x5 T$ e1 W% E
1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。
8 p( ^0 F' q* _; X6 L* _/ D) x图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:4 c3 u# D4 q: m: U
设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;/ N) J( ~4 ~+ H
机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。
( W  y" Z, v3 v8 B- \1 H方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。/ J! T* o6 a" {5 h
“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。" q; _: |: g7 _, p4 ]6 W' E

: R; }# ~& q0 @. |0 C3 r7 Z" o4 {那么要写出程序,立即就会发现不得不解决两个问题:  s, Y$ L+ n7 j* r& R
1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址
4 {+ B$ C7 }  o9 d2、怎么把两种方格区分开?也就是特征识别. z" d" x3 I- s7 \+ @) ^4 c
这两个问题,就是计算机的终极哲学问题。0 S: P% d) d: u7 F8 t
理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。
5 Q9 L9 N9 n5 m下面的讲解也会以这两个问题为核心展开。
  ^- M: ?! w4 Q  j- {4 ]) ?
4 o) \3 P, X! O* {BTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,) j- M$ v& m* }8 r
——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。
5 l% E, ~- i4 i' U9 p所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。
4 I3 ]" r: @5 r' C8 [8 D- b前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,' n; q# C! V7 F2 g8 l0 Y) a
而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。
  G# G8 z0 H. T! }* K; m具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。
7 h, B& k6 _' Q1 S' n4 E% G8 P" [2 M9 H9 K
不要觉得自己上学时学的不是这个,or文科生,就不行。! _; T% P8 n7 Q" ~
江民杀毒软件大家想必都听说过。
$ f! Y/ x- z- y创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。
* W' C/ h# F0 i2 J; F3 s" M咱不奢望成为专家,写写程序总还是可以的吧?
$ W) _# e! p  ?" j
8 s2 z3 u; d9 }' R% O; ^  y二、采用何种编程语言
3 y* P& s) j: Q3 E上面已经说过,存放、读取、组织、区分数据是编程的核心问题。
6 a: h/ B& v, P$ H2 F2 N显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。
* N, n9 F/ u7 c# W- o& `1 K抓网站,恐怕没有哪种语言比Python更方便。. m4 `* i( P! \: `
当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,
! o; `% h+ A3 ^3 V( K计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,
! G3 {3 |& Q+ O2 y0 M; c没有慧根就别吃这碗饭。
' g' w# O8 l* U( X
, y7 T$ e: Z9 J6 Y4 [; l三、网站抓取技术* }7 x6 G% f3 C. H! Q$ ~) v+ P
1、下载某一个网页,提取其内容
$ P7 B; ~% ^5 ?7 u以前写过一篇,就不重复了。参考:
8 a: T) d/ E5 w0 J4 ]% O$ o% _用一个简单的例子讲讲怎样从网站上扒数据4 T/ k/ p# y! ^' v3 d
- H9 j4 y  K) k6 [' p' W# K) V" [6 A
2、寻址问题
6 K8 W6 t4 c6 u8 R  g下载网页,自然首先要知道网址,也就是东西放在哪儿。" {- w- g! F, [5 x
如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。& f; `5 t. l; i
但是大部分在线词典,到底收了多少单词,事先是完全不知道的,/ w( E& I( f( k. }6 \9 a
要把单词弄全,就要想办法得到每个单词的网址。& m" E* F8 C8 T% J, N
总结各主流词典网站,大概可以分为这么几类:! Y% I) R# a; H) o$ s
I. 事先有单词总表
0 S6 _& e6 `" U& D' Z比如http://www.vocabulary.com就是这种类型。: N) b( B. T( c  Y" O
它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。
# q" w: N$ }8 R/ H$ T6 @
$ l/ H7 H, y3 D3 uII. 网站有索引页面
8 N" @( W% u9 W9 ~如:& E/ t6 S/ g. j1 i5 c. H
OALD(http://www.oxfordlearnersdictionaries.com/+ \% t8 N) m- E
它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/
: V  D9 O0 |+ Y8 y* KLDOCE(http://global.longmandictionaries.com/
, z* I! t" b7 k9 L  r采用框架结构,左侧边栏就是索引页
$ A  y5 M% y6 T% N" cMWC(http://www.merriam-webster.com' v/ I" O) _, w9 F
索引页在 http://www.merriam-webster.com/browse/dictionary/3 m  e7 j! c& C+ o" T7 W& h2 k
等等
1 a0 p4 X( z. f# I! K这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。
: H6 ^5 v" m) l

  1. 5 e8 E+ z4 K$ ?  b; O
  2. urls = []: v' e: U& c) Q
  3. for someindex in indexs: # 循环所有索引页+ C  Z( z" c( y) t
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    , f" e3 I  O, N/ |5 J* m: O! q
  5.     browsepage = getpage(browseurl) # 下载索引页面
    3 l/ h; E# {" E. d" L3 R. T
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域
    " ^( V# v. k7 W% _
  7.     bs = BeautifulSoup(browsepage, parse_only=target)8 X) h6 x' K2 A8 M' h* V# k& O
  8.     if bs:
    9 ?# m) q; C. K* q7 V1 b! [
  9.         for a in bs.find_all('a'):/ \. I) @% B$ t( \2 Y! P7 D, H
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接
      `4 }6 R, o) F" T7 \6 c" n6 ^
  11. 然后:
    # u1 h' e" G4 c
  12. for url in urls: # 循环所有单词
    : e" V7 Y: c4 a7 ]
  13.     wordpage = getpage(url) # 下载单词页面
    0 r: a) Y; b# v  @8 b9 Y
复制代码
; r6 c9 {$ V, i7 H7 x

# K# U& ~1 e& y  h7 hIII. 索引页和单词释义一体型网站
2 C% h) s: J0 i) ?7 a0 j% P$ P如:Online Etymology(http://www.etymonline.com/- E* f3 Z5 H% {1 I, p7 ?
和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可" I$ ?/ o9 H% ?: O+ j
  1. ( A2 z) c: l! D
  2. for someindex in indexs: # 循环所有索引页# D$ @2 {' p: h% m; o; ]
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex])5 ^1 K# k- W" v7 f* r; q3 n/ u
  4.     page = getpage(browseurl) # 下载页面/ G  g) Y4 t' B" O1 Z$ l/ ^
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域
      T, J/ V$ G( A9 D6 Y7 y5 |
  6.     bs = BeautifulSoup(page, parse_only=target)
    . b6 C: Z  {: m6 d
  7.     for tag in bs.find_all(target): # 循环抠出单词" t# O9 l! ]! v8 J8 c) e
  8.         worddefine = getworddefine(tag)
    : u6 ?+ o/ j) A" ^4 j% \2 A
复制代码

/ ~3 B+ ~! {! B' N$ H8 f" }/ S; F
  u/ I% C6 R& ~: |+ J" UIV. 片断索引型网站
2 |% _( A, r9 E$ i1 p7 e如:
2 R# q+ U, i, M) s1 k% I8 G0 L% GODE(http://www.oxforddictionaries.com/' ^  b$ _- l) [6 U3 a; V. r3 W* k
每查一个单词,右侧边栏有个Nearby words
' y, h5 s" K; Z2 i- YRHD(http://dictionary.reference.com/
4 _. u5 p, F/ \3 y右侧边栏有Nearby words1 F7 A  b- S# m" a9 L
CALD(http://dictionary.cambridge.org// Y: _+ G  Y/ ^' ~! z# Y* h
在页面的最下面有个Browse栏,给出前后相邻的单词/ g. C/ k+ N' m) c
这类网站没有总索引,只好利用它的Nearby栏。
0 Z7 h! `6 f5 s- O2 _% P% W& a思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,) X- R8 _+ d$ z0 @: ~4 ?" S
每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)* B, h% X# e8 d0 |6 d3 J
  1. 6 ?  l4 T) D4 p$ Z! A" u
  2. cur = 'a'
    + a2 g( ]. q7 W" w. q0 U% H0 |
  3. end = 'z'
      R9 }1 |( W  Q, ^& x* r" ]# \
  4. nexturl = ''.join(['http://somewebsite.com/', cur])3 E: C- e- H3 v) _! M) {! z3 B6 K7 Q
  5. while cur!=end and nexturl:' a# L  O0 D( R: T6 i! T* ?9 j2 y- a; \
  6.     page = getpage(nexturl) # 下载单词页面3 N1 L* K0 f4 M( I# G" D& Q1 a
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接: R. b1 j" {- y, x; m8 K* [" F
复制代码
; E4 g% n9 M% ?, _) W# ~+ k
( R4 s* T. U% `" i1 A& L
V. 完全没有任何索引,那就没法子了
0 q7 C7 w& g+ \$ U1 w* w; i当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理
: Y4 h# U4 \) s) C  g4 ^理论上也是可以的,就是效率差一点;
+ V5 n/ ?- d) d3 J另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。2 t, o) b: g% _- D7 }7 a6 a

7 w7 Y1 \. y- X- f6 Z3、提高下载效率
2 W1 ]6 K5 p2 \$ mI. 多进程, I) f, t7 J, }
上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。
8 n% a' O# d7 Q- Z) {实际抓网站时,这么做效率显然是非常低的。
( j" `+ X) J  I4 }6 Q假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,
, R) z2 T8 X- b: i有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。
' ^: F* p. L$ o7 ]! T! n5 U假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?2 M, O7 U& [' W  E9 Y
要速战速决,就得开多进程。% B/ K3 V& i9 B/ O% q: K
同样十万个单词,分成25个进程下,也就是28/25=1个多小时。
) e' q, s' e7 M, p2 s5 k再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。, v; D$ w3 b1 v+ E$ y
在Python里开多进程,同样十分简单,
& A7 ?" F0 E" _0 S/ C2 q

  1. % \8 [' n. s+ W$ n
  2. from multiprocessing import Pool& L/ Y& y3 B( Y% T7 g7 F
  3. pool = Pool(25) # 开25个进程
    8 L$ `! J5 p; K3 Z
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数
    , O3 E: N) X; u/ H
复制代码

' u! x* S% v' u$ p2 V7 V/ y- R  ^! b这就搞定了。- e$ k2 J* x! F3 k9 J
% a  Q4 t; ]" Y/ z7 Q+ T3 |
对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,& c# d9 X5 M6 u* y# g" D7 [# \' {
关于IV.,事先没有单词总表,就只好采用区间的概念,
* o/ j2 h+ j6 @4 U4 r比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载
  a8 P1 V8 x: W" L* B* c: S- g; s
1 }4 N' L6 q$ }, p初学编程的人,一碰到进程、线程,常常有种畏惧感,
% s& d" g* h2 y" E看到同步锁、共享内存、信号量什么的顿时觉得头大。
: U: N) [9 Q  ~其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,
. K5 r" O* ?3 b, F3 |其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。
: j7 X2 u: U7 j- v1 L3 L
: |6 `/ a& d: {7 gII. 断点续传7 T' k( ]  }- U- P
事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。
, b; y3 b7 }0 Y# _0 Q2 |% w- ]所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;
7 v/ E: h  N* j9 H2 S# I6 S8 @即便无法自行恢复,也得容易手工处理,不然可有的烦了。
# X; W: t4 t+ N1 j3 W! k8 E7 i这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,5 Q' `2 b; |. r4 [
直到所有区块下完。3 N% y3 ]" V1 y
  1. 5 D$ z$ q# s2 S
  2. def fetch_a_word(part, word, url, data): # 下载一个单词
      x( r* b8 l& v
  3.     word_define, failed = get_a_word_from_website(word, url)
    * s7 L. ?# h5 M4 o
  4.     if failed:6 M' Y4 v; x4 J- p9 S7 J: p8 R
  5.         dump_failed_word(part) # 输出下载失败的单词及网址
    + J$ f7 z, H  M! C+ X: w7 |
  6.         return False
    # M! Q# Y; C8 `. J$ z0 x
  7.     else:& M6 J3 ]4 |9 N' j
  8.         data.append(word_define) # 保存下载成功的单词数据
    3 J7 v: E7 q* |/ s. g% o% a! O
  9.         return True
    7 A7 I6 [; \3 Q2 _0 a# {
  10. ! |; ^8 v) w/ u& o: v% n0 J+ G
  11. def download(part): # 下载一个区块( a1 _4 v' U, Y* b4 a
  12.     words = getwordlist(part) # 读取单词总表3 K# [. s0 f' z& Z& W2 A% r
  13.     if hasfailed(part):  W4 F6 ]1 W- K8 I0 K
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址
      V3 k- r2 z- S/ P7 J$ \. h
  15.     else:# y& p* |# @" R* P+ I7 j
  16.         word, url = words[0] # 首次从头下载
    ; K+ O! f7 ]0 y& {  s4 Y0 m2 G
  17.     data = [] # 用来存放单词定义
    ' @5 ^9 H1 m' G* J2 y
  18.     while not_end(words): # 循环下载
    ! N8 [$ C# A$ U4 X# J  D
  19.         if not fetch_a_word(part, word, url, data):+ \- @; g! W  _* C- i) f
  20.             failed = True6 m" i0 i; d8 n/ a/ o- j
  21.             break" t5 d9 F- ^. ^! j+ ]7 V: m
  22.         else:/ @  s( v9 N. C, F" {
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址% i' N3 O- a0 b6 @
  24.     if failed:0 Q: Q8 f+ j3 g+ L' B
  25.         suffix = '.part'
    ) }5 y6 p. M, T% i6 g
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'
    - t5 d) B; b2 B; K' ~

  27. % p# }. [9 r+ p# o4 Z  ?
  28. def isfinished(part) : # 判断某区块是否下载完成+ H, p) v, m8 T  `* d0 k7 p" @$ G# E- @3 \
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断
    " m7 X: O1 L7 Z2 i# i
  30.         return True4 F6 J% e+ }  v" T  c/ q$ U
  31.     else:
    0 ]) N, `# y1 X- b! i6 x$ w
  32.         return False
    ( Q& D. T0 k- Y% j, v  Y0 X

  33. % S/ a- |! S5 i% O
  34. def downloadloop(): # 循环检测未下完的区块
    ) p6 N, a7 F- ]
  35.     finished = 0
    # r" A+ t6 l& O1 O) G
  36.     while not finished:
    % ~" W' Q5 ^* _& j; @8 Y% B
  37.         nf = [] # 没下完的区块
    8 n  E, p" H/ {4 I6 i5 W
  38.         for part in parts:
    + |$ a! X  L* H1 e' ^; M
  39.             if not isfinished(part):# |4 c3 k, A- r. l& j( C
  40.                 nf.append(part)
    : x/ \1 t' B) Q% A) d. D" o
  41.         finished = not nf
    / Y9 z; `! o; `  g* A0 a9 o' H! V
  42.         for part in nf:
    + _: m+ \) ]5 a6 D
  43.             download(part)
    0 f8 l4 P, X5 p2 N0 |3 M+ J# Z
复制代码

: {8 z/ _3 ^- G) F- F' e% t4 f4 O) P8 A* K3 I, X" O3 d
III. 高速下载网页的小技巧0 ^3 N: c) E9 f& |8 y
Python里面有三个库都可以用来下载网页:urllib2、urllib3和requests。* K& O( @" ^' }* _: t3 ?
其中urllib2是Python原生的,urllib3和requests为第三方库。
# Z$ Y! D! k( \; c" C- o6 |8 f3 T(似乎Python3已经把urllib3收编为正规军了)1 N/ p  e0 X" Y2 {
这三个库有什么区别呢?
. F7 v8 ^4 j8 J3 H6 |5 L' H形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。: N) R4 W; \( M4 B
再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,
7 O5 q% s: L* `% f9 _6 @所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。
+ i# N/ n0 h: \  z但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。; G+ o/ F6 u& e1 L8 K2 e
这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,
% W/ C  E) w% `. P, h通吃一切网站。, p( o4 y: D) R1 o  `" W
所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。
0 Q, y$ b9 `! N: Q+ D5 j, E1 |, `这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:1 y; u" O$ R" s+ p. e
http://urllib3.readthedocs.org/en/latest/
) R! L" {' G" R' @: ghttp://docs.python-requests.org/en/latest/
. u& \2 J; ]' h5 S- b! j$ g1 z

  1. 9 i2 \6 l7 k7 ~8 p
  2. #urllib2) R$ ?4 ~4 a( ^& U( ?2 v! Q
  3. import urllib2( p4 b9 g8 k6 S) \! ^: R
  4. def getpage(url):
    / g% m3 G& O; X1 h; c3 ^0 ^' d0 y' J
  5.     req = urllib2.Request(url)8 B; D9 N: Z# O8 W; q! P& b/ {$ E. N  D; n
  6.     response = urllib2.urlopen(req), t3 h+ {8 m- {9 N/ J2 f2 g
  7.     page = response.read()
      j/ F5 j! q6 O% C9 P

  8. 6 K3 O' o: g0 g) D6 D: B- y# E, i
  9. #urllib3' E" Y3 i* q* w% U4 W: M- D
  10. from urllib3 import PoolManager3 p+ g" Y7 Z! N
  11. http = PoolManager()
    ( j$ \7 J: l5 ?# }
  12. def getpage(http, url):5 ]. `8 g( u% y
  13.     r = http.request('GET', url)
    4 U2 S) f( n1 T9 Y- B! q- Z
  14.     if r.status == 200:
    / j/ X1 b2 K* u
  15.         return r.data0 v7 ]/ N2 j6 h% w
  16.     else:2 P, S/ K, N/ A
  17.         return None
    5 R: H+ E; J# J7 e% y

  18. 8 ~% I* f) r1 j8 S- j3 v
  19. #requests
    ; D) D% {) P  W9 Y
  20. import requests
    , H2 ~! P. W; a  P% I% X
  21. session = requests.Session()
    2 u: L6 M$ T" k9 N& t' U
  22. def getpage(session, url):1 V2 p0 q9 a9 @0 s
  23.     r = session.get(url, timeout=10)
    / Q% h; `/ {6 T: k
  24.     if r.status == 200:9 D% Z. n; Z1 ~% Q+ k
  25.         return r.content
    ! q; L8 \8 a. s: E1 M2 O: J  L- P
  26.     else:6 I! \- B1 _. U8 i/ n- z( x
  27.         return None
    9 y, S4 ~) k8 g, R0 d
复制代码

5 y5 ]9 [% a2 U& `- D# s四、后期制作4 l5 T8 n5 G$ q& u  S
1、文本处理,是个特征识别问题。# @! t$ F5 N! |- U9 f1 x! D3 I
本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。
" G) H  x6 I# D4 ]1 J+ |- y当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)
, ^- ?  Q7 s6 l& m% |( D. H都涉及到特征识别问题。5 s3 @3 H9 ~  Y* t5 Y
相比这些高难度动作,文本处理算是比较简单、基础。* p( p; G3 K; N0 L
Python里常用的文本处理技术:正则表达式、BeatifulSoup、lxml
, m5 X. V- X- m# }* {9 e  W1 ]  \正则表达式非常强大,但没法处理递归嵌套的标签型数据% k# _& _4 x" Q4 J& L( \5 ~) O
(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);
9 L" [( Z+ j* B7 F- K0 W/ F. kBeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。( P, k( G6 e- A, W
所以常常要结合使用。
% [/ X. g4 o0 @& X这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。
# x* F4 H/ F% A8 k5 S* Q! ~2 x1 D. ^* d" W, E7 n/ g
2、排版: U$ F2 Y) N* x% q, p1 r2 f
HTML、CSS的基础知识:+ |4 s+ q/ J- E% X: |8 M
http://www.w3school.com.cn/html/index.asp
, b8 X7 Y7 ^& x; F& r8 P2 {http://www.w3school.com.cn/css/index.asp
* i- I3 a& z$ k1 Q% fhttp://www.w3school.com.cn/css3/index.asp- `- _) @& m5 w7 L# ^6 j
非常系统、非常全面。  O1 O5 W& r; b1 l
排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。, o! Q4 ~3 J8 r: p0 H9 ?
0 ?" c, E0 o( V
五、结语
* t/ n5 ^8 x" \; {4 V1 u花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。
* {) r  l, q  V- n+ _所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——
+ a' |( b2 F& \2 `1 E- t大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。. k$ P- _- W" p; @8 f* s
4 t' D: d4 b" S5 w7 v3 h) C
打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。% w5 A- L/ n2 X$ K, b
$ m7 X8 G& e. E/ ?: U$ O
只是拜托不要打扰别人,真想要就自己动手。
) a1 `3 k2 Z1 y0 \1 Y. H7 n尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。
* O* {" {; k8 V# L  }# \水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。* {4 e' {4 L. R
虽然每个人都觉得自己至高无上,应当受到别人重视,
% X# D* u7 y9 \- q; J( h其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰1 L9 A" B" C8 ?% W* s
! Q- T- r: [+ n3 L! H
+ u, Q% o1 K* Y. ?  U
========
& I8 q8 N/ O! d) j! z& _六、拾遗
( N! g  }; `8 t关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类
1 \. e$ ]& C) n( I/ T确实如此
5 O% @" B- N3 g0 x不过这里只是举例而已,不用太较真啦
* Q' n. Q9 a/ c  V3 m实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏8 {- J2 m$ p- L1 p# |4 h% M3 L
这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。
$ m) i1 l4 ?1 C: y2 }# o即,
9 Y. q4 K7 O- r* J. ~, {3 T第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)
( T. q! p: B6 p/ ~  n3 i/ }第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)
/ P5 H) S9 ^, j第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作4 W- L6 |+ p8 m$ i5 p
。。。
  k( k+ J# L6 ]1 c+ K, w1 V* e; S直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空)
- S7 E5 a3 \& Q最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。* J2 s( w1 Y: f
形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。' N1 V" q) q4 T3 l" }
因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。* m& K) k9 R3 I% V/ F$ O

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:41
5 I+ ~- O9 Z- G7 X感谢楼主分享知识和经验。  D! {+ j: o  _2 H% q" x

0 y+ N- x5 C- N每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...
5 D4 j2 S( T4 Y7 [& r4 m4 V" Q4 @
现有的mdx词典,其实足够绝大多数人用一辈子的了
  {- J% S! q2 c6 q7 {$ k* u- I
* @: Q3 Q/ j3 _& N本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。4 w4 e5 k( n- c

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

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。
3 T5 F6 n, L, @0 R7 k+ o其实只是你没有发现而已。2 n& F* A/ @% K- o. O) g; O
ODE: http://www.oxforddictionaries.com/browse/english/) @, U, A, t  L6 Y
RHD:http://dictionary.reference.com/list/a/
8 m- ~  b  {. m: z2 _" \+ Z# o3 `CALD:http://dictionary.cambridge.org/browse/learner-english/
& O+ k1 \8 N' C- U% e- v. x8 f7 H/ T9 D- a3 c% U0 f
如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。
( f) h9 j7 B; I( p以第二个为例:3 D- M4 ?& V, S0 y
inurl:browse | inurl:list site:dictionary.reference.com9 E$ @1 p7 U. W: L6 y
9 W: k& D9 }) a% D$ B
PS:最近才发现这里,发现资料很多啊。
: x' n4 e& N' }

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧
! ?- ?4 E& J+ `+ _: a4 ?3 x6 B/ Z/ t4 [/ A+ ?4 w- |$ D7 t& ]7 f
假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改
! {5 D; G5 j; C1 G4 R2 K, ^% H或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下
' _/ h! g  a+ Q( J5 t5 D* v/ Z结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。
! ~' q" o2 R7 r% m这里有个比较省时省力的小技巧,可以快速定位到想找的地方0 @/ z; t. d( G0 F  b
6 ]& q4 I8 W, H8 z' q' ?6 x- Z, I
1、Goldendict里,在想修改的地方点右键,有个“审查元素”:
4 R; }7 ~: U" C; H% V! l$ U# u, J; Y1 E3 a1 t
& k0 I0 q7 j2 p) r/ D
2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事' r( O' ^- k+ u8 L1 L7 a
+ F# J  e+ m- S& `: D$ K6 L

3 b- S; o' D" Z6 f1 {$ Z3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方$ Z: x. _2 d# k: D. `

4 F  y! [/ _, t% f0 W
2 n& q& m, x; z! \收工

该用户从未签到

发表于 2014-10-24 18:41:00 | 显示全部楼层
$ b" T) c" r6 S% ^/ U, w

( L6 J1 {, S3 \ # }( J& |- w7 I0 T$ A

/ Q; j2 u5 o* H) X2 X感谢楼主分享知识和经验。5 \6 X  t1 `9 e: z3 }
5 s- `; n6 j6 _; D  F' |& c/ i2 l
每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。
( y% |! ]) J! ^" C7 ~' R) O
! v( H! f. M3 r! Z% e; F3 z1 g* v私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。
- z4 s5 `2 f  v- s7 n0 I- q; A! o
) ?8 f! e; c  @+ p3 C6 {但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。4 N) u5 T: v0 R/ v& f: K$ v' S

$ u" p7 u8 `9 I0 k除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。2 J0 G0 Q1 i( C: P/ n8 Q

6 {7 z; ?! U# R4 c) ?- `# \
) K5 X* j& G: Q* J- x8 J
  Q3 g; v( E* J- U9 h7 }. p
& H' q* r! J' ^3 M/ a! b* G4 i; E! |

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件+ Y" `; L0 D+ F+ W1 _* c/ @
  • EmEditor
  • Beyond compare
    6 J- d  i6 X) q; X1 S: j5 f9 Z
" _- ~* ]- l% F2 h
( P! `2 Q; m+ n$ F: [8 _! o
前者用于编辑,后者用于差分比较
2 W$ l4 |" r- o+ h, [处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

发表于 2016-6-8 07:41:03 | 显示全部楼层
bt4baidu 发表于 2014-10-25 21:01
* R) A: s: K# `现有的mdx词典,其实足够绝大多数人用一辈子的了+ H, s% d; I' J: B& o

$ g  T! b' Y. H; j; l0 D9 P本人前段时间制作、收集了不少,经过一段时间的比较 ...
$ A6 s2 U0 k0 H4 j& @1 c4 i7 k; M
肺腑之言。

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考
' q/ B  t' J) _* E3 s+ [% U) d6 c9 v8 N
网页设计中最常用的字体有哪些?(中文和英文)9 j* d, o% w8 \5 z1 e6 n, {4 w
http://www.zhihu.com/question/19680724! @0 W# O4 c7 g/ o9 q  t3 e- H
8 {- q& }; Y' r( g& }5 ~0 ^0 T
本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode
! _3 T" a  h1 M* Q5 s这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全
- Y# ~% N" q. }% Q$ c2 i6 p另外Open Sans字体也挺漂亮; B' F0 I& K; H4 o& e4 I# ^
  • 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
    ! N) [, w. A( u  j% ^' C最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...
    ( \5 M0 n( s9 n5 T
    感觉找到适合自己的问题好少啊/ K* u' W8 J7 t4 f* Y: P
    这个适合的话感觉是兴趣和难度# |0 y$ `/ b3 s* W
    想请教一下楼主是怎么处理这些问题的呢' o. ^; R8 R- P3 a
    还有种不系统的感觉
  • 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 编辑 . s$ Q" E* ~" V& {/ ^2 ~* Y

    $ G1 I% }+ ]7 l( J- 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 编辑 % Y( K! Q' n# b' [* x* L
    ( h2 R( l- Y, `( G+ L4 i9 J. A
    java和.net就是个垃圾,我懒得提而已
    ! R7 g( F* S2 L  j8 Y在Linus这样的大神眼里,连C++都是垃圾:0 _. i, x, O9 J3 R0 L7 E
    http://www.csdn.net/article/a/2010-06-12/218785( c8 d- X7 n% E$ S& x6 G
    $ w4 g1 |( N" ~: R
    如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。, _2 y9 R3 B# o  t3 b2 |- N, v
    - U5 w( H0 E, z9 L
    不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。8 }1 f5 t% d2 |+ X2 T7 M
    我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。8 d( @9 O( f& C8 E
    这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。
    3 i7 y; O& K$ e0 y. I: C# Y/ X3 |$ R4 a不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。
    * B1 t& x3 w% d" Y+ e5 @! @为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?
    & M: O8 n1 O6 z& X+ H因为垃圾代码太多了。- H0 C$ ]; f+ d+ }* k
    5 x& @! u) }6 @: B: o- d& U
    " R( Q) |% F. ^' G

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑
    $ A* u" t0 Z: n; m1 s/ S* J5 z, t) \2 R: S6 ]! N

    - ^, _7 D1 ]" F) Z5 O8 b5 p, `) \算了,道不同不相为交流
    : `9 V. t! s- ^* H/ U  ~  |想起某个梗
    3 l4 @  ]- u9 e- x& S( p程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!
    1 D" Y- a2 Y6 Z# h6 W0 I* |' S) _+ C0 t' u2 ]! h, O# I5 s
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。
    " }0 W+ t; w7 L: V# Z% {6 x- l: y% }! m0 B3 A+ @' g
    另外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:072 `7 C( d8 Q. J5 X0 N. }
    算了,道不同不相为交流# A7 z% q' Q, R) a3 P; c
    想起某个梗
    & l% h, R( H9 i1 U! D程序员眼中的编程语言

    + F" ~: O& I9 h8 O不同的语言适用于不同的人群:
    . G( x, U: j/ X- z8 D7 p  t7 M如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。6 b9 n& Z3 q( j
    如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。3 D) q! f. @4 D6 }. a& J% H
    至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。
    7 n; B" I! X# x: O8 I6 Z1 @% K% [! P8 x. S
    编程语言的口水仗永远也打不完,不争了
    ' A3 u5 Z  `9 F5 j

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:352 d+ Y) E+ U0 Z6 N6 U3 q- d4 v  L# w
    不赞成多线程抓网站,但是好贴子要支持!
    7 u6 [% g- ~7 r3 N8 `
    : w( p) |: L7 c' x自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...
      b8 M- l5 X; `' _
    下载软件?推荐一款?
    : i  i* N3 G! I; g最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;! L! i! i) G( @8 a9 X
    现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?6 h7 e! d: m* A% a) @/ c
    比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。
    5 x, U6 j* C9 S除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。
    ! D4 I8 D' l- Q9 S0 e: c目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。
    2 n7 [" c# p8 @. d/ G
    . H4 Z5 A/ I2 G+ F' V; V. X$ i% A至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。$ ~# r7 z' `6 f9 P0 T
    对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,2 K" R3 _: M: {9 x( j" K
    目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。
    5 g. I8 t. b6 ~1 ?2 J2 z

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:
    ! n, L" M% G2 d4 S2 m& B# Q& C随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。1 B& Q6 q% o4 k# Z% H2 J* X2 M4 e& w. \
    未来会出现一个新的行业:私人计算机管家。
    ' p" S" [4 O: {  ?) \专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。* v) U( V' @1 Z) p- M$ g
    但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:29
    $ E* O! e- d' h2 N7 A' |% S下载软件?推荐一款?# @. @! d+ V5 H: z4 p) f" W. Z
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    5 h0 Z2 H% t& r7 s现在99.999% ...

    : s0 ?0 G1 ^+ `+ }用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。" Z# u/ u) o6 P. U9 _

    + }0 m8 Y, K! Q% B6 i' \; y( E: b十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。9 [& U- ?0 g" ^* L- u
    ! G. V$ U# @; f) Q9 v0 o
    用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。
    ) X* E( A* q, t0 o/ x$ w. y) r  s) D0 ^3 x; v
    我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
    大熊部落 发表于 2014-10-21 16:18/ [0 i, @# I' c* U9 i) F: ?2 E' O
    用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...

    ! X( k7 R6 B1 v: E1 w/ M我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件
    4 V* t* T3 u! [; {, W  E* t; v& F0 Q) _) r# z7 s/ e
    下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。

    # t% s  F, ?  U7 C) k8 q推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

    该用户从未签到

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

    - V. O  W/ `" @最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差
    6 x/ i" M; c/ D3 m- K计算机是用会的,不是学会的;; a1 z& U- ]6 |) g; L
    程序是调试出来的,不是写出来的
    . ^: e! `9 S3 ?2 f0 `  R  H' i' x) i. @( B1 Y3 N! k
    既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。, g( m* x+ V! g* y
    你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

    该用户从未签到

    发表于 2014-10-22 21:25:59 | 显示全部楼层
    bt4baidu 发表于 2014-10-22 20:21
    8 j. L, `1 D$ _0 y$ y最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...

    8 W# X, @# c" Q% d) {+ G5 `多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。
    6 R/ g& j6 \8 ^  y! D; r4 v. T+ g- X0 f& n- q$ O0 J4 t
    我的一点网络小技术是很久以前在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-7-16 21:59 , Processed in 0.029481 second(s), 27 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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