掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 50954|回复: 148

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

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑 1 P0 R7 Q0 G! r* A

: C; C7 d% w; `: Y1 z这篇文章主要是给计算机小白和初学者扫盲。& \3 ?0 a3 m4 I  y1 X) ^' Y
本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。6 l& C9 [3 ~$ f9 h7 e& H8 ~; }
只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。
" f2 v- I3 o' r$ E; f, q, G/ `* X# z1 z) k: m7 h/ E' j  K
一、计算机的两个终极哲学问题
$ j; P" H  {# {; Y1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。1 o' m5 P+ f- m8 n7 f
图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:9 X0 K: O4 t4 s% Q& j# V2 X
设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;* M$ m) r4 J# o+ }7 @
机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。
/ f  j$ `2 z1 [2 h5 \. _0 l方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。8 n8 K4 Q4 K8 f6 N- S3 Z% V
“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。
, `  ~+ e1 L$ Q( n2 M% E3 N' W1 M) G
那么要写出程序,立即就会发现不得不解决两个问题:
. U/ p7 ^9 Z7 M' E" D( d" Z1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址8 P' c5 r; C9 L+ ]. f: T( G
2、怎么把两种方格区分开?也就是特征识别' x" B+ G- H. ]! ~5 Z) Q! C, U( j
这两个问题,就是计算机的终极哲学问题。- m9 B0 I7 e- h6 X7 H) a
理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。
0 l+ u1 U/ L( @( T6 U2 X6 @下面的讲解也会以这两个问题为核心展开。# c. Z: L& q( I/ g0 s; x
9 {0 }7 [$ V9 s9 \: Y0 }
BTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,# x1 M+ C8 ~! D. r3 E: Q" w
——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。
% x. L4 r+ g# m3 J( C) t. I所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。$ m" a  H6 @* r7 [8 n5 l
前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,/ U$ _% S+ c- e( [( Q7 O) x5 P4 a
而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。$ ]% S. o' ~, J* H1 w- V* F" D
具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。
5 }. h( p% o, p5 f1 C# l$ g
3 j. g) _# ~9 \, h# R0 V不要觉得自己上学时学的不是这个,or文科生,就不行。
2 \) @0 u7 L# Q) g% a江民杀毒软件大家想必都听说过。0 \+ ]5 ~7 Z# T' p7 F
创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。. f3 y' x& D8 |2 E( w6 E  x
咱不奢望成为专家,写写程序总还是可以的吧?7 c2 _$ c* Z; ?  H+ C" h; a
  [+ C- ~3 B, C0 p9 M1 g' t
二、采用何种编程语言# n* r+ x- Q, `# l9 b8 H- S
上面已经说过,存放、读取、组织、区分数据是编程的核心问题。
- @: @) p( m: @/ u% j, p" [+ W显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。" z7 _+ f9 L* n; h" s1 P
抓网站,恐怕没有哪种语言比Python更方便。
3 t5 G' |; g- M4 P- r当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,
  F! j: Z3 g0 D9 n- z9 x# \& `* ?计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,1 u/ y3 m: |% S6 @
没有慧根就别吃这碗饭。6 c' V* Z2 G& ?- ~. m
8 ^$ C9 N7 R0 {7 Z; R) N" |
三、网站抓取技术
0 G* I6 d3 B/ a% y5 b* S1、下载某一个网页,提取其内容
7 _2 Z2 O- S! A5 U以前写过一篇,就不重复了。参考:+ q6 I/ B! ], U! n$ O4 [* ?
用一个简单的例子讲讲怎样从网站上扒数据
/ Y/ c5 D7 I% \: n  b
1 x9 _. x, D0 u" e- K2、寻址问题0 E. y. K& F$ Z  N  l( e
下载网页,自然首先要知道网址,也就是东西放在哪儿。
( Z# q& l/ x. q7 V- _( D' }6 B  ]如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。( x8 o( n: \' \# m3 \; R
但是大部分在线词典,到底收了多少单词,事先是完全不知道的,
. v& N7 I9 t* D1 T要把单词弄全,就要想办法得到每个单词的网址。
* z6 R" a* y" E9 v2 ^7 p总结各主流词典网站,大概可以分为这么几类:
4 D& o: N6 @; {4 M0 c* k, I# `  JI. 事先有单词总表* p+ E0 ?. ?' N, n
比如http://www.vocabulary.com就是这种类型。2 ~3 y/ h  D. z5 D) d( l
它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。
6 k" g& I+ f' `5 k/ |
% {0 _7 S' r3 {, q& PII. 网站有索引页面- p1 Q. M5 h+ R+ q) _  b  I
如:" H8 O5 Q  n) k& ]" @8 _" a
OALD(http://www.oxfordlearnersdictionaries.com/. H9 S8 a! h) c  V, Z3 c- i5 E
它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/
6 n* z- I; ~! _* ~; qLDOCE(http://global.longmandictionaries.com/
+ T) t6 D1 m$ J: s' e* o! [9 [. P采用框架结构,左侧边栏就是索引页5 P, v) w$ \; J. a& @! K% v" ^. m, K
MWC(http://www.merriam-webster.com
; N2 f* D/ e% N7 ^* z. N! Z2 i索引页在 http://www.merriam-webster.com/browse/dictionary/* \( N; k" N6 Z
等等/ ?, w* a, i  K# q8 m' w% K
这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。
2 n6 [5 `2 m" x' S

  1. ( d& F8 A( q7 T( M
  2. urls = []
    ; W+ v* k8 k7 F+ @8 ~& E& }
  3. for someindex in indexs: # 循环所有索引页
    . \* h& A% _# C) n  u) v$ I, }
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    0 d- Y; B3 g: K+ c
  5.     browsepage = getpage(browseurl) # 下载索引页面6 Y9 M/ U1 o! W5 e; ^5 b+ f% ]# Y8 H
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域: L# h2 m" k( w7 I0 n1 j1 x
  7.     bs = BeautifulSoup(browsepage, parse_only=target)
    " E  ?4 [3 f) r6 D" }
  8.     if bs:' R6 n1 H, G2 T3 a" P2 O
  9.         for a in bs.find_all('a'):
    # E9 d; y5 G1 i
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接% Z# k9 Y9 w3 S2 ]
  11. 然后:
    1 B8 t: K( T# |# v  E# _5 r
  12. for url in urls: # 循环所有单词' J$ s: J4 J( c: f  P/ ?
  13.     wordpage = getpage(url) # 下载单词页面
    " R( u6 c& U: N. U
复制代码

6 k2 O0 E, v. a! c5 f# @. e
1 w- [1 J% w/ t0 |$ A2 H3 U% ^III. 索引页和单词释义一体型网站
- w7 ?3 z/ f& |1 }. d  ?( r1 }如:Online Etymology(http://www.etymonline.com/
8 u( c$ u2 v' b! I和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可
/ o, B) M- ^6 @$ Q0 b  `$ x) U

  1. " k* A" P$ |$ g1 ]
  2. for someindex in indexs: # 循环所有索引页0 ~9 R  i2 [0 h  j% N
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex])) j6 W- e) ^( |, o$ V) i
  4.     page = getpage(browseurl) # 下载页面
    3 y& O( b, P- n8 o; G9 Y- C
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域* n7 q: d5 b4 d
  6.     bs = BeautifulSoup(page, parse_only=target)
      G3 R) e/ f* K
  7.     for tag in bs.find_all(target): # 循环抠出单词- M) e2 p6 }! P% d
  8.         worddefine = getworddefine(tag)
    7 K# Y3 m7 j4 k
复制代码
5 \1 H# o8 L" s$ |1 Z

* s) Q8 b# A& c% k) AIV. 片断索引型网站0 |( e8 f8 D+ j1 I) h
如:
2 n' T& c/ S( t. \/ `1 \# mODE(http://www.oxforddictionaries.com/
# l% s3 m3 \. i' j每查一个单词,右侧边栏有个Nearby words; q. G. \4 V9 Z( M: W
RHD(http://dictionary.reference.com/
5 E  L& D9 a) l9 O7 Y: @  h右侧边栏有Nearby words$ C& _8 m# w/ A  X
CALD(http://dictionary.cambridge.org/
3 e; i. _! ~7 p8 X1 B7 l在页面的最下面有个Browse栏,给出前后相邻的单词
9 j: `. |; G& j+ S( x这类网站没有总索引,只好利用它的Nearby栏。
+ v% B7 W& S" s+ X2 `思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,2 `; ]+ m( {1 ^# ~. C7 o3 p8 |; E/ M
每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)
6 L+ b1 I, L" k) H& n& e" r
  1. ) n$ W& s( ~  Q# F' m, K
  2. cur = 'a'
    , P% B' d) C: ]1 }0 S
  3. end = 'z'
    / j/ C; G6 C* K' c' s
  4. nexturl = ''.join(['http://somewebsite.com/', cur])
    - O( D8 ]' w1 t3 y' g: n/ P1 L
  5. while cur!=end and nexturl:
    ; W9 _, j' _% }6 i
  6.     page = getpage(nexturl) # 下载单词页面, K5 @6 H0 O9 r1 X7 R) h
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接5 g: M. d. [0 f5 @! Z/ q7 W
复制代码
" _$ B0 R& a: [9 K4 y( o$ S

% h& M0 H- K. @; |4 ?) HV. 完全没有任何索引,那就没法子了
2 ?' n( C2 Z0 W4 x3 z当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理) `( Z$ l# s& h' i4 U4 A2 z
理论上也是可以的,就是效率差一点;  l0 n" ]% X5 h/ Z# S: l
另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。# }& ~! W8 o- g# f& q" F
+ n9 t; H2 S1 s5 Y( R* p& G
3、提高下载效率1 }  D0 [) o: O6 ~/ r( _
I. 多进程
, Q4 j: t0 d! R* r- M: n上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。' `- U: T) J! a/ Q" o" b( D" F
实际抓网站时,这么做效率显然是非常低的。- L3 i6 @8 n8 H; C
假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,
! h7 z1 ~/ S/ E有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。1 D. F3 n* a/ B9 M
假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?6 f9 ]# W7 w* R1 J- @: H1 r# _3 O* \6 y
要速战速决,就得开多进程。6 F7 _. p+ C, W
同样十万个单词,分成25个进程下,也就是28/25=1个多小时。
1 P7 \% }( W+ W& |4 p7 x! Q再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。
$ j1 l. G  @  ^* U% p9 @在Python里开多进程,同样十分简单,
& P- R( Z" [. C2 j* g# O4 J

  1. - M+ \  m* N2 D
  2. from multiprocessing import Pool
      p" X% v: ]$ s" U( z  J! z
  3. pool = Pool(25) # 开25个进程
    . H: Q2 {; n5 C: Y" D2 ^" u
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数9 R6 e: u& P( V- e; V' @
复制代码

$ R2 ^$ L( c' V/ \" p. {/ \/ j这就搞定了。% T( g0 s" Y% R" X/ I
( @5 @4 R' g& G7 R
对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,
; u) O' b3 x( Y6 E/ q2 M! {2 [关于IV.,事先没有单词总表,就只好采用区间的概念,
+ z. }' W* B. y5 _比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载
: n6 S6 k; R$ }% L) G4 f+ D$ z# D  f6 J/ i& s
初学编程的人,一碰到进程、线程,常常有种畏惧感,
- L* \1 |: f) ?看到同步锁、共享内存、信号量什么的顿时觉得头大。
! D5 m& q, U( s- u其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,
% ?  S/ G, T' |+ d其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。# B7 p  B1 J" b, e* K4 }, x% l& d9 E

7 U7 @, R2 }2 q/ r) uII. 断点续传
4 C4 P# D7 u6 ^( w" Q0 Y& T事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。- ^& c! W' b4 g; p8 f
所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;
3 G1 t0 R2 ?: ^  h" `: K/ [即便无法自行恢复,也得容易手工处理,不然可有的烦了。
' B+ [) Y! }8 H; n& {这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下," ]$ ~' `- e& S" z- y7 a5 b, Q- f
直到所有区块下完。$ y# j/ t) ^( M
  1. $ J7 t0 t5 }  V: I
  2. def fetch_a_word(part, word, url, data): # 下载一个单词
    9 k! W" B6 D( L5 k
  3.     word_define, failed = get_a_word_from_website(word, url)
    + s/ `, {$ F% N; F7 n
  4.     if failed:/ ]; l0 u: \  V! R* g( I# W: t
  5.         dump_failed_word(part) # 输出下载失败的单词及网址
    3 L; L. i, a# |- m, ^; P; R
  6.         return False0 O5 Z( ^2 B! B* y
  7.     else:
    / K" {9 v1 w9 G$ e, O7 Q
  8.         data.append(word_define) # 保存下载成功的单词数据7 T) a( c6 w, H
  9.         return True
    3 U& n! X0 z/ s6 g3 W' C" @: l

  10. " k# e; F8 K, k4 @+ v) E0 [% @) n9 ?
  11. def download(part): # 下载一个区块
    ( I# {7 c: b) |- m  _
  12.     words = getwordlist(part) # 读取单词总表. Q$ g+ k. p* \$ P
  13.     if hasfailed(part):* B- h( b1 M8 O
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址
    % V* F* u/ [7 q  m5 E/ n8 z, P
  15.     else:$ \5 }  P0 a, u! A2 j
  16.         word, url = words[0] # 首次从头下载' r  u' K" M' b9 ?5 o
  17.     data = [] # 用来存放单词定义
    4 }8 D( a3 E* m7 x- Y
  18.     while not_end(words): # 循环下载9 ~+ E* n+ _: v- r! C9 x5 h
  19.         if not fetch_a_word(part, word, url, data):
    ' x! j/ s$ \, ~: P
  20.             failed = True
    4 g. f7 e0 a( M  A9 \- p
  21.             break
    / L) q% i: \; B" A& x1 o! k8 I
  22.         else:
    8 x' k7 ]  V  R' d* j. J
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址
    ( K  D! {) O2 ^. G% n+ S
  24.     if failed:1 M5 c/ J3 ~/ {7 a
  25.         suffix = '.part'
    3 }- t# `( W" f- e3 R0 r
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'
    9 |0 l, Z  I1 d' r. p; l6 }

  27. 3 Q+ h; ]3 S4 m' w  x4 D
  28. def isfinished(part) : # 判断某区块是否下载完成; d+ q9 t7 c  K2 \7 n3 _7 m& z: d
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断
    % a% E1 M7 |6 F$ T2 ]9 ~' t9 B
  30.         return True
    / Y1 C7 q! t, `+ F
  31.     else:
    ! L$ ^  u) e& `
  32.         return False' {. i! f% L4 t

  33. " ~% S" a% d+ s* h9 |
  34. def downloadloop(): # 循环检测未下完的区块
    & t; S" Y7 s  Z! [' n
  35.     finished = 0
    ) G  w. w. U: V% K" R" b
  36.     while not finished:+ R5 h# E; G- O, [
  37.         nf = [] # 没下完的区块
    ) w, X* a0 A/ V+ c) b
  38.         for part in parts:
    ) _% c. C' }# x$ M4 F
  39.             if not isfinished(part):
    ' H, ~3 F9 r, b6 N6 z1 }( {
  40.                 nf.append(part)
    6 X8 U6 R. J4 u; }/ \
  41.         finished = not nf
    . @! v5 g9 R: B) p) m+ Z
  42.         for part in nf:% R. C/ p8 q1 c/ D; K9 `+ O
  43.             download(part)
    + N; f9 R( P7 _1 X& Q$ p; `! m
复制代码

; m* J$ R: E# a, ^. X5 d% T! i* y. U! G% L+ o, u7 m; M7 ^1 g
III. 高速下载网页的小技巧
: _+ G. l# |4 p1 }Python里面有三个库都可以用来下载网页:urllib2、urllib3和requests。
* T  P& \9 t3 T) F7 H' Z5 s其中urllib2是Python原生的,urllib3和requests为第三方库。+ J* E% ?6 ]' V; U& M( t
(似乎Python3已经把urllib3收编为正规军了)" {+ b1 q# v; _, b
这三个库有什么区别呢?! \6 s* _! Y" G
形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。4 X: s+ E4 a7 P
再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,
5 _9 k4 ~5 r2 T: d, F1 ?$ X  H所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。
/ s! [: b3 _! v# a2 }但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。* ~4 V$ F( s: z2 f* d
这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,( n4 j& w1 C% k: t$ j
通吃一切网站。
- ^, e# p  K" G' x2 {所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。
) t4 n- V* A, n6 d) n5 r- d  h这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:
" P. t; B, j% D2 F. w7 \http://urllib3.readthedocs.org/en/latest/
4 }# L4 J  W1 n5 Yhttp://docs.python-requests.org/en/latest/: q+ U+ C. ]2 b+ C  w& b9 W
  1. 8 ^7 g! D" s( |( w1 q
  2. #urllib21 Z  U! G6 w0 h* S- a
  3. import urllib2
    ; i) g! f9 K; g% a* g, @; I
  4. def getpage(url):: r% n' n9 ?( j  w/ O/ {
  5.     req = urllib2.Request(url)5 @6 r7 z9 E3 B4 \
  6.     response = urllib2.urlopen(req)
    * {; {5 N+ a/ {* B
  7.     page = response.read()
    2 S0 V7 i+ q0 m9 p" E2 D) }

  8. ' w' y, s' U8 Z3 \) `1 N  S0 K, |
  9. #urllib3' s, I. I/ |3 r9 B: A1 E) j& @
  10. from urllib3 import PoolManager
    $ p. X* i  ]9 K+ k# t9 q3 w* I. w
  11. http = PoolManager()
    3 o; H3 E8 G* G7 j
  12. def getpage(http, url):
    + q( X3 I* h4 c& C1 C; c
  13.     r = http.request('GET', url); n/ ^$ `2 D3 g$ z- g
  14.     if r.status == 200:
    ; B2 o( O9 `) j% T/ ?9 z
  15.         return r.data+ Y$ n* `! k( v; q2 ~
  16.     else:
    - n5 p5 V7 X0 r
  17.         return None
    / F: G2 D7 A% n- {
  18. 1 O' E2 D7 L# N4 y0 p- R
  19. #requests
    # s6 Q( \  q1 H: z
  20. import requests
    : ?2 S5 Q' N+ u* G: `4 q: a: i
  21. session = requests.Session()  Z3 f( m8 Z9 F" E
  22. def getpage(session, url):
    3 k2 O6 }2 l) y2 i6 r
  23.     r = session.get(url, timeout=10): V% ]6 [: A$ P5 b' `
  24.     if r.status == 200:8 |5 o# q* h2 o# s! ^: o
  25.         return r.content
    - L* |/ e1 t! x1 j9 X
  26.     else:' g+ ]$ y4 d: i' d* q
  27.         return None0 J5 y3 C0 v+ {8 o( L( L4 d% E
复制代码

) |1 C8 }) J4 }" M+ N  w& q四、后期制作
, ], R  s# `& R  L1、文本处理,是个特征识别问题。
( \* U" v8 C3 ?. a2 M9 y0 P/ A本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。
, s" _7 D' H, Q8 g当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)
& L9 E# C% p6 u* V2 P) u: W" L都涉及到特征识别问题。; B3 ^; `  C( d  a+ E1 S1 w
相比这些高难度动作,文本处理算是比较简单、基础。
- _1 Y5 Y) e! ~5 VPython里常用的文本处理技术:正则表达式、BeatifulSoup、lxml
8 e1 N& P, V3 e. B/ @2 z正则表达式非常强大,但没法处理递归嵌套的标签型数据' l2 ^  m+ G) p/ I$ I- X* Z; z
(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);
( `  g+ t( c2 Q7 ~4 {: l8 e- ^BeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。
8 X4 Q! C  @) n6 b所以常常要结合使用。
7 F: F7 v  ~! t这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。% B+ N: L+ ]& x; g
+ {, f, ]3 p) t0 o1 P3 ~2 t
2、排版4 Z2 r% [' W- j+ R( }" g# M2 z
HTML、CSS的基础知识:
$ q, c- w5 s, j, X$ Ghttp://www.w3school.com.cn/html/index.asp
# D2 S% b2 D- g7 v0 N' y0 m5 _9 R$ nhttp://www.w3school.com.cn/css/index.asp( m0 d* |4 M# y! Z
http://www.w3school.com.cn/css3/index.asp
' x+ J1 ]$ [, I9 H5 W/ ?8 r' d) C非常系统、非常全面。
* k# h9 @6 m  [# y* @, V排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。3 v) l- V( n, O

. [3 l" w5 p( m2 |: K8 K五、结语
, k; N4 C/ P6 y0 d花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。. o- U! A; w. @& B. N- x
所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——% ?$ L. _0 H# Z/ E3 T9 u
大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。
. Y/ Q/ z4 q# Z: h: u+ @3 |$ W
1 j& j0 L3 }: u* O, ?2 [打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。2 d1 [& ?  l6 m8 U: G  h7 h

5 }- U. P8 O3 a9 w0 c7 d+ ~/ ]" f只是拜托不要打扰别人,真想要就自己动手。7 o% ^$ _1 i) X5 b; f2 z  R) z/ i) b
尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。
0 i, ]! T( G5 D2 ~8 ^% C水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。( u/ j& p" Y! Z8 y1 |; t" b
虽然每个人都觉得自己至高无上,应当受到别人重视,0 ?# J! b3 M" Q6 K% x$ O' e
其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰% P4 C* h- F: X2 v0 E4 o

3 N- X0 s: m  c) o
  C3 |% o3 I( }. j- Q$ \/ a========
5 G, _5 X) f( W/ c2 P7 z六、拾遗! @( h' H. Z7 {5 R+ R) p! B
关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类
# _$ Q% q  r! h/ R$ s/ h确实如此
2 q$ Y( P- n4 S% _6 f0 \" k  F不过这里只是举例而已,不用太较真啦
* b3 v% t4 i& a4 j实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏1 p$ {5 [" X+ _. f* L1 `4 B+ q. g. y7 g
这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。
9 x" z0 u9 o( R- O0 {即,
6 w) `9 M; ^+ T6 Q3 a1 @' i第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)
+ x2 q: n, B  O. V% ?) B$ k  ^第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)
! i4 e  L: H- d- Y5 n第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作# b* ^2 c# Q, Y$ \- R
。。。
  V$ W6 b  L7 D. U7 L3 v+ L6 p直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空): z. h3 d3 o7 u
最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。7 m/ _, s% |! X, }* V$ C$ q' z
形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。# {7 R6 R  \( n
因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。3 O) p9 Y3 z9 ]

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:41
' a* [& a0 n8 u8 o6 K6 u感谢楼主分享知识和经验。; W% w5 C5 _( N5 K6 ]- ?. `+ F
/ O7 B! [/ t4 K* z. ^6 }' r3 M
每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...

, m) X9 p% _! G4 U, d8 q/ F现有的mdx词典,其实足够绝大多数人用一辈子的了: ?# l' ~( d' L$ Z% N3 E) M# }; |
4 J7 m  o' [2 a( w+ O: |
本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。
0 m  h) c0 g- X$ F
; M, Z: Q2 Z3 Q- k本人最常用的词典:" E  x/ _; G. r2 {, `- ^( {
主力阵容:VOC、ODE、WBD。4 Q; V  h* A% Q: Z/ a
三本都是中型词典,收词量均在14w上下,以本人目前的阅读面来看,还未遇到这三本里面查不到的单词、未收录的义项。据说史上掌握单词量最大的人是政治家兼散文家丘吉尔,也没超过14w。除非钻故纸堆,恐怕用到W3、SOED的机会不多。2 L$ M' F" ]/ y, z; @. e

; P# ^( @- [9 _% d, s& N4 g5 v7 ^替补阵容:LDOCE、词源、短语8in1、韦小黄&韦小绿、Garner Usage。
- K" Z+ p% H6 k" E* u7 jLDOCE用来查常用词的惯用法/搭配、语法信息;
8 t/ B) P8 r5 w/ B词源用来辅助理解、记忆单词;
5 }- ]% A2 `3 z0 X3 I) G短语8in1用来查漏网的惯用搭配、非正规用法;
* `! Y/ j; f$ s& _: [' g韦小黄/Garner Usage用来辨析/比较同义反义、正误用法;; n+ L0 j8 z+ ^& j
韦小绿用来辅助理解、记忆大词。小绿真是本好词典,有人说里面收的单词都是一辈子才能见一次的那种,其实不然。它虽然只收了1400多词,却几乎都是高频的大词。从本人的使用体验看,查得率相当高。比如最近看新闻说一种超大蜘蛛,里面有个词arachnid。别的词典只是干巴巴地说4对脚的生物之类的,只有韦小绿说了它的来源:从前有个女孩叫Arachne,编织技艺了得,把雅典娜女神给比下去了,结果激怒了女神,被她变成蜘蛛,终身织网。这种解释多有意思,看了永远忘不了。7 Z+ f  S8 {- E5 W

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

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。
8 c9 ~% h- i4 M: V) R/ `6 V$ ^其实只是你没有发现而已。
- K3 z  W: A8 x& A# S0 ]ODE: http://www.oxforddictionaries.com/browse/english/: [! N9 q% C! K+ q0 z  `
RHD:http://dictionary.reference.com/list/a/
7 H. x9 p% g: |4 f, @' ]CALD:http://dictionary.cambridge.org/browse/learner-english/
% c  b9 D2 {* K  P# e% J) T7 X3 r# Y& j: H% A
如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。0 d9 p. B, j; z( x
以第二个为例:
8 n0 r0 V3 _3 G' j, o# oinurl:browse | inurl:list site:dictionary.reference.com
/ Q/ }8 c" ~8 D+ P7 E( n, I& O
$ X& B! d/ `7 U( y/ Z. hPS:最近才发现这里,发现资料很多啊。3 a3 m# ]; {: ^6 ?0 f

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧" i. x2 k9 F! s. R  f
! _- o$ y& t% b. c+ o; r) V
假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改3 d6 ?4 ?+ N% g0 o
或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下
5 R* I& |' g' N  L. u, z; U5 k结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。
2 \4 X6 I6 T9 c7 s5 ^# G) A这里有个比较省时省力的小技巧,可以快速定位到想找的地方! v& i8 V* U7 V' F' m
/ h9 D, T; D+ m& R
1、Goldendict里,在想修改的地方点右键,有个“审查元素”:
+ f8 Y6 K. H4 f5 l  K& P  L9 c0 ]( m7 m+ d6 R
8 n9 |$ |- N7 C4 X9 F8 A
2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事# Z3 f! }. G. \3 p1 p
/ q- O. }0 H0 a% }) c9 W2 Y
, Z( g* p9 h! Q, V' D5 E' [, X; l
3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方
+ |2 N4 X: |7 s, X& m0 T4 p7 J5 i- [: V" z
/ n7 M4 s( t; T4 ]6 ]
收工

该用户从未签到

发表于 2014-10-24 18:41:00 | 显示全部楼层
! s. L4 `) W1 K- k

8 o0 v( W; A. b; D2 K1 q0 c3 K
4 O  X( J% F7 e, S* D
. z. t4 W: V( F6 R' `2 T感谢楼主分享知识和经验。5 @& E5 `$ h0 Q) i6 C
" R  z$ R7 s# K3 q. y
每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。( P- ]6 Z1 B4 V+ ~  Q% }

0 R& T0 I" f0 B. @6 g7 H' v私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。
- h, J8 @2 l2 f+ ~7 t3 {4 g- K! l1 ?# G2 h$ j/ s
但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。
, r# Y$ a# y4 Q% t9 G- O* |* o1 T8 H. T8 M2 d' ?4 ]( L
除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。) _3 W2 [) @8 R% o

  q5 |& ~; Y$ H; A5 `& Q7 U5 b7 L# U

! e; O7 g. J6 }) z7 X, P& ^, _3 F! l$ k

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件
- H  w! |4 I- }' m8 T3 h
  • EmEditor
  • Beyond compare* c6 L( c' {) C

8 @( B6 O- g2 J- Z# ^8 P0 R; Q! `, |
前者用于编辑,后者用于差分比较
# |' e- K  L( c: F3 N处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

发表于 2016-6-8 07:41:03 | 显示全部楼层
bt4baidu 发表于 2014-10-25 21:01( d8 I( \7 _4 O9 ~$ Y
现有的mdx词典,其实足够绝大多数人用一辈子的了/ W6 [8 n7 }- b, W: L9 I! Z

7 \2 u# r" `3 t" C2 s7 c" C2 V本人前段时间制作、收集了不少,经过一段时间的比较 ...
0 W, `$ n4 n# B! f4 Y
肺腑之言。

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考8 F& C  J" u% d
  ]. A0 C2 N3 C% f& j: K4 {# ~
网页设计中最常用的字体有哪些?(中文和英文)0 f) C: n; w/ b; S' P- {" j
http://www.zhihu.com/question/19680724
# L# K  K9 L3 n) Y1 B  B8 V: d0 r3 W" U
本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode
0 p$ @; _+ K3 c7 a这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全( M5 z5 e: q- x" L- T8 t
另外Open Sans字体也挺漂亮
* f# D+ }7 h* d- k
  • 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
    3 V. |) V4 z6 C0 W" C! n最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...

    0 W* z: W5 }& E1 O0 {2 m+ ^感觉找到适合自己的问题好少啊
    ! d$ u/ q. `/ M% q' H这个适合的话感觉是兴趣和难度$ E. ^  B1 U1 }$ V
    想请教一下楼主是怎么处理这些问题的呢: [9 x5 ?- k+ a- }. z4 \
    还有种不系统的感觉
  • 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 编辑
    9 n( k2 q& c, L' ]$ p8 R  H$ Z( r3 b, m4 f  I# 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 编辑 ! q6 K2 E5 b4 x* j. u

    - L0 S5 c% {" [3 X$ B* [. Ojava和.net就是个垃圾,我懒得提而已
    - c1 j$ p! Y6 `* p8 q6 J8 d6 }在Linus这样的大神眼里,连C++都是垃圾:
    / H$ q, \1 |9 j1 f( ^  c' J* Fhttp://www.csdn.net/article/a/2010-06-12/218785
    : p& B/ c) c& x3 C2 K3 q. _9 v4 c# k: w
    如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。" I7 n- s. B# h
    7 a: I" ^; `4 i$ n( t# N! f" p
    不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。: }) T" q' z( r! @& N4 b4 m
    我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。
    3 h# ^9 t! m5 [. i$ T& t+ C7 K这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。
    5 v/ o- n' T0 t7 x% ^4 T不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。( }* p5 p' f* w# ~8 q, ?4 V1 _, h
    为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?3 l. s4 v$ w0 L- D" W+ A
    因为垃圾代码太多了。+ M. h3 i) [* K9 t) A
    ' K; _9 b& y6 o4 i9 \

    ! q$ A4 H: k6 Q" k! O' l

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑
    + d3 N/ L# E1 r* A1 J' \- D4 W( i; i% i1 J3 X8 Z' z2 [5 ?
    8 w% e8 g2 E1 l! ?/ {2 s
    算了,道不同不相为交流: j+ J$ l% T; R7 j% }1 d4 M
    想起某个梗
    ) W# \. c/ N# L* U, n+ K, Z程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!
    * D1 c, j- D- H6 S8 t. C. s! H. R7 e9 M# @5 y  ^
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。0 P$ h4 z0 `% v2 S: Z$ W- f; {

    8 \; X+ ?2 }- @另外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( S1 O( S) p( l, a) M+ r0 B! t& _
    算了,道不同不相为交流( |! _9 A! p' b
    想起某个梗- l4 @9 a+ D* a
    程序员眼中的编程语言
    % P) j& F& `/ d: I4 x
    不同的语言适用于不同的人群:
    ! Y% L1 d  Z! y# _# m/ z如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。5 D/ A2 `9 Z* B* C% I3 c; ~$ a
    如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。
    0 s' m6 w" K$ V; K, M至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。" q# p0 J3 w. ^
    , {+ [8 B4 E8 P- @) o" D
    编程语言的口水仗永远也打不完,不争了
    ! C0 j  C" f5 p" h+ k/ `

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:35
    / O# @4 y0 r* f* Y! E( L不赞成多线程抓网站,但是好贴子要支持!1 R  W$ ^/ {& @  M2 b
    ' ?! g8 W$ U' c
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...

    7 B3 \. W0 l4 b- W" q( U% x/ Z- V下载软件?推荐一款?
    1 S+ G+ X# s( x# {最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    / q) c3 X8 f4 S4 C现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?4 t0 ~9 {9 {- k* }; l
    比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。+ n! d0 C/ r3 U
    除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。+ J! X/ @" R$ q# M
    目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。
    5 \" u3 _2 b& k1 O4 z6 m+ _: \2 G9 ?4 j
    8 _& Q0 V- j3 c至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。
    ' m3 l3 a+ g0 D. l对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,
    6 w* Z, m' A  W) ]* G3 K* G# L1 I目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。( l# s4 {4 @6 h! J, r0 @

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:
    % }& k% q0 [& X  v# M- L随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。
    # R" W8 `& Z/ z& ?未来会出现一个新的行业:私人计算机管家。
    / N, P" S1 U3 ^+ k! C6 @* `0 a" G. ?专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。
    # j( G* z9 s2 j3 \  G( X但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:29
    , T4 p7 x' i2 k/ U6 e( V; r( y0 N: L下载软件?推荐一款?
    - D! f) X; r  L4 p, _4 W% n最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;# @, G7 q! ?+ r. P; z2 l
    现在99.999% ...

    " Y. J7 }2 v: C7 Z9 F+ c, i用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。- y& t/ f1 C9 ]6 I/ ~  }, V# c* S, V4 _/ Z

    2 J, w0 E1 y9 }! S; D十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。
    , }. D" j- }& h: ~4 @; m+ [, O4 O! K& }) o
    用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。: s- `2 r- ]# l- ^0 D
    % S4 h9 A! X- Z
    我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
    大熊部落 发表于 2014-10-21 16:18
    : j' T# V" Z5 _9 T0 j7 i9 w* H+ m用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...

    + T) M' r+ B( A我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件
    2 Q9 E3 j/ _* c# s6 K0 w: R% `) Z3 d. Q
    下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
    5 O1 r/ y; f( S2 g! {
    推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

    该用户从未签到

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

    2 ]* ^3 U/ l# D7 S# }
    / o7 @- {+ ~! |1 j最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差
    + A, ^# v7 q; G! K计算机是用会的,不是学会的;
    % V3 T8 |* f* O( V% }; I程序是调试出来的,不是写出来的* Z0 ^  `  Y0 ^+ X& P
    1 b0 }$ }1 D4 l# ]6 k
    既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。
    ! E1 ?( m4 U2 Z" C9 c+ t6 H你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

    该用户从未签到

    发表于 2014-10-22 21:25:59 | 显示全部楼层
    bt4baidu 发表于 2014-10-22 20:21
    $ O* P  G1 E  `6 h( T最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...

    - {& U, k7 s2 P( F9 Z0 v: ]多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。. F! s8 r& p$ z/ n* v$ K
    , e9 J2 t, ^2 y2 J; C0 z
    我的一点网络小技术是很久以前在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-27 02:11 , Processed in 0.077667 second(s), 12 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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