掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 58129|回复: 148

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

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑
+ f' y6 l' V; \( b' Y7 q9 i1 Y
0 W4 N, q4 T9 T! G6 s这篇文章主要是给计算机小白和初学者扫盲。
) e7 w: Z, }/ k# C  @本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。/ d( Y& B, }0 M; F! I' ?
只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。
2 u  |0 S: `6 \, q$ c2 Z5 t0 ]7 u1 l0 S: a
一、计算机的两个终极哲学问题. X1 J! |. B6 M( `" t: ~
1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。9 ^5 E6 `, [: `4 m8 ?4 n
图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:0 C2 \2 H1 F- S: L
设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;
1 x& i- m+ |7 Z  U) K2 Z机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。
* v$ y6 Y( a: g方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。: R$ j+ W0 b5 R. M, z1 t3 f
“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。
7 U4 _. y, S* S4 G1 x3 W: }# i  ~. h3 c! W8 o7 |8 z4 \
那么要写出程序,立即就会发现不得不解决两个问题:, F4 D/ F* Y1 W5 `2 j. J- e
1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址
4 l. _) B$ N( l3 h9 \1 R, x2、怎么把两种方格区分开?也就是特征识别% A( y, O1 d- ]# O; c: H* k0 T
这两个问题,就是计算机的终极哲学问题。
6 D# A5 d7 M' h5 t理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。, l9 }+ P& F. I% m3 v  a9 ?
下面的讲解也会以这两个问题为核心展开。8 G) i+ G. l5 F# E% p9 E

/ S8 e7 b$ r8 I& b' ~4 i+ v0 ?: t: LBTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,
) a4 Q" ?3 E. K- a) F+ c- D* b0 c——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。
- P, q4 W6 @& Z! P所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。3 G- A9 e7 j7 x9 A* y0 I
前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,( _1 H  @: N0 F  ?# G& B
而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。6 v. U& ]1 }% e7 }! [  i
具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。
  D2 [; [! G* V1 l" G4 e; E- @# O: T( j& U/ h1 Z( g% b
不要觉得自己上学时学的不是这个,or文科生,就不行。+ c: Y. T; J' C* m2 g3 X  p
江民杀毒软件大家想必都听说过。
% k0 p* f- h7 S8 r5 q) i, U$ Y创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。
6 j' I5 p! U. L+ i% j咱不奢望成为专家,写写程序总还是可以的吧?
7 C) O2 X1 U7 o8 v  \# [3 J  t; y: \0 h/ x
二、采用何种编程语言
3 |; }5 g. T2 q" G4 W上面已经说过,存放、读取、组织、区分数据是编程的核心问题。2 ?( N+ G! J, Q
显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。
3 {1 z- E- X5 c5 g' j  k抓网站,恐怕没有哪种语言比Python更方便。
" Y$ B0 f; Q3 k2 r' P5 j- k/ H1 [- B当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,
, E4 G9 W: I7 w5 ]) E, C6 i计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,
' k" b4 X8 J, d8 M/ g* |& S没有慧根就别吃这碗饭。
! d0 ?' W. j; O% N2 E
7 V3 y7 i. K! _2 J, B$ X三、网站抓取技术
, ?7 X5 U& ^' u  O4 E5 `5 c8 L1、下载某一个网页,提取其内容: ]! d. V/ x4 n; ^
以前写过一篇,就不重复了。参考:
# [8 ]. B8 `8 B用一个简单的例子讲讲怎样从网站上扒数据2 T8 e; \- B8 S& d' D

" U: U+ [, I; n8 S- A2、寻址问题
  x# F5 |' c' y$ D下载网页,自然首先要知道网址,也就是东西放在哪儿。2 N% }7 Z. G' ^) g  I
如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。) d2 {/ S7 J9 V" g& d/ e2 p
但是大部分在线词典,到底收了多少单词,事先是完全不知道的,  s" B* y7 J7 ?$ z' ?( R. G( f
要把单词弄全,就要想办法得到每个单词的网址。
. q: n# ]4 ]* Y' P总结各主流词典网站,大概可以分为这么几类:! h3 R2 h0 T" V2 x3 W3 R1 ~1 h/ R
I. 事先有单词总表5 V, H0 T; j6 }# a. Z) s: J
比如http://www.vocabulary.com就是这种类型。
) T! P+ }( @; `1 E8 [它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。7 P7 Y1 S( \5 \8 [' D" H, i

( Z& ~2 ]6 X# E+ x/ t* BII. 网站有索引页面
, D' s& {2 k7 V0 _- G! y# t如:
* e* }: Q2 ^# @# C; x+ wOALD(http://www.oxfordlearnersdictionaries.com/' r7 U- h7 Y9 V' Y( C1 a6 X+ S
它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/- F9 e8 N& _2 c% Q8 i  h' c
LDOCE(http://global.longmandictionaries.com/! F$ o# Q8 `- t6 Q* n& |$ M, }
采用框架结构,左侧边栏就是索引页  d' `0 S% _, `2 W/ E1 f
MWC(http://www.merriam-webster.com6 y" ^8 h; F/ [1 }, ^
索引页在 http://www.merriam-webster.com/browse/dictionary/% F/ y6 Z8 ^( R! I5 |
等等
$ _2 e# Y. R" U2 @, T这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。
+ T/ `2 P. _0 A: Z
  1. 9 k8 Z$ ~4 g! ^# d7 c
  2. urls = []
    + P- U3 Z6 x  [. s( _: g
  3. for someindex in indexs: # 循环所有索引页
    7 g) c: V5 c) D/ e  f( W+ J4 {
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex]); R3 {( U, _8 K" m  p  ~; X- q" P
  5.     browsepage = getpage(browseurl) # 下载索引页面
    , r0 o7 P5 d. @, _6 T8 Q2 K
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域  a5 Y, w+ Y# n. `/ I- S
  7.     bs = BeautifulSoup(browsepage, parse_only=target)* `3 t0 t, Q) X8 c! E
  8.     if bs:
    3 g/ v' e, k0 b1 u  h( x* m# g
  9.         for a in bs.find_all('a'):
    % K  w( E" L( ~' N
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接( m  }+ _$ G5 g6 u4 F% o
  11. 然后:: j/ x, S$ l# l: z4 ^) k  r( D
  12. for url in urls: # 循环所有单词* c. N: T$ z* b0 w" F9 k* o8 T8 u: x
  13.     wordpage = getpage(url) # 下载单词页面
    & F9 E. W) g) j. a& n$ H& K1 @
复制代码
7 j2 }. b; f# |4 G( c* N1 ~
% f5 {1 }  ?' M! e- B# W
III. 索引页和单词释义一体型网站' u0 H7 Z: F. y- e0 T$ F' i) n
如:Online Etymology(http://www.etymonline.com/  }$ W5 e" L; g/ v9 i9 K  B5 v
和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可
7 K6 h1 S1 X; R, A! m

  1. 6 t# m0 c* k" j$ D7 z$ |& V4 {
  2. for someindex in indexs: # 循环所有索引页+ A/ o/ G& L2 r0 ]% E# j, V* u
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex])& g. w# Y- |% L* U. |/ Z; t6 v. k
  4.     page = getpage(browseurl) # 下载页面' k4 h3 y3 i  _
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域% v3 j4 C6 n  C& [( i% ]
  6.     bs = BeautifulSoup(page, parse_only=target)
    , v; a$ H$ i' Y+ ]6 {
  7.     for tag in bs.find_all(target): # 循环抠出单词* r7 h2 h- v; @& _) e4 _4 }9 _
  8.         worddefine = getworddefine(tag)
    9 ~& _# {: Z1 I6 c# s7 M
复制代码
2 V3 g" Q) {( M! N

# _1 r  U1 o1 R9 L: KIV. 片断索引型网站6 [, ]8 ^; F' v1 S; T1 P6 g
如:: U/ b! o7 |4 t6 O: l" Z1 K% ~$ S
ODE(http://www.oxforddictionaries.com/  }1 ^% n0 `5 v8 v7 Z; x
每查一个单词,右侧边栏有个Nearby words8 u+ e; s$ |7 X9 ?  V
RHD(http://dictionary.reference.com/
1 `9 n' v( M% f右侧边栏有Nearby words" r, q6 a( |7 Z8 r" z  [7 d
CALD(http://dictionary.cambridge.org/
4 W( h" P0 C! O+ G- S, W6 z8 Q在页面的最下面有个Browse栏,给出前后相邻的单词2 g. t2 V2 |8 a& c: }
这类网站没有总索引,只好利用它的Nearby栏。2 B3 m6 ]$ s% n! I( X7 O, `
思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,8 G& H6 x# i1 g3 T' A
每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)+ c! {2 e6 k- i3 ]' v6 f- k( g
  1. 3 |: e& o- F6 I. T. x
  2. cur = 'a'+ p( `: ?/ G8 j3 x( e$ I; s
  3. end = 'z'7 C0 Y! Z# g( [% T& c
  4. nexturl = ''.join(['http://somewebsite.com/', cur])
    0 Q- q) `% s6 C4 R
  5. while cur!=end and nexturl:6 n5 E$ m  l3 I0 E" W& @) S
  6.     page = getpage(nexturl) # 下载单词页面+ Z4 V7 |0 W9 m& Y5 {* Z
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接
    : N* m* E7 B) V/ E: W' P
复制代码
! B( Q* x; m# E, o7 K

7 h7 p- N* h+ M) Y$ BV. 完全没有任何索引,那就没法子了( a* q8 A% q3 i" ~0 W! H# s; V/ {
当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理
0 B; ?2 @: z+ T& G# }4 L理论上也是可以的,就是效率差一点;
' n& N' J# u& {' A8 m5 w. `7 p) T另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。
. {# i/ H2 c+ Q9 g* X& T
/ F: y1 _* e, y$ g5 W7 n2 z3、提高下载效率$ `/ N$ f4 I0 f
I. 多进程
* Z; m% M4 C, X0 g% K4 @上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。, q9 W( [2 \* a0 m; f
实际抓网站时,这么做效率显然是非常低的。
- A8 |% D7 G2 ?* U# R假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,6 M" K0 H; j8 [8 ~" l* C! H9 e
有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。
4 G& E9 n; l5 G, V, C假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?9 h3 u* p4 c+ v  P6 ~, h& H
要速战速决,就得开多进程。+ t/ p# Z3 ]/ W5 D# z
同样十万个单词,分成25个进程下,也就是28/25=1个多小时。
' z+ v. E' c" C* f再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。
' E* ?* K9 V9 o4 [7 F6 s在Python里开多进程,同样十分简单,
' m( C: i3 G0 u" X5 c

  1. ! V6 N9 R( T9 S: u$ g
  2. from multiprocessing import Pool
    , C; q% F5 V1 L
  3. pool = Pool(25) # 开25个进程. T2 I5 E9 s. M/ r. s& e/ R
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数2 t  ]3 n. V& k
复制代码

; r' j, W% t( l' [. @5 o( e这就搞定了。9 F3 u: I8 A! F) a; R) Q

# P1 z) `4 s. X2 ~8 o3 H对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,
: d5 D* ~1 W' M  y% y) f4 G9 ^8 Q; `! \关于IV.,事先没有单词总表,就只好采用区间的概念,
, P3 {: L6 k( m* ^比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载0 N0 S/ o6 D- W% }6 s/ i& v
$ j% k- V$ h0 H
初学编程的人,一碰到进程、线程,常常有种畏惧感,
- U0 w$ g) N" [* S7 k/ z/ J: h看到同步锁、共享内存、信号量什么的顿时觉得头大。
" `( S5 W, c1 E& S) c0 s' t其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,
5 S6 m& C: ^' |其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。& E( D9 _" V' `3 F/ u! I

5 O( q4 n4 p/ P; i+ SII. 断点续传
- I- K# g" I0 B+ i事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。
* S& H* K5 p. r5 |+ _; Y所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;3 `; w) b, \6 u6 ^7 Y* T7 @( {
即便无法自行恢复,也得容易手工处理,不然可有的烦了。5 i1 B9 o7 ~% r3 q% C& c$ f
这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,* u) g$ J( Z9 {% O
直到所有区块下完。5 u8 f! y" a  X$ k1 P5 j

  1. 9 P, ^5 [& t/ s+ `& u3 N
  2. def fetch_a_word(part, word, url, data): # 下载一个单词% o7 A2 L; e" k) r
  3.     word_define, failed = get_a_word_from_website(word, url); R: _5 h5 a5 j8 c% U
  4.     if failed:
    ! e$ i# W) o4 h8 h+ e
  5.         dump_failed_word(part) # 输出下载失败的单词及网址  |6 s, M! a5 g* S1 |  \& t% [
  6.         return False
    8 f3 t$ p3 h2 W- p( Z
  7.     else:! o/ q* f: v- f3 |; F2 d1 P' V
  8.         data.append(word_define) # 保存下载成功的单词数据
    + _* }* Z' O/ v9 {& M' x  b2 p
  9.         return True( o6 T/ }8 R; e# H) Y& o; `
  10. ! K  P9 z5 x$ }1 H( T0 y
  11. def download(part): # 下载一个区块
    6 B$ ]5 r& _# |$ k8 A. a
  12.     words = getwordlist(part) # 读取单词总表
    ! ^& ^& T; u6 K% V
  13.     if hasfailed(part):
    " Q/ ]2 h+ R' Q& E0 D
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址; A+ g$ P7 ?( |7 z( N: T+ ^" x3 Q* G
  15.     else:
      z' S9 ?2 q# l, Y. O# H
  16.         word, url = words[0] # 首次从头下载3 ^  V( ~; a$ h0 u1 j
  17.     data = [] # 用来存放单词定义
    3 J! i! U/ W: s3 o" A1 r
  18.     while not_end(words): # 循环下载) j( Z. \3 r. [2 F
  19.         if not fetch_a_word(part, word, url, data):
    3 M' B: P$ m; G
  20.             failed = True3 {5 A: ?2 X* \/ E, |
  21.             break
    5 e7 J( [/ x4 }; q1 I
  22.         else:* C4 x3 b4 v& y2 n: b1 n# |
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址! _* D* u' C7 P! P; [% x/ y8 k, p1 C
  24.     if failed:3 C: B3 N! q2 K& Q
  25.         suffix = '.part'9 b/ B8 {: Y4 r+ P( v3 m
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'
    - j1 B4 r$ }; [1 @7 s
  27. 3 Y; w4 ^" ?) K4 G* N
  28. def isfinished(part) : # 判断某区块是否下载完成
    . A2 \9 j  E( Z/ d5 O2 {
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断
    - Z5 q7 i3 W/ q1 i
  30.         return True+ s% k7 W  F6 u; ~6 S* P7 H
  31.     else:/ M& o% a5 _( h! ?
  32.         return False
    5 ~7 Y8 x- |) `' v2 q" X) C
  33. 2 _" v( v1 V4 U! Z" C# P% U" K
  34. def downloadloop(): # 循环检测未下完的区块
    1 ]- M0 G' d3 [8 }& n  K
  35.     finished = 0
    4 K: l. D; X( y9 I
  36.     while not finished:
    6 b& F1 |$ n7 ^& K1 I0 u
  37.         nf = [] # 没下完的区块
    7 l$ `, I/ R3 m! k6 H0 ]0 h5 k
  38.         for part in parts:. E9 Y* s( o! K  D. K1 [
  39.             if not isfinished(part):' A' U2 `! P& M6 P0 B% t4 W
  40.                 nf.append(part)7 \) c6 L8 K1 Y% S
  41.         finished = not nf
    . h; o0 V" {/ g  v" p
  42.         for part in nf:9 @9 a& a* H& T& H; D
  43.             download(part)
    / i, [9 p/ r1 V  K7 r, d
复制代码
* D, F5 B/ s7 Z
; T- B9 v$ ^% i
III. 高速下载网页的小技巧
& a, F1 R# d6 f6 l9 CPython里面有三个库都可以用来下载网页:urllib2、urllib3和requests。
! i% }$ s! a2 @  K6 D其中urllib2是Python原生的,urllib3和requests为第三方库。
: o1 A, [) _; I(似乎Python3已经把urllib3收编为正规军了)  Q! s7 l. R/ T: R  x
这三个库有什么区别呢?2 O9 v1 x  x, s' Z& n$ \$ ^
形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。
" k$ i6 Y! H7 B) R$ ]再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,, K" J8 C+ o6 V+ c; u0 w
所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。
' I, y: _8 g: [" I# N" ]6 f8 G+ b但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。* g/ G" K# D! \* C/ a/ w" s
这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,
# ]4 F* O2 r) y; G5 L通吃一切网站。
7 P5 @: `) D- I7 D所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。3 Z% }$ U4 @9 n+ @& y
这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:
% ]$ b' l) i6 u3 xhttp://urllib3.readthedocs.org/en/latest/7 h" J/ _! z; p! u
http://docs.python-requests.org/en/latest/& {8 }5 G. h5 I, ^# W

  1.   Z9 r# y. u$ C$ C" K8 O1 p3 E
  2. #urllib2
    6 O  |+ J* ^% Q9 i& \. J+ U! V( g
  3. import urllib2
    : a# v4 S# N. u4 A: ?, X8 |
  4. def getpage(url):# q- [( P7 u9 h! A
  5.     req = urllib2.Request(url)+ E! |" C# W" h- @
  6.     response = urllib2.urlopen(req)/ V( C( |& U( ^4 H1 u
  7.     page = response.read()/ D1 {0 V' m8 a. O. m3 O) Y9 @
  8. 7 M) H# P8 X; K' k* }8 Y
  9. #urllib3
    * ~7 l  a1 J8 i3 o9 X
  10. from urllib3 import PoolManager
    , h! n3 L, C, K
  11. http = PoolManager()9 c8 a/ Q$ }, P
  12. def getpage(http, url):
    - V+ @& s" w; X9 }
  13.     r = http.request('GET', url)
    : V# O+ ^5 v, @
  14.     if r.status == 200:' E; R& A7 f7 l1 O1 _' t+ F2 S9 ~
  15.         return r.data
    2 C2 b' q4 m7 C) _6 Z" n' `
  16.     else:
    / y- d( M8 K$ L6 o% }+ ^% c- Z
  17.         return None
    * ?& B* x" L, e2 U
  18. : r% q0 Q% D' C- c
  19. #requests" ^  \) {+ ?* V0 e1 g% f
  20. import requests
    8 q! j5 `8 D% i' m
  21. session = requests.Session()
    : ~  d& |1 w8 _% z2 ]- ^
  22. def getpage(session, url):
    7 V9 R8 K6 P) @' n8 o
  23.     r = session.get(url, timeout=10)
    $ U+ }% `/ h  s7 u* J6 D$ ]. g
  24.     if r.status == 200:
    % P' j& O5 S7 z
  25.         return r.content: b) s4 C4 t/ C  M
  26.     else:
    % X, m5 {0 \: ~: e; M
  27.         return None
    3 E- X$ r) l0 a" y* W! z
复制代码
+ u8 m% X9 b6 K4 [1 [' \
四、后期制作) W( |2 ?3 C4 U8 R5 i
1、文本处理,是个特征识别问题。
7 ^. B# T) R& {  u+ S# }  X本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。
; a$ a. B/ r. A4 @当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)* @* F4 \1 E+ {+ S' T  `" Z
都涉及到特征识别问题。% p0 G- T/ f% G8 j/ z% X
相比这些高难度动作,文本处理算是比较简单、基础。
$ f2 `7 R) w/ R3 Y7 r: v! GPython里常用的文本处理技术:正则表达式、BeatifulSoup、lxml
' w8 V2 X+ s. k8 ^: c+ _5 R正则表达式非常强大,但没法处理递归嵌套的标签型数据
: x! U. H" s9 q) j8 d(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);& [  O% s' O0 u( g0 Z
BeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。0 V% A' a  h; y, V  l$ O9 l# Z$ O
所以常常要结合使用。
% X+ a! E3 I# L1 K2 t9 m这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。9 t8 I1 p6 ~# T  Y9 \9 k

1 g1 _# u- K, K- ?! W& |2、排版( m* ~4 G, X9 @6 p  c& C
HTML、CSS的基础知识:2 q8 _) J  t  ~' _
http://www.w3school.com.cn/html/index.asp) W/ I+ l- q7 f# ~
http://www.w3school.com.cn/css/index.asp
7 ]5 g, c' l8 Q, U& Jhttp://www.w3school.com.cn/css3/index.asp
/ q) h) B0 H4 H5 q. a8 t% m非常系统、非常全面。
8 b( M6 @$ c/ t排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。
; F, I" r0 P9 }) j$ {& _* f3 X% j
五、结语
* Q7 ?; z/ q# J+ A5 f1 t花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。( [5 {: A, [+ G5 ~/ [
所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——- r* O( F0 N  T0 D1 Z: s
大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。1 v( t. \' S1 V+ a' C, f  I

$ T3 k. L! a5 D6 P打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。
; }: M* f. e$ Q# J4 [4 `) F3 \  j; C+ y; {4 M( _! C
只是拜托不要打扰别人,真想要就自己动手。
: E* M+ V6 F5 b尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。
, t9 a0 u) G2 f9 Y7 q$ t! {水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。% z/ Q+ N4 h% H) e. L9 Q( O7 \
虽然每个人都觉得自己至高无上,应当受到别人重视,; i) u: Z( w' E  _" p* p
其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰% j. c* K& P4 O/ k

! F* \$ {- \0 U! @8 q2 n5 C* y# R9 U
========7 S1 x8 d% c# P5 K) n+ E
六、拾遗4 p! ^) P+ Q" ?- K7 Z' B. K5 e' m7 a
关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类
% x  h1 a* N% I" l* ?$ H1 o1 _确实如此( j9 x' b6 q2 I+ ]
不过这里只是举例而已,不用太较真啦 & _" Y9 e9 v" p. Z6 x# H% U
实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏
, {" N2 z) \0 o& p* g这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。( w+ |% H6 D& e
即,% X7 m% G& n& b; G
第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)
. J& [+ A( y9 n, d  F: Y$ s) y% k第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)
- z8 w" @0 v8 ~9 r- y/ i& v第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作" W8 y$ P6 {# `1 u9 {/ n
。。。9 u9 I3 c% H8 g0 j& ~
直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空)+ X. A; }$ n+ W
最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。/ g5 q% A) U6 e! R# z
形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。
3 \( k$ }, q3 F因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。
4 L( ?8 G( m# a: f7 v4 V

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:41/ j2 w: j' u& G9 a+ o2 p$ p: p
感谢楼主分享知识和经验。
. [6 r: |3 S. h& E$ B7 l6 [! {+ z2 c% y
每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...
& b8 }6 z* }0 c2 f2 A% S
现有的mdx词典,其实足够绝大多数人用一辈子的了* t$ q  f- h7 E0 S' ~: f' l
1 [0 g4 ~9 ^; O' D
本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。
( ?% _4 K3 ]/ A$ h
! N; l% o0 x7 f" D8 \# \本人最常用的词典:
3 q/ v. o' R) D" ]1 c主力阵容:VOC、ODE、WBD。5 h6 ~$ U( o% ?
三本都是中型词典,收词量均在14w上下,以本人目前的阅读面来看,还未遇到这三本里面查不到的单词、未收录的义项。据说史上掌握单词量最大的人是政治家兼散文家丘吉尔,也没超过14w。除非钻故纸堆,恐怕用到W3、SOED的机会不多。
) |: h& u2 }* _6 b) b
6 j: i/ G, u- N! k( M" w" A- |5 z替补阵容:LDOCE、词源、短语8in1、韦小黄&韦小绿、Garner Usage。
/ g  q3 J4 O+ v  rLDOCE用来查常用词的惯用法/搭配、语法信息;
1 o* a1 f& J; J! Q词源用来辅助理解、记忆单词;
; g$ _/ R& b. g; P1 o3 Z% I短语8in1用来查漏网的惯用搭配、非正规用法;  |; L$ T, _# Q/ H3 A
韦小黄/Garner Usage用来辨析/比较同义反义、正误用法;
- i2 u  j8 f# A( G" f. D0 u9 L* v韦小绿用来辅助理解、记忆大词。小绿真是本好词典,有人说里面收的单词都是一辈子才能见一次的那种,其实不然。它虽然只收了1400多词,却几乎都是高频的大词。从本人的使用体验看,查得率相当高。比如最近看新闻说一种超大蜘蛛,里面有个词arachnid。别的词典只是干巴巴地说4对脚的生物之类的,只有韦小绿说了它的来源:从前有个女孩叫Arachne,编织技艺了得,把雅典娜女神给比下去了,结果激怒了女神,被她变成蜘蛛,终身织网。这种解释多有意思,看了永远忘不了。% z* I- y# `0 J: Z

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

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。
8 J* q4 |1 g0 [6 o% w! s3 Z其实只是你没有发现而已。- l' }" V4 j$ h9 q7 I! i& y
ODE: http://www.oxforddictionaries.com/browse/english/
. ~% C0 H$ Y. s0 N  g* z) uRHD:http://dictionary.reference.com/list/a/
/ X: R  s3 m. P0 c8 M: }, }0 n% r) WCALD:http://dictionary.cambridge.org/browse/learner-english/
1 ^; w" h/ ?$ F, K* D  y9 j$ e6 `  W" i
如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。
' p& F: j) ^' ^6 q8 \# E% D以第二个为例:2 \- L7 B* ?3 V1 {' Y
inurl:browse | inurl:list site:dictionary.reference.com
9 C6 l, y% B# ]: g; j9 r" T0 q- T
PS:最近才发现这里,发现资料很多啊。
8 R4 p* u2 i* H

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧1 M! y, v) I" n/ f2 U- A& y; c

. {- x6 E9 c( L, }假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改& i& t9 n9 `! ]
或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下; w3 U% B" Z: d  J# A5 s( }
结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。. F$ r! n7 I1 H/ E; o
这里有个比较省时省力的小技巧,可以快速定位到想找的地方+ P! S: i( w. L; u, G
' Y) T, C1 y$ \% s* K2 \
1、Goldendict里,在想修改的地方点右键,有个“审查元素”:
3 \5 d/ r" @$ x) x% n6 r* H
3 O. r6 x" A$ x3 Q5 S# Z, H( h% H: w) }8 `% i  P4 x
2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事+ H$ x, l6 k3 ^$ l+ ?! v$ k

3 i' q- Q. f( C
( {6 R  f$ i' l+ C) u" T; o3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方
: r" Q8 S* f( s4 q4 ?4 @; y/ l" @
0 k& W$ }# W( e' Y
6 b( h; o, e. f! S收工

该用户从未签到

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

: x7 x# m: z) j0 J! ^8 O5 n$ I( [0 i8 e6 e! _) i

) v1 x+ R; W, |8 u0 z/ R* ?6 q4 E& l6 @2 x
感谢楼主分享知识和经验。8 j/ X: E$ e! \; _
$ {4 |8 Z' W: {( f
每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。9 h3 }/ p& i9 w# r/ }- Q+ f) C  k
1 a" R8 G& l  N2 r) A* ]1 q
私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。
( v/ |4 W8 F5 d6 @; `* s4 q+ r) l1 y" H% Z
但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。
7 `3 q0 \4 q7 L3 C# H- n8 W6 ?- g; u- C  Y8 b1 t
除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。
' D" L7 _8 t6 G  C1 }  u6 R; Q5 J+ _* T; i$ d; P0 [$ y- P

% r8 k6 U; ~1 ~2 _* k8 r0 q7 H& Z% @- X' _! D: D
: c1 Q3 N) `8 f0 V1 b

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件
1 J/ e* c" y" l, C/ n5 s
  • EmEditor
  • Beyond compare
    : o; {9 ^( \" L: G

; C$ o3 g2 Z2 M5 @
: Q& P9 s+ |. I) F  L; T前者用于编辑,后者用于差分比较
! I5 T4 H% [: g处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

发表于 2016-6-8 07:41:03 | 显示全部楼层
bt4baidu 发表于 2014-10-25 21:017 g4 ^% S- R4 a# ]
现有的mdx词典,其实足够绝大多数人用一辈子的了; I7 N+ U& d& T) y8 q

3 y9 G1 @( B- [  G2 \; t/ X本人前段时间制作、收集了不少,经过一段时间的比较 ...
3 X1 R- Q( F* E" e- H2 U4 \# C: o
肺腑之言。

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考8 Y# u9 I0 P0 P
) T5 E8 L2 g6 S5 O2 @
网页设计中最常用的字体有哪些?(中文和英文)
) V" M- Q" e" Ihttp://www.zhihu.com/question/19680724
+ \9 V5 X7 h2 A0 b, ^9 d; r3 _0 g5 d+ ]1 h4 P, W- M
本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode* p' O; Y3 B6 Z( G2 T( ^
这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全
: |' `3 W) _4 T0 D! q. @2 T另外Open Sans字体也挺漂亮3 N" h( E# Y" V: W" z& 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
    $ ]1 Z* ^4 c: ?+ w* l5 _$ @最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...

    - `# [8 p/ }2 j; n- S感觉找到适合自己的问题好少啊4 h: \% b4 u! y( w; ], D9 r
    这个适合的话感觉是兴趣和难度
    : B- u- M  A* `* u想请教一下楼主是怎么处理这些问题的呢0 A0 S' x1 B5 A" e1 h
    还有种不系统的感觉
  • 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 编辑 4 j0 P' ~( C; j( A9 \
    $ G3 j7 K: \* [2 E7 n
    写得很好。刚看前几行的时候,的确激动了一下子。虽然没怎么懂,但是第一次能坚持把这样的东西看完,觉得也是对自我的一次超越。谢谢!

    该用户从未签到

    发表于 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 编辑
    . O2 N' ]' a. ]5 R& c- k, V; K* A/ E9 n
    java和.net就是个垃圾,我懒得提而已
    ) Q5 @+ ^) k# ]9 U: v在Linus这样的大神眼里,连C++都是垃圾:
    4 G$ P9 Y  Q2 Z% }5 T8 Uhttp://www.csdn.net/article/a/2010-06-12/2187859 n. A9 I" v3 v7 R2 K, z5 x
    3 E) V; T; D2 M& ]4 o
    如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。' W5 H' _1 |' ~5 Z; o

    9 O% d: I3 i' B! n9 o- d* H0 B不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。
    ) K! w) j* n4 L* ]( n我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。( g2 p2 A3 l4 V& D* ^
    这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。9 p8 Y. \3 L! |' J0 _; _
    不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。
      S0 o# M+ s. M& w2 l. s  u为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?( v9 A/ w, B7 l" Q
    因为垃圾代码太多了。
    7 R6 w: C4 J9 Y7 @' y: L5 g4 ]1 ]3 U7 G/ @2 \) l

    : e7 t6 p, t8 n& b9 J$ B& d' a8 V8 {

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑 9 O6 B1 O  ^; L0 [# H# r

    4 ^. B# b$ \6 A% |3 _( b- p  k; R6 W& n( ^- [9 U9 S5 v+ H
    算了,道不同不相为交流/ }! N% S5 V- X  N1 Z4 q8 ^# D
    想起某个梗; H% Z7 W0 p$ b8 i
    程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!% U# a- C, R7 o, j9 z  A

    % c' n, L/ \0 e. h1 s6 e自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。. N. P% h: i2 d! v' c
    - ^8 q+ B8 D( d2 v1 x/ y- D
    另外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* {7 `- P' S+ p  v0 Q2 U
    算了,道不同不相为交流
    $ `# Z% a7 R2 y( n! A, f想起某个梗
    / K: i; q7 W4 [5 ?  t程序员眼中的编程语言
    3 B5 x5 I* j' U9 z: m7 ~8 e) f: n: s" b
    不同的语言适用于不同的人群:
    4 e9 K) C" \6 O0 ^" U如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。
    ) w$ c" @/ n) F) ^! _1 d9 _如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。
    * v- h( b8 O  {+ G/ i" x5 P至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。- N% G; s/ Y; d
    & P6 y& a# |0 W4 `+ s* G
    编程语言的口水仗永远也打不完,不争了5 l: X/ h8 E" @- D7 G0 y$ w

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:358 S! @0 i% Q2 F, x% r$ D! ]# z
    不赞成多线程抓网站,但是好贴子要支持!7 J. Z, R: b; n8 o: W/ I. ^' n' m3 d

    7 n6 U9 q* e# @" S% G4 K% }自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...

    5 \  G5 {5 t; K( B下载软件?推荐一款?, `( [" x! P" M. _/ G6 u
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    + P5 _/ p9 x3 X% Y现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?
    3 A& n: z4 l1 s4 G% E3 Z) g比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。$ Q) Q. i2 }5 g: d2 f: z: Z" F
    除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。" m8 C4 @9 R9 a9 i+ S
    目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。6 S) s# E$ ?% o/ r4 `/ U  ]
    3 l& B% M$ {* ^8 K# K, ~
    至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。
    , ]( d! e1 f5 \8 I9 C' \对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,
    / v. Y" d& q; s目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。
    ! Y+ l) H3 w' ]9 {* \$ R% a/ ?" u

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:( U: a( K9 C" p) [
    随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。
    - E! u' F0 Y: J. d. h% ~未来会出现一个新的行业:私人计算机管家。. s* _% g1 s$ N! c; L: ]5 J7 Y% X
    专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。7 w/ v& z9 v8 u& I' I+ I& n$ z
    但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:29) y- {; B6 A4 F% y; S, Z: p
    下载软件?推荐一款?
    , M% W4 m  j# A, E9 i最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;# l! }9 M5 y1 H2 o& I& X$ i2 z
    现在99.999% ...
    " i/ }; X! m7 K8 u$ G0 ^
    用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。+ d5 @3 N9 {  X- ?6 a, c

    ) V' L/ Q! o& p; H十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。* h* J' J2 J6 L& n! P; E
    4 J" i% [) T7 I9 G( d
    用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。
    ' |1 u' }' G2 t/ T5 q
    8 L. [8 ~2 U  c, I我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
    大熊部落 发表于 2014-10-21 16:18
    # ]( j  g  q( a$ Q3 Q  Y; J- B6 B用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...

    ) J; s/ R. {+ u( C6 p$ O" }我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件
    2 D% E, q; {+ Z* I( ]' T  I/ Z2 \
    ' W% X' D+ k  ?
    下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
    ! Z) j- a1 V' @: }# k4 x
    推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

    该用户从未签到

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

    " h$ n! `, h7 i- ~8 Q1 m/ H- I. l* k" b( m2 R: C  t9 i
    最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差
    " O  m7 `) n$ ~* p7 R9 k计算机是用会的,不是学会的;
    # U; B/ c" U1 D程序是调试出来的,不是写出来的
    ' h2 x9 n7 O. k# J) P* S" M
    9 \: r/ E, D$ o& r既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。2 m3 O" S( L2 }6 Y& d
    你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

    该用户从未签到

    发表于 2014-10-22 21:25:59 | 显示全部楼层
    bt4baidu 发表于 2014-10-22 20:21
    # _/ x! G5 \+ n) X9 S最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...

    + F: e& t$ h1 r9 B# {4 M: |多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。% X4 H1 I2 r% W1 s0 S
    3 d8 h7 W: L- `. b4 g8 P
    我的一点网络小技术是很久以前在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, 2025-6-17 05:15 , Processed in 0.031445 second(s), 27 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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