掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 50889|回复: 148

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

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑
: b8 X$ M% S, C5 d* c7 T& L
3 v' I4 |* I, P4 _  \这篇文章主要是给计算机小白和初学者扫盲。7 D: V* J( L* q1 s; |  t
本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。5 A" D* I7 g  D( m; _
只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。* _$ l" j, _7 {( g. \

( R6 F4 l# L  d3 a; j% ^一、计算机的两个终极哲学问题7 c* L9 u0 n  B! ?  c7 G
1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。$ G" E$ t  Z5 h- H) v8 ?/ x
图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:
" r2 R+ p; U2 R; e设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;6 R/ K$ Y/ ?! G( O# H8 z+ k
机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。& {. L- {% P7 ~% n5 p
方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。5 J% E! r* L) I1 V3 N
“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。
% T4 t, K, y9 l  K1 K# }7 f
- f3 \4 M, @! i% f, D3 |) u" L那么要写出程序,立即就会发现不得不解决两个问题:( i7 Q$ H  A5 h! u0 C, L+ z
1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址3 s) M# F/ W% \0 Z3 l5 b1 v  S
2、怎么把两种方格区分开?也就是特征识别5 Z% [0 f5 {% N* _* v
这两个问题,就是计算机的终极哲学问题。
( p' N: s2 s2 E& x9 N理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。
- Q( H" p& C. R3 ^6 J1 `下面的讲解也会以这两个问题为核心展开。
1 s$ B5 w  o% a+ t6 [2 d: Y+ b" n0 Y! T9 D
BTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,
5 w/ i3 ]! L8 E: J8 w$ y; G——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。, I% z1 ]2 s# A) V
所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。  r9 j0 M7 e4 V  s2 R; a! O; k6 B
前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,4 ?9 \2 R. W8 m/ N8 I
而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。
5 ?+ |, L, q3 i+ W. |/ d具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。
( k) C0 m  A( K4 c) W
6 n* r% a( s: ?4 k不要觉得自己上学时学的不是这个,or文科生,就不行。
$ ^. @2 R& [3 O; z+ }6 I江民杀毒软件大家想必都听说过。" {' X, M' N1 g6 k; g% C2 g- j
创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。
, w" I' i% z% s- A" g4 V' t2 m咱不奢望成为专家,写写程序总还是可以的吧?
1 _' T* c, q# k2 ], r
" C0 k# b* w% _" `' ?9 j( e二、采用何种编程语言
  |* \. G! j7 C, n" Y5 `上面已经说过,存放、读取、组织、区分数据是编程的核心问题。
( l) S. ?# Z& B8 F/ {显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。
: R; P" c, q, [4 b- l- v* }抓网站,恐怕没有哪种语言比Python更方便。
. [1 T7 t. l" s/ ]( v: y! S当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,
' @( R- m- r- E  x计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,
9 L9 U2 M/ {, u: J& M2 Y没有慧根就别吃这碗饭。
  `: X% Z' s$ Y+ P! b1 i9 _
3 m; n5 h) t4 ~, ?# h; O三、网站抓取技术$ F  X- j4 B: V  A- o# Q
1、下载某一个网页,提取其内容1 b0 L9 r; T# e: [# G$ s( M
以前写过一篇,就不重复了。参考:
  H" F" h4 V& R$ r用一个简单的例子讲讲怎样从网站上扒数据, N$ s& M- B# I, l/ r# V; {
6 Z2 J$ ~% j; e+ \
2、寻址问题, e! Z7 D+ t  q- I) c
下载网页,自然首先要知道网址,也就是东西放在哪儿。% w" _6 |- n" L0 J% b% W
如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。
6 {4 N* A! Q( n7 Z0 \/ R* J5 L但是大部分在线词典,到底收了多少单词,事先是完全不知道的,, \2 c! J$ `0 {3 m3 u
要把单词弄全,就要想办法得到每个单词的网址。
. p2 a5 [: B7 R3 o) B( i) D. u% ~总结各主流词典网站,大概可以分为这么几类:- u0 n. i% C$ Y! ~6 c# I1 n7 E
I. 事先有单词总表
# `# W8 z7 j9 J% x. _: Q比如http://www.vocabulary.com就是这种类型。
- W, T, P: z6 k# a9 i- ~它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。
, O5 y$ v& P5 i" a1 `& g* B
! E2 l, f/ v% U! nII. 网站有索引页面9 ^. Q/ G9 X* R# B
如:  F9 q6 y& X: f8 h1 I
OALD(http://www.oxfordlearnersdictionaries.com/5 f; L2 B- U  F% ?9 }% [) J2 |
它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/) D$ B/ u6 i% s3 |' D
LDOCE(http://global.longmandictionaries.com/
  I  {4 [  m: ^$ u; I采用框架结构,左侧边栏就是索引页9 O  a' I4 J% T; Q2 l3 E
MWC(http://www.merriam-webster.com
4 _& f( S, X& ^7 c$ q1 C8 X索引页在 http://www.merriam-webster.com/browse/dictionary/* C( r7 H- {* v6 N9 ]1 ?9 S
等等
( w7 I8 b3 Z8 c  [0 v这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。
: H, R6 W7 Z* O) [: U

  1. 3 p0 T$ W% y6 p% a
  2. urls = []
    2 \  c, h- r. L& x. e/ D, A
  3. for someindex in indexs: # 循环所有索引页
    ; _/ ^( i& G) W( _
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex])4 Z" Q4 N5 y8 H# N" S# {
  5.     browsepage = getpage(browseurl) # 下载索引页面& m+ K% ?3 i8 }7 h4 J$ a
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域
    0 T. X4 u) n# h$ e0 k8 a
  7.     bs = BeautifulSoup(browsepage, parse_only=target)4 R" W" v5 ^* ^3 \
  8.     if bs:5 L5 ?- s; c; g9 p2 y* |7 M
  9.         for a in bs.find_all('a'):7 B$ X; w# |; f, |8 m
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接+ h+ ~* p( v5 }+ r; j5 Z# p
  11. 然后:
    . a1 G" Y7 w& ]! B# v, b) p1 l: _6 }
  12. for url in urls: # 循环所有单词
    : R: B) w- M, G" B
  13.     wordpage = getpage(url) # 下载单词页面$ k) P: x' g* e/ ~: }' L. w
复制代码
6 ~9 b$ ~6 j7 j4 _+ u2 ^9 Y
$ G4 g$ G* v' {) X: W( e# b: e4 D
III. 索引页和单词释义一体型网站5 S( }: P2 v% e8 {/ X; t
如:Online Etymology(http://www.etymonline.com/. R' o4 A6 z' T3 l7 D& W
和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可& u5 o, K$ U: P

  1. * r, }+ }) v0 I8 n2 Z% x
  2. for someindex in indexs: # 循环所有索引页% A6 E5 Q" K- n( E- O* n& \% m. P3 U
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    6 t4 b0 H5 e" [! p
  4.     page = getpage(browseurl) # 下载页面
    5 F% a8 o9 E& U4 E7 m, I' Q
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域
    4 ^7 Q2 t! m- v% u. V
  6.     bs = BeautifulSoup(page, parse_only=target)5 K) J0 G+ L, Z; p
  7.     for tag in bs.find_all(target): # 循环抠出单词
    1 v4 K& Z* B  D6 P7 R- }3 r! m
  8.         worddefine = getworddefine(tag)
    , q6 u1 x3 N* Q* r7 H$ P# k: j7 `
复制代码
4 c3 d9 Q: U4 O  h; e
. Y6 h, Y0 z- o* o$ C- f
IV. 片断索引型网站/ W; u0 m2 J2 z- c# g
如:
* E! k6 L% z. d/ G7 iODE(http://www.oxforddictionaries.com/* [0 F) h& j+ D9 i. y3 ?
每查一个单词,右侧边栏有个Nearby words
* K3 N8 k- r6 IRHD(http://dictionary.reference.com/
  y& W/ K1 a3 B( l$ Y右侧边栏有Nearby words( P5 i, O# Q; Z5 i* s% E  o
CALD(http://dictionary.cambridge.org/: |. [- R) @/ A
在页面的最下面有个Browse栏,给出前后相邻的单词
+ f5 h+ `* P! G; p. c2 |1 l这类网站没有总索引,只好利用它的Nearby栏。
! N5 v" ?4 Q3 w! B思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,
8 ]  x8 X$ `$ U0 P* M每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)% R; G! {# E; q) ]) a: g3 m  P1 ^7 ~

  1.   D* b6 L0 o% l7 r# q
  2. cur = 'a'$ M6 i* |$ {  Y. {) E
  3. end = 'z'9 Y* a, e. O; s$ }
  4. nexturl = ''.join(['http://somewebsite.com/', cur])' |! H) b, v; K2 j, j8 j* C
  5. while cur!=end and nexturl:3 Y- r3 l3 Y& ]/ G$ e& x  I) d
  6.     page = getpage(nexturl) # 下载单词页面$ j) D. f6 ], h& O4 m: ]
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接
    ! L( a5 \. _: |" Q2 ?4 q8 b
复制代码
' a1 x. z0 w6 z
: [& I8 J" y7 e: Q& \! ]# @- @4 H
V. 完全没有任何索引,那就没法子了' n! k1 v" v1 K" r
当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理
& H' K6 s. k4 O" f" _! x理论上也是可以的,就是效率差一点;
* g& p- V* o" |8 |另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。
7 L, e' o8 h! m) C
) i7 F3 }, C6 ]/ @2 s, {6 e3、提高下载效率% B! f" }* O: Z: V+ J
I. 多进程
4 \6 `/ Z1 V' e3 n+ n上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。7 P. U$ s6 K2 g. h! T
实际抓网站时,这么做效率显然是非常低的。
6 V6 J* K& W2 ~" Y- b$ h# N假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天," v5 P" P. A. |/ E# J# e
有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。$ {2 s  G0 h5 F% a' ?
假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?; T$ e+ T% e$ J. ]- ?
要速战速决,就得开多进程。
% ]  y/ z, K, t! I3 m同样十万个单词,分成25个进程下,也就是28/25=1个多小时。
. w$ s8 q1 b. ]2 }再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。0 O1 m) C8 ?* n# l
在Python里开多进程,同样十分简单,& x, ~* X, B' u% `- l
  1. $ M% l. x' S" e, r" h
  2. from multiprocessing import Pool
    5 N3 ^+ r3 i. e
  3. pool = Pool(25) # 开25个进程
    * M$ h! J5 b' D9 U8 n# y, M$ N, {
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数- ~) K0 y9 v# v
复制代码
; G0 m1 I7 ^' ]8 u; X' L
这就搞定了。8 ~8 O2 _8 J+ z
( y) `+ J# C- Z( P: ]8 y
对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份," {  |/ a6 l4 R/ U$ T6 \
关于IV.,事先没有单词总表,就只好采用区间的概念,1 G) F* l* \% x
比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载7 S3 _9 t4 z* d& I
9 \* L/ Q$ B# b. p7 J+ S
初学编程的人,一碰到进程、线程,常常有种畏惧感,
7 i7 t: s3 ?1 o& M2 C6 f! W看到同步锁、共享内存、信号量什么的顿时觉得头大。5 m: X# A. L- i4 ~" D  i
其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,
  q/ j) y6 N9 k' n2 ~其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。
6 @' _2 O+ {' L9 j+ Q* A9 |9 f
& a2 w  p4 c: V4 @" EII. 断点续传4 \! u- ]( T: i& q
事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。
4 B4 k1 E1 e6 u8 s0 L所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;$ R0 e1 n0 t/ ^- [0 h! r/ J& @# M
即便无法自行恢复,也得容易手工处理,不然可有的烦了。
+ q# z. i3 c, ]这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,4 ~( j/ n- W; N& r- Z  b
直到所有区块下完。, S( m( D) Z. L- i% D& f
  1. 0 n  r; h. t7 r9 y* a3 S
  2. def fetch_a_word(part, word, url, data): # 下载一个单词
      \, v6 e0 X! l; E% U7 _) }
  3.     word_define, failed = get_a_word_from_website(word, url)" I. ^9 z- f- `9 w0 j7 D9 r/ ~$ w
  4.     if failed:
    8 e) @# X) W- R6 i4 J7 w! V; G: v( ^3 ]% E
  5.         dump_failed_word(part) # 输出下载失败的单词及网址" ]5 N( Q5 d' @$ {: z5 N! J4 m9 v
  6.         return False
    ; T3 |% Q2 l3 n1 j5 G# a
  7.     else:
    6 a/ y8 L1 w6 j: w
  8.         data.append(word_define) # 保存下载成功的单词数据
    ' w5 j. l- h: G( _/ M
  9.         return True. R2 _, Y/ Q+ l5 r  b9 x

  10. 8 ~1 ^. b; h( w( f
  11. def download(part): # 下载一个区块
    " S  D. h: Z+ }; X4 D; ?7 e$ b
  12.     words = getwordlist(part) # 读取单词总表3 g  @, l# X+ Y" g! i
  13.     if hasfailed(part):
    3 b2 }0 y9 K6 y5 z
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址5 ~9 S3 N" ]) O, p& D& e( e
  15.     else:
    1 F, z  g3 N7 O( q- X
  16.         word, url = words[0] # 首次从头下载
    # X! E) ?# o  A$ D
  17.     data = [] # 用来存放单词定义
    7 D. [9 g8 @8 j$ p0 `* R
  18.     while not_end(words): # 循环下载
    ( h9 e! y9 e! n- a# P; Q
  19.         if not fetch_a_word(part, word, url, data):) _) T. }* D! n* q8 J
  20.             failed = True7 I' ~7 f1 n4 a4 ~
  21.             break9 N/ E; E6 p5 V6 F
  22.         else:/ C7 \& I' q  p, y9 S
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址
    ! e! K& c7 b7 }; E& U
  24.     if failed:  b) p% g4 A( e7 k" @. f
  25.         suffix = '.part', z& r! Y- V+ C2 g5 {' r$ q
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'
    " W' {# x1 p3 z  R- X) F
  27. . I9 p+ f' y6 s) a* F
  28. def isfinished(part) : # 判断某区块是否下载完成- w7 _& o# O7 b0 [( F: K  l8 U
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断
    : }+ o' F1 m( |* @
  30.         return True/ T0 G" G6 f5 _( e6 a- Q3 N
  31.     else:
    & \- g6 w2 D( T1 t2 _# ?
  32.         return False4 q0 ]. m% N/ l  c2 V
  33. # w( ]2 ^5 n6 K6 _( h. t
  34. def downloadloop(): # 循环检测未下完的区块
    ) d6 Z7 P4 D: V2 W' g
  35.     finished = 01 L* O# i* `: q* ^/ C! A
  36.     while not finished:; D/ \+ G4 N2 v8 |
  37.         nf = [] # 没下完的区块: d* u" P% Y' l$ E6 _
  38.         for part in parts:$ P- B& V: Q8 `: E8 U6 Q; D9 A4 S+ h
  39.             if not isfinished(part):' p7 e; w( ?: K- n
  40.                 nf.append(part)+ h& J3 S7 X: x
  41.         finished = not nf6 ?1 a8 V* O6 L2 J& [. m; p
  42.         for part in nf:4 W/ S7 z) r4 ^# Y+ ?# u' W
  43.             download(part)! P7 r$ [- ]& s& `( m9 j$ v1 V5 I
复制代码
- y: L2 S0 W' j3 ^0 M
0 x5 h8 [. S, N4 l
III. 高速下载网页的小技巧
% F$ J$ K# }- V, C$ y! u3 v  yPython里面有三个库都可以用来下载网页:urllib2、urllib3和requests。2 l/ _/ m- d4 B) H& \) @
其中urllib2是Python原生的,urllib3和requests为第三方库。
3 u4 v  q- ?) |0 b3 Z4 t5 t" w(似乎Python3已经把urllib3收编为正规军了)
( j! C7 e. {$ Q9 d/ D这三个库有什么区别呢?& G' ?3 X6 b2 j' E  h8 w
形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。7 M6 N- ^  Q4 L1 x
再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,8 v! O; e& ]% J+ A' O- e* l! g
所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。
# n4 m: m9 R" p: I" C但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。4 T# A. k& @; J
这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,# ?2 A3 J) X8 u; }: y" s- z
通吃一切网站。! N! I( j! K, p: M, i/ H* n8 S
所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。* `# Q8 ~5 Y0 D! U
这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:
) {2 z: U% p( W) k/ o4 u' ~. jhttp://urllib3.readthedocs.org/en/latest/
, m9 e6 j4 R; t  x4 y4 a! bhttp://docs.python-requests.org/en/latest/3 u" V& m* v6 r8 _4 y: `

  1. 6 }$ G9 ^9 O5 h0 D  G* y
  2. #urllib2" X5 I. L, }- W9 p& k
  3. import urllib2& E  ~3 S2 z3 h& f8 Q
  4. def getpage(url):
    $ @0 Q. w* x! \. ]! l
  5.     req = urllib2.Request(url)
    " o! b* h7 w3 p* q0 |/ {
  6.     response = urllib2.urlopen(req)
    + e7 V' E& N( i
  7.     page = response.read()7 I, _# D/ }3 y

  8. # W4 O2 M  n$ ?* }5 k" y( C. W$ O
  9. #urllib3
    ! Y; w! O: a0 n% p" h
  10. from urllib3 import PoolManager' l, q9 O% r' m# ~8 K
  11. http = PoolManager()
    " W9 T1 C6 B  t% ], d
  12. def getpage(http, url):6 q. D4 l2 ?  u, P
  13.     r = http.request('GET', url)# c  B" K: }2 L: {5 J6 \2 S
  14.     if r.status == 200:- R( l9 {) U, X1 o: ]5 K
  15.         return r.data
    . C8 @0 }5 o& j9 Z! C
  16.     else:
    * ~+ D) L" c, z' h
  17.         return None" a) r3 p% r  Q0 ~

  18.   K5 d6 h# q, V+ S( \9 T' ^9 q* D: Q
  19. #requests
    8 X5 U  g/ }9 D; o* z8 O
  20. import requests
    % e" a8 N4 R' w+ z! i
  21. session = requests.Session()
    0 z! H/ T) v6 W& b. `8 V0 j
  22. def getpage(session, url):
    ! Q1 P/ E! }5 d; F0 l8 w6 Q
  23.     r = session.get(url, timeout=10)
    $ b& h% j- j6 G' A9 G6 V  d
  24.     if r.status == 200:
    0 S  q  g7 v: h
  25.         return r.content  `* c% d$ h; L% Y. ?- w1 b2 q0 j
  26.     else:
    9 N. i2 ~* g$ U
  27.         return None
    5 e5 M# C2 l) S. g
复制代码

2 Z% w2 R+ e+ v. c" A9 i% e# o四、后期制作
# N0 R* r% V1 y/ i! t% W1、文本处理,是个特征识别问题。
. @5 \0 t1 z4 s6 x/ k* \本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。
3 S& U+ @1 T- @( v- U- y当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)  H! I6 H" u) h6 C$ E. ]
都涉及到特征识别问题。
# Z+ z, `: ~# d3 M0 a1 v+ t9 i相比这些高难度动作,文本处理算是比较简单、基础。
6 A6 r5 n# j: O0 F- HPython里常用的文本处理技术:正则表达式、BeatifulSoup、lxml
3 U, w8 \' Y3 q) M/ g8 G- d正则表达式非常强大,但没法处理递归嵌套的标签型数据
5 B( b- u/ s+ w! D: ?(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);; ]. U0 _) \6 v4 ^
BeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。9 _& f5 Y! Y. b
所以常常要结合使用。
, ^( T8 m' d$ \" D4 D这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。/ h9 i" ~# r+ y! W& S' R

) N' @( |+ g) A8 m$ a% ^* t2、排版
- U* x" k9 Z* Q! |% ?5 bHTML、CSS的基础知识:. u( ^3 F9 [8 A# `# x
http://www.w3school.com.cn/html/index.asp$ u* h8 U& R7 q* Q$ T- k8 k
http://www.w3school.com.cn/css/index.asp
* A* F" g7 O$ n3 Dhttp://www.w3school.com.cn/css3/index.asp, ]2 k- q3 z5 L6 j* k* i0 m
非常系统、非常全面。
9 r# Y6 k$ t2 y7 S/ |排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。8 c& ?9 \; h: _2 F3 n, i  J
% {& b/ u: o: k: E, c6 I1 }
五、结语
$ z: \# u. W9 \7 c( A  q花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。
9 s9 D  L/ ]7 ]7 S6 d+ u7 \/ f/ P所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——
9 l& q* R; ^/ h) d0 y6 S( Y大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。1 }( N8 {  f1 m8 z# a

! j7 B/ v, y: W; ]打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。
& {( e* ?8 x& z. i1 t5 c- Y$ a. m: J9 F! L: J$ x
只是拜托不要打扰别人,真想要就自己动手。0 {6 d# h, N5 h# f9 W: q% L& ^
尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。# Q, _5 s0 d( b4 `- k0 d
水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。+ A. c# t3 C  |. Q
虽然每个人都觉得自己至高无上,应当受到别人重视,
" r9 |6 h( Y  a( a其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰
: @* \$ P" D0 a( Z# e% F" n3 e' @, E/ x! E1 ^7 i$ n& t8 Y
! V: ]( @) z/ G; J3 [
========
' w$ r, T, `6 R( B: Z# j六、拾遗. V( a0 k# W, b2 u1 I" x+ o( y
关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类
) |1 ]) R% X( T4 [/ M# _9 X确实如此. ]; F3 d1 w1 _0 }
不过这里只是举例而已,不用太较真啦 : @5 k* }3 y6 w& d/ R
实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏
0 b0 @/ u4 }+ c9 @' j2 f这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。' @2 @  X- s# U- |) \# q% U, u/ A1 v
即,
  K& P2 j7 e: v第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)4 y# t! N# Z8 R% i, {. K: t. P
第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)0 v5 w  X' u- X" b( H8 N  X7 ?
第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作( L6 z" z+ ^% }& M: x
。。。
5 |" o8 @% {1 t9 \: ]* ]/ e2 E1 ~直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空), R1 r* r7 }+ Y8 T
最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。  k" R1 _( C/ S- w
形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。* ^  Y, }% f( P! a; a8 b. z
因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。" k& @( O) W1 d! i5 w( v

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:414 ~; Y/ B- o# H+ D% R$ v, c: }1 J
感谢楼主分享知识和经验。
1 F  h' ^  Z- F& h$ T; }2 S" w& h; R
每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...
9 X* i: A& Z' O) j$ P
现有的mdx词典,其实足够绝大多数人用一辈子的了. o8 @* t6 v; i! _

2 I- a5 e: i9 }" v$ P% i, S本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。
! Z/ B1 X3 i7 F1 z* Q& x- ^' d# g9 ]$ t
本人最常用的词典:9 A$ Y: U) q! O# l; c
主力阵容:VOC、ODE、WBD。* ]. Y6 Y% U5 U# |5 v2 l
三本都是中型词典,收词量均在14w上下,以本人目前的阅读面来看,还未遇到这三本里面查不到的单词、未收录的义项。据说史上掌握单词量最大的人是政治家兼散文家丘吉尔,也没超过14w。除非钻故纸堆,恐怕用到W3、SOED的机会不多。7 i; F# P( C% j; y4 {# @

) e5 P2 s; E: I. y4 q替补阵容:LDOCE、词源、短语8in1、韦小黄&韦小绿、Garner Usage。
9 N, ?# a+ ^; v5 \+ @+ dLDOCE用来查常用词的惯用法/搭配、语法信息;
  m8 ~% I$ w3 t, C; F/ O9 {词源用来辅助理解、记忆单词;2 a$ p/ A9 m2 t  S1 |
短语8in1用来查漏网的惯用搭配、非正规用法;6 m2 P, X) y1 H% {/ f
韦小黄/Garner Usage用来辨析/比较同义反义、正误用法;
' Q# b( D: \7 z# `2 F7 x: A* e0 p韦小绿用来辅助理解、记忆大词。小绿真是本好词典,有人说里面收的单词都是一辈子才能见一次的那种,其实不然。它虽然只收了1400多词,却几乎都是高频的大词。从本人的使用体验看,查得率相当高。比如最近看新闻说一种超大蜘蛛,里面有个词arachnid。别的词典只是干巴巴地说4对脚的生物之类的,只有韦小绿说了它的来源:从前有个女孩叫Arachne,编织技艺了得,把雅典娜女神给比下去了,结果激怒了女神,被她变成蜘蛛,终身织网。这种解释多有意思,看了永远忘不了。
% {1 B& J, l. y" C
/ I# c/ S; c. t+ D  y# [上述词典,坛子里都有,无非是版本新一点旧一点。比如朗文5和朗文6,有人统计95%以上的内容都是一样的。如果是完美性格,非要用最新版,那就只有自己动手。不会有人在词典出版的第一年就去挑战版权方的。1 r3 J* w9 ~+ k  m& h1 J( h' g/ v, z
“对于好学生,任何教育资源都应该是免费的”。虽然本人同意这种说法,也认为现行的版权制度存在重大问题——有人靠垄断知识获利,却完全合法;但是本人从未打算挑衅版权方,更未想过做Aaron Swartz那样的斗士。靠垄断知识获利是有点无耻,但如果没有利润,也就不会有人去做整理资料的事,这确实是个难题。
1 g  ^- E: j5 R; ~
! x/ `  ^" m& t( L  m0 O1 h2 ^- x还有些人没事喜欢收藏词典,收集了一大堆,却从来不用。说到词典收藏癖,想起以前的一位室友,那家伙每天最大的兴趣就是下载影片刻光盘,大概刻了几百张,还在不停地刻。但是从没见他看过,他也不让别人看。
5 k8 S' \. P# }) \% }/ l) B这种癖好大概是来自于原始社会的一种遗传,人们总觉得应该储备点东西,说不定未来某一天就会用到。其实那一天说不定永远也不会到来,不如就把今天当作那一天好了。有多少人买了一书柜的书,到死的那一天都没看完,甚至有些书连封皮都没揭开过。9 Z7 r& V$ Z% ~* o- P/ {

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。
* {' Q' O1 }2 R, V6 r1 K1 n- l其实只是你没有发现而已。
4 }' T& P- \/ I- F4 K, jODE: http://www.oxforddictionaries.com/browse/english/; `% ~8 B4 L; V4 R& _, K: t- W! Y
RHD:http://dictionary.reference.com/list/a/
: W& u4 O) r$ A+ i2 qCALD:http://dictionary.cambridge.org/browse/learner-english/
2 d0 `7 k% [' U( Z8 A
' m" F% \8 q: g5 Q( n* E如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。
) |; A+ e' l8 P2 ^5 W9 b& W- ^以第二个为例:
5 k. }- A& \4 x- x& N' ninurl:browse | inurl:list site:dictionary.reference.com( r$ R% ^4 M, d. D+ }2 l5 Y' i2 h

" M7 {  ^! X7 D$ T) Q3 SPS:最近才发现这里,发现资料很多啊。
- |- ?4 k7 l& [5 |* {5 T# Y

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧
5 k" D" K, M1 J, i5 H# T! D- V6 V+ }: {) E5 Z; h$ A; B
假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改2 p, B( A) S( y6 ?/ ^; a6 T0 K
或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下
# K# `- G" g, s" a结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。9 ~8 N2 |  p: M6 ]  d
这里有个比较省时省力的小技巧,可以快速定位到想找的地方
, j+ }6 r+ F( R3 N7 D- u6 {# w4 T( b5 t: l( }  O" R( U$ V
1、Goldendict里,在想修改的地方点右键,有个“审查元素”:6 e3 u+ M5 w5 Y8 z8 d
$ i- T7 {% F0 ?3 Y7 g
6 |/ G, n( l7 k" b! h& D
2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事: \' j6 Q9 n4 i

+ Y8 L! Z1 ]& N: a/ S, y# v5 o# ^6 y
4 n: Z2 E5 F' s! h" b) H, i3 j3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方
2 P% K6 L( I* M8 D' Y3 L# T, f$ D! ?' ~7 F' \
) Y' w- _6 |! `: t! T2 Q: w4 T
收工

该用户从未签到

发表于 2014-10-24 18:41:00 | 显示全部楼层
8 l' D! G: `3 H6 ]7 \/ J5 L1 i
% U4 h4 y# f( [% {

3 H* T8 X- ?3 u$ C5 q4 A7 _0 J
. N1 M: w6 D, X, g1 C- z( c感谢楼主分享知识和经验。0 }, s/ s  i' r6 H$ u

+ V! `6 `) Q$ P0 i0 W/ S8 [  N( ^每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。5 R% G! Y/ T  s6 G

1 x  t+ a7 r, E6 M私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。
+ }* \; a$ g& B* t* `: _
; M7 ]( z$ Q9 r! j但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。5 J8 C! u  K/ B7 I* G# n) O

3 v$ b: D) x/ ^5 K' y6 z1 Z除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。
; b- i; h5 u- [& ]+ W7 Y
% {) P* f5 B- S5 t# v7 w! P7 ?: G% G4 u2 j$ n# j$ b* f/ q

& [2 O* U" k) s6 Z2 y
5 E8 Z1 x% p' I( {% s. O% w  z$ }

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件3 o+ T3 L" \" k
  • EmEditor
  • Beyond compare
    4 k# a, N# O0 C4 O
! b9 y8 o0 e9 R  m2 f6 R/ i- Y
. ]& h' {, r; g+ b) F- {
前者用于编辑,后者用于差分比较
2 u! o+ T: t3 B# G. K5 a( p  S$ Q' s处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

发表于 2016-6-8 07:41:03 | 显示全部楼层
bt4baidu 发表于 2014-10-25 21:01
9 h, d" _& _- k( W: P* I现有的mdx词典,其实足够绝大多数人用一辈子的了
# Q& K# _2 L$ k; u9 {' P: ^# B1 i7 ]$ P; i( W7 C$ O
本人前段时间制作、收集了不少,经过一段时间的比较 ...
4 v; Q5 u$ F% j7 O& j
肺腑之言。

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考5 ~6 z# u: c( G# ~4 w2 S0 z, Q

3 H' R, Q1 c1 g2 u8 @! p9 q网页设计中最常用的字体有哪些?(中文和英文)6 o' h6 t2 }' x7 g1 N0 W
http://www.zhihu.com/question/19680724' @$ P" w) J) m! @" m
% r; o3 ?/ ~2 s0 h7 h" f
本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode( R0 _. L1 g) k1 A4 y; `
这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全
: d: y9 G5 h! p, {6 |4 W另外Open Sans字体也挺漂亮
7 C& i7 A8 I, |. m6 h) M, 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
    " V/ E5 h$ A; l% X) A, ?1 `+ a最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...

    : a; E0 W: M: f感觉找到适合自己的问题好少啊
    ; `# T2 w; h* D, L1 V! @这个适合的话感觉是兴趣和难度% @" v- n' r3 B9 P6 b& `& {' z) E
    想请教一下楼主是怎么处理这些问题的呢+ p1 s5 e& H3 x" _6 x* C: 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 编辑 * y" v0 u5 P! l5 j, E+ r
    9 Z( ^; V; H$ G3 c9 {4 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 编辑 1 u( I! ~& S5 c
    # Y- k" w5 I4 p) b' \8 D
    java和.net就是个垃圾,我懒得提而已" m* G% @! a2 w# d9 @1 {
    在Linus这样的大神眼里,连C++都是垃圾:, j% T6 p$ Y* q8 S5 L0 w7 f; A# s% _
    http://www.csdn.net/article/a/2010-06-12/218785" A! I) u7 g8 I3 J4 W3 ]: Y
    5 f: I: R4 _0 W# O) E: o* y
    如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。
    0 C7 P, ^( N" \. E% l6 o" C  D
    6 ^7 B% F2 U( y  O不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。2 @4 F8 ?6 u3 P3 d$ o. \! f
    我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。4 w; b0 t2 k9 `8 J) ?. ^8 O; N( |
    这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。! g" ]; }% U4 w% @2 G4 `' b0 s
    不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。2 S" B6 J' y: [# c; C
    为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?7 A/ l, E* N, ?8 m/ \9 j: _
    因为垃圾代码太多了。
    9 j3 R0 D& F7 s# h
    ; f; @) i9 R: }; k4 L% c7 w4 j3 _5 v  v$ x* h" z' g) q5 k

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑
    6 ?  W, S$ p: [6 E2 e3 n: |' j6 w: Q; P7 ]9 a  S) W% }$ e

    3 D& {0 P' I8 T: j: T算了,道不同不相为交流
    - Y& M* v' K. Q想起某个梗: V, w  V7 z; H, Y; r
    程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!
    , q3 `; q5 g6 v" u7 T+ A2 d6 `9 q8 i0 L) S, ?
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。
    2 i, i2 W! j' D( W( y7 C4 N
    $ s  s* X% T8 X2 i2 |9 n另外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, B5 v0 ?; A* [
    算了,道不同不相为交流
    2 u# W+ p, G  l5 T; [想起某个梗
    $ s8 H4 `; e6 y# e6 f程序员眼中的编程语言

      U* @" ]; Z! P- O不同的语言适用于不同的人群:
    + u; s% H; B# w9 ]' o+ M! O如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。
    : D6 a4 r+ V. X+ X6 O8 I7 l+ L2 e如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。
    ( V' {) ]$ B, u5 E4 s- d# {" r至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。
    7 A1 e2 W4 J" `1 t8 l/ b$ F1 z6 \3 F/ u2 r/ f0 Z! M
    编程语言的口水仗永远也打不完,不争了
    1 Q" g& A  V9 q" S5 P" A1 q9 A. B

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:35% r3 W' C* ]& s
    不赞成多线程抓网站,但是好贴子要支持!
    - w. M+ G, k; c; |2 k" u( |+ d# j. n6 U, x, k; N/ U+ Y
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...

    ' o1 T' p2 C( Z下载软件?推荐一款?/ n' A" o9 V) L, h- \& a( i! l
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;! b$ A  `) d( o6 m$ X' N
    现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?9 j$ F0 O$ n$ L$ w  a: H9 h3 k) A% U
    比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。+ r: N( L; t1 ~' ^- o" @+ d
    除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。5 G9 {: N- V, Q& f+ \/ I4 n$ M# B
    目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。
    8 W8 ]9 K. u: R0 |- o- \. t. x7 O6 C& v, O% C) E0 s6 Z' Y
    至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。
    # ]1 A  o, G) g; N/ P对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,
      F' d4 k' w; R$ j目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。0 T1 P, e5 j# V# `% p) M' C( U

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:
    $ [8 Z/ b9 J! x6 h随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。$ i; T& _: g* p  V- @  Y; m0 u
    未来会出现一个新的行业:私人计算机管家。$ h7 P' F. f7 t4 P/ h
    专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。7 ~5 \( x' {; m4 [* U$ b
    但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:29
    6 g5 \& H& e- l: x下载软件?推荐一款?
    0 e  Z4 T7 `! v$ H7 x最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    * V- N4 D8 W( d8 h( T: b现在99.999% ...
    4 n5 ]1 @, G$ n: y
    用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
    ! l- i* r- W+ w" Z; c- Z1 ~
    % {$ z/ E" N  s$ [5 x) j$ d- o* ~十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。
    % }& z  Q7 M( ]# v$ T
    8 X, {% V( o3 F$ L用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。
    9 h. M) J" ?& H; n1 n+ O* q$ r7 l0 O8 N! ?) x! m) x
    我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
    大熊部落 发表于 2014-10-21 16:186 I0 ]1 _/ a! G- v3 X( _
    用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...

    $ t  _1 N4 y( b5 q我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件5 [9 D0 Y, L2 n, T, W
    7 v- ]( n7 A$ m, Z3 C) @  O
    下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
    " r( o" a8 g/ I# X3 J! m+ G
    推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

    该用户从未签到

     楼主| 发表于 2014-10-22 20:21:14 | 显示全部楼层
    平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。
    * _3 q. K$ {' `9 @3 c0 H9 x) K

    ) E4 m- e" N" [+ m4 f' U* S. s0 s5 c最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差
    ; b8 i, \7 a$ {计算机是用会的,不是学会的;) j) m) f' I1 s
    程序是调试出来的,不是写出来的1 o, F5 u" v0 m' T" r  t
    + Z% y. H* Y( D( Q3 i7 c; n( d# Y/ Z
    既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。+ N5 |/ z' c0 O: H/ H1 B( Y3 ^" ^
    你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

    该用户从未签到

    发表于 2014-10-22 21:25:59 | 显示全部楼层
    bt4baidu 发表于 2014-10-22 20:218 N% \! P1 J2 _$ A5 J3 D$ ?
    最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...
    % H4 [: z2 l& s$ [) X9 h
    多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。
    ( T& W  \' J- S; e" t
    8 K2 M+ _2 Z! J) f我的一点网络小技术是很久以前在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-25 01:36 , Processed in 0.077125 second(s), 12 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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