掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 51066|回复: 148

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

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑 % T! r/ R7 k( _! J- w9 h- I

1 L  G& T" _5 O% Q) T+ S' d0 s这篇文章主要是给计算机小白和初学者扫盲。( c1 |% c$ _0 q1 O% y
本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。
. W9 h7 k- H( ]/ w& n1 ?只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。
" {* D4 c$ p+ V4 U
! ~. y0 L' _5 B" R一、计算机的两个终极哲学问题
& `5 X3 O, R3 C; _1 K1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。
6 U; W/ z3 W  Y. J( a# E4 `图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:! S  S9 {' v) ?, X/ F+ Z. c. z
设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;6 k5 h# }6 {9 g- F1 }3 N4 b
机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。: O  _( X; R7 k' j
方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。' R% H# ]3 M3 X1 M7 D7 H
“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。5 a5 Z6 ]$ o4 [0 U7 c1 h
4 X5 {  F' d: d3 \/ W) V! t
那么要写出程序,立即就会发现不得不解决两个问题:$ u* Y/ V" S# u/ d3 u$ C
1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址+ o( ]% f" C. D2 L9 u
2、怎么把两种方格区分开?也就是特征识别" T( y7 J, E& n/ C
这两个问题,就是计算机的终极哲学问题。
- L" m9 u$ N# o7 b% j6 k理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。2 P0 W* |+ z. {( X# Z. a5 }0 |
下面的讲解也会以这两个问题为核心展开。
( R0 X) S( W8 _  y, D' V5 d: }' @/ ]0 Q. U( l3 p
BTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,
& P7 J, e' ]: x6 ^; ]* H——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。
' J7 Z+ N3 p7 O3 a所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。. y: K& o2 m1 c4 ?$ Z' V% `
前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,
) N& l/ T& Y0 v; y1 \! a而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。
! O& b, z0 I  \3 _" ^6 l5 p具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。" s9 p% v2 O! Y* E+ o

& |1 N% ~6 S+ `9 Y, L# t0 C3 d不要觉得自己上学时学的不是这个,or文科生,就不行。" ?' L* f8 V2 X. a
江民杀毒软件大家想必都听说过。
+ I4 R* k% p' V7 g) D创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。
9 y8 F  C( s: ^' Z. a咱不奢望成为专家,写写程序总还是可以的吧?2 q2 {0 b/ V, O" c- l, g

& f# b  e9 m2 S+ l二、采用何种编程语言
$ l1 R  \8 X  D上面已经说过,存放、读取、组织、区分数据是编程的核心问题。+ n( h0 X2 k7 w. _. P
显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。$ }0 y( @1 H* m6 h
抓网站,恐怕没有哪种语言比Python更方便。
. v3 F, e! b% Y$ `1 {7 ]* t7 u当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,% F1 L1 u4 n  m5 S" I# W1 J+ r
计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,
1 G" m6 @, c( P! A没有慧根就别吃这碗饭。* d$ q! Q* ^, J8 z0 z  A
0 Q6 m4 y( s8 K  _, ~5 K! x
三、网站抓取技术
  j' X& p. [1 ^3 u8 ?7 K; `1、下载某一个网页,提取其内容
3 L+ m( q% z  x+ J: F以前写过一篇,就不重复了。参考:& e8 w% S0 p- ~! t" v1 s0 `
用一个简单的例子讲讲怎样从网站上扒数据: {+ M: |% p7 Y& q* j
8 o! \; B; f( t8 O' B4 Q
2、寻址问题( m6 `7 |* C6 q1 u, \
下载网页,自然首先要知道网址,也就是东西放在哪儿。
7 h1 Q# |/ E" g) B+ y' P如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。
1 J$ ~; ~9 n$ t& B& ]但是大部分在线词典,到底收了多少单词,事先是完全不知道的,1 X( @6 }8 M/ p& v% \2 p; k
要把单词弄全,就要想办法得到每个单词的网址。
! \, h. H! X) I9 t: b. W8 K总结各主流词典网站,大概可以分为这么几类:! p* Y8 B& E. o' C9 }1 x/ C
I. 事先有单词总表
3 k6 d, `) {) E/ c5 x, @6 D比如http://www.vocabulary.com就是这种类型。
" x+ x# U$ D5 D! O- W4 o1 }" h& M" O  K它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。
( K9 W; g+ J5 q' k9 `8 H
8 J( v" L. S; \* Y9 G/ nII. 网站有索引页面
  |  ?, Z; m. r  D( a+ V# @5 ?如:
6 U( p& \! O5 D7 e8 X" nOALD(http://www.oxfordlearnersdictionaries.com/1 I" r' G, g$ ?$ Y; C
它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/
. F$ T) x8 y3 t  TLDOCE(http://global.longmandictionaries.com/
  Y! j0 j" S0 {采用框架结构,左侧边栏就是索引页1 L: D$ G: e) K( Y; t% `* R
MWC(http://www.merriam-webster.com1 `% b+ X0 B) T/ p* l9 Z
索引页在 http://www.merriam-webster.com/browse/dictionary/
: e% ^. B9 @+ \4 y等等
4 H4 z  P; m- {这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。% v! _' g) N+ `) K, U7 }+ r8 U

  1. 3 m" D* m% f! k) T3 b! B& E
  2. urls = []
    : m, V+ F5 @( Z6 }- }; f
  3. for someindex in indexs: # 循环所有索引页0 R! \' p6 U# U9 W3 U! [
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    2 I0 y" |  K* y8 m' W" a8 A
  5.     browsepage = getpage(browseurl) # 下载索引页面
    : Z: U% B  |/ E0 x1 A( v7 C5 x
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域
    6 k- |! W$ I8 S8 U
  7.     bs = BeautifulSoup(browsepage, parse_only=target)" F- y' v: Q" \: x! k
  8.     if bs:5 A. A; j( P9 ~! c7 j* Y
  9.         for a in bs.find_all('a'):
    ; ~9 D( b( }2 Z& X1 H% @
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接
    3 x* i( _4 ]4 {8 E: y7 Q
  11. 然后:! ?" E6 U  M" {" Y$ |  Q
  12. for url in urls: # 循环所有单词, W3 S! i8 O# p
  13.     wordpage = getpage(url) # 下载单词页面
    - `9 y2 g& s0 E9 B6 b# d6 i
复制代码

2 v* a- c, r. Q3 c1 G$ N. d# }, q1 T( U
III. 索引页和单词释义一体型网站3 |# F+ K1 b: T. a8 S: A
如:Online Etymology(http://www.etymonline.com/" n; t4 R! Y2 o, m0 n+ E
和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可
, M8 e; I" _+ }4 a9 P

  1. " M7 M. {3 e9 h& h( r# e0 T; G
  2. for someindex in indexs: # 循环所有索引页
    - E( I+ o/ x+ i6 H
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex])$ [: T. y" U( J
  4.     page = getpage(browseurl) # 下载页面: U5 y8 L+ I8 B! ~! K
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域
    # J( Z" f% O& H3 c
  6.     bs = BeautifulSoup(page, parse_only=target)5 t4 S: w# g0 e# M
  7.     for tag in bs.find_all(target): # 循环抠出单词; j& R" j+ s% T  }( |; w" E- c) U
  8.         worddefine = getworddefine(tag)
    % d* D/ e! b2 E1 h( ?4 |
复制代码

" {; r* o5 E+ H/ p; n9 x& H0 J/ _, r
IV. 片断索引型网站
% T) J2 R7 \# v8 T8 N4 m3 c如:% Q( ?% ]6 ~4 y7 b/ [
ODE(http://www.oxforddictionaries.com/
2 Z. c2 X% ?3 h; J- F每查一个单词,右侧边栏有个Nearby words: Q( J( y) G. _2 f
RHD(http://dictionary.reference.com/
0 x) i  z& e% v/ h2 l5 K+ m# U右侧边栏有Nearby words. e- |( T) W- v) G" P. O
CALD(http://dictionary.cambridge.org/+ a* E- ~! k& D4 |  C# r' E
在页面的最下面有个Browse栏,给出前后相邻的单词: i, I$ U- A8 y2 u
这类网站没有总索引,只好利用它的Nearby栏。
1 L, N8 s3 G: ~思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,
2 j0 ?, V% f% g: C每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)
- J2 o8 h. b* p$ X  ?, ]
  1. . O( l0 U5 p& x$ ]0 m0 h8 l
  2. cur = 'a'
    7 i. f) N* `" C, {* M
  3. end = 'z'" u' [+ [% b! P2 k5 q
  4. nexturl = ''.join(['http://somewebsite.com/', cur])% Y5 p% @8 h  U. D  h. K+ J% A
  5. while cur!=end and nexturl:& \( h' t, F5 Z/ I, [
  6.     page = getpage(nexturl) # 下载单词页面7 P" J( b0 z% z/ L' u3 e9 |
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接% ]6 _6 N* D  z4 \, m2 k
复制代码

. D* E) r& B- X. s$ U, [# {$ M) K6 v$ I- r6 [" ]
V. 完全没有任何索引,那就没法子了
) E8 M0 ]3 L$ ^4 y8 A9 R% u2 H当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理
* c1 ^) W6 M; ^; w5 P理论上也是可以的,就是效率差一点;
% d  u4 h8 o+ Y) X+ m另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。6 Q$ b. G4 n( W$ D6 m" M5 L; |
( \: q8 M; y3 _6 H
3、提高下载效率
/ q! g8 Y. [; i- d( @- z: m0 ^I. 多进程
! {  J- b9 u5 {7 _# u" P6 Z上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。/ j2 L. y, q/ O: F+ J, ?
实际抓网站时,这么做效率显然是非常低的。2 x& a* ?% ?3 r0 Z1 L' o& T
假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,
5 ^! [) T( q- s6 c; S9 E有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。
/ Z% L  u- g" D假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?) q2 J7 [5 ~2 z( f
要速战速决,就得开多进程。
9 n7 ^& J' i: r  n同样十万个单词,分成25个进程下,也就是28/25=1个多小时。
) p  X3 v4 E8 M* L! M3 o, ~/ p) v  E再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。$ c+ ~! U1 V9 L) s# i! K# \
在Python里开多进程,同样十分简单,
& S9 g5 U! ^# E, v9 ?- G
  1. ( K- l( D% L& g
  2. from multiprocessing import Pool# ?5 e/ S$ l1 c# G1 s( C  W! l
  3. pool = Pool(25) # 开25个进程" J, u5 z* L. j3 ~% R# z
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数2 c2 o0 _' H/ q7 y* w( z0 W/ T
复制代码
8 D# I0 w/ t% f) |* k  W
这就搞定了。
+ ^5 Q- F" g0 g  m% W1 U0 q$ O! b3 x% c  U" }6 ]6 {
对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,
3 n6 F" V! ^  N$ ~/ B关于IV.,事先没有单词总表,就只好采用区间的概念,1 D$ n+ K4 [% T0 Y8 B( L
比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载* j( I3 w" t" d+ N6 \

6 C8 u& m: R% r5 R初学编程的人,一碰到进程、线程,常常有种畏惧感,
! V: c4 E. h0 X4 k6 Y& W看到同步锁、共享内存、信号量什么的顿时觉得头大。
4 X0 x/ t- F8 d. \- @! O其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,
& M% v5 n: e  T/ M+ i其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。
% j5 O+ t" y/ t$ @3 U( m  @
2 h% z; n* z$ b0 \: O. ZII. 断点续传7 ?  u: v# n( Z! M' H7 x! ?
事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。( X+ Q2 b) l& i# f- l2 {; N
所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;/ q- a  ~) S* [9 e% O: s
即便无法自行恢复,也得容易手工处理,不然可有的烦了。
$ S7 w2 O4 J" F& T3 F0 O# ?- ?这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,/ g5 V" q# }; ^# ]
直到所有区块下完。0 r: B1 U7 T" H

  1. , c+ P& L$ {9 \! A! z
  2. def fetch_a_word(part, word, url, data): # 下载一个单词( h+ O) j. e: c# D
  3.     word_define, failed = get_a_word_from_website(word, url)
    ' Y+ H9 {/ D: n" ^( f$ y' r! k
  4.     if failed:) I& A) M* C( \# n$ X6 K
  5.         dump_failed_word(part) # 输出下载失败的单词及网址' N. \  Y7 k$ h7 b
  6.         return False+ A3 e1 e) g# \
  7.     else:+ P/ ?7 ?- _: Y' J; y( M2 S
  8.         data.append(word_define) # 保存下载成功的单词数据9 {! g# ]3 A- C! Y" Q% o  J! V
  9.         return True
    ! i" a6 Z5 b! a% g) g$ S9 {
  10. : W2 E4 E# B4 z6 j/ y& c5 v
  11. def download(part): # 下载一个区块
    9 e/ @" j8 B' m7 s4 i
  12.     words = getwordlist(part) # 读取单词总表
    & _. I5 Q1 T8 O1 [
  13.     if hasfailed(part):/ x3 R# A2 L- @" V) E3 n
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址9 S/ t8 R, D5 n; H, e
  15.     else:# w8 G5 w; U0 R% Z$ J6 G/ [4 E# o
  16.         word, url = words[0] # 首次从头下载+ Q7 ?6 U+ p/ {4 _0 e4 `0 }
  17.     data = [] # 用来存放单词定义# g9 B) L  t8 ^# z2 H" X1 j9 ^& F
  18.     while not_end(words): # 循环下载
    : N! M4 b( i: ]1 G2 r
  19.         if not fetch_a_word(part, word, url, data):5 P- e$ G* Y3 b* l+ n
  20.             failed = True
    8 o) ^- [5 h2 S+ _
  21.             break& Y; G5 P. }4 v- y% H  i7 C' x
  22.         else:
    / S( G! e' n+ n! l
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址
    + N- I1 ~1 V7 h1 ^, ?- A
  24.     if failed:
    & ~! l, i: I1 K4 f7 O* j+ T/ ~7 w7 P
  25.         suffix = '.part'
    * z$ L: N# m: c/ ]# a& n
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'
      N) B3 X0 F$ Y1 {* @' s% ]4 ?
  27. 5 t0 z3 A% o  F) H1 R$ A
  28. def isfinished(part) : # 判断某区块是否下载完成
    - r8 O/ `/ E$ M
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断
    : X( P5 z! l/ O5 \4 u" [7 X- i
  30.         return True% C( p, m1 L9 n- A2 L
  31.     else:+ N$ j1 J: h# s& |" B
  32.         return False2 c0 w* c5 Z) h% Z
  33. ! F3 _- h9 _9 U/ a
  34. def downloadloop(): # 循环检测未下完的区块
    ; I1 @0 M" ~5 F
  35.     finished = 00 |- ?  l9 u! u2 \
  36.     while not finished:
    / l  b- z4 K; ?5 ]- T- M) a
  37.         nf = [] # 没下完的区块
    ; a& \: R. T, C  }1 e& l
  38.         for part in parts:* I# g  r# t/ J& I/ B9 i" w
  39.             if not isfinished(part):' k6 \  [$ Y- G" Z( r4 v6 v" X. K
  40.                 nf.append(part)
    ; c8 `; U3 H! P1 ?& @' t
  41.         finished = not nf
    + q3 U7 k5 J. T/ u. @; \
  42.         for part in nf:; T- |8 C( Y% C4 `
  43.             download(part)
    ! `) V- W0 t  I8 V
复制代码
. b# X7 K7 e2 l3 [+ g2 S

/ z: a* e+ c2 c0 u# R# f% fIII. 高速下载网页的小技巧% f$ B7 ^1 _: h1 `2 j' M
Python里面有三个库都可以用来下载网页:urllib2、urllib3和requests。7 V+ w5 N0 M/ G" _1 L
其中urllib2是Python原生的,urllib3和requests为第三方库。5 k) n1 N/ x& A+ Q4 \
(似乎Python3已经把urllib3收编为正规军了)
0 \2 u, \5 `) D* P+ @9 e这三个库有什么区别呢?+ F8 k! C. x* @4 p+ C) r" O
形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。
* L0 p# J2 n* \, |9 M0 h: i( M再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,4 L. H/ c9 |+ _" d
所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。: ]$ X& S$ [% V/ b% s2 Y
但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。
2 f( V/ |+ k( N! X, l这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,0 _, P$ D7 m& \$ v
通吃一切网站。- s& N: _- g9 U
所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。" A1 v6 d3 M* x4 ~* |' }
这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:/ G4 j% q8 k( y6 o. z# h; }
http://urllib3.readthedocs.org/en/latest/
4 i: m9 m9 J; X# ]: p8 b, t: Dhttp://docs.python-requests.org/en/latest/
% e$ J7 v7 ?  T
  1. $ J! Z' B0 g/ ^$ u6 E
  2. #urllib2( [' Q# s. r( ~; p& _
  3. import urllib2
    1 ]" r: C3 Q6 i  g1 H
  4. def getpage(url):
    ! R6 E# w' e3 H$ E$ V4 f( h
  5.     req = urllib2.Request(url)
    ; ~& e' j! ^% @) y! s  p3 m
  6.     response = urllib2.urlopen(req)
    9 X' F3 g6 T& ~& N
  7.     page = response.read()! ~5 H. `) E( j" o# e

  8. ; l" g; C- ^' w6 H0 _7 U
  9. #urllib3
    1 s  O$ I8 [0 U3 n
  10. from urllib3 import PoolManager$ M, C: @+ Z6 o6 F
  11. http = PoolManager(). R. `  Q$ u  H4 Y- ]3 D/ ?# z$ {
  12. def getpage(http, url):
    ; B8 Q! X' w6 h* c
  13.     r = http.request('GET', url)
    3 W2 m: K; S4 _9 Z
  14.     if r.status == 200:) P6 S. M! }: D8 i' W. N
  15.         return r.data
    ) e1 n- F7 ~; n  h& E' ^$ m, q
  16.     else:
      q& b3 d0 I" S# l
  17.         return None7 s2 q4 Q9 T7 s# [. _) X
  18. ( @+ a. d+ a5 e* {' e( w: t2 i
  19. #requests( L/ R) C  t! U7 P
  20. import requests
    . W* ]6 L! M. _+ r
  21. session = requests.Session()0 f; e( H- \9 ?: R# A8 ~
  22. def getpage(session, url):' `( D, Y* ?/ V4 e
  23.     r = session.get(url, timeout=10)9 h9 Q$ j8 s) F4 @% q% x, d
  24.     if r.status == 200:
    ' ~& Y4 X( g  _$ G, f' E
  25.         return r.content
    ' [4 w) u+ B# c
  26.     else:
    % d2 \" B; m' F. ?
  27.         return None1 G; O+ _+ g; n
复制代码

& v/ i# v+ z% Y  k四、后期制作: x* ~1 l+ C2 p' [1 ?4 p6 l; c; g
1、文本处理,是个特征识别问题。# P6 I. K& \  _
本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。4 p5 m) b5 T/ |- w5 c( g
当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)3 d6 U+ m8 _6 n, |6 H- ?+ J6 w8 c
都涉及到特征识别问题。1 \- x3 s4 _9 n3 ~! _0 Q2 U% @7 [
相比这些高难度动作,文本处理算是比较简单、基础。: [3 ~* S' a& h& c. @
Python里常用的文本处理技术:正则表达式、BeatifulSoup、lxml
: [/ a3 X0 F  J3 |* o8 w正则表达式非常强大,但没法处理递归嵌套的标签型数据7 V, }) t- ^+ p/ U+ {1 D
(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);$ b' d! n! a- H' A* F
BeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。
# s# N1 k. G; Q3 j3 [+ Y所以常常要结合使用。( I: C4 D" n7 m; {" }
这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。* v; f4 f6 ~% _: f0 _4 @
, P) @' o9 a# M( E# B% Y0 T1 V
2、排版' J; s$ s& N+ |5 `, Z
HTML、CSS的基础知识:; T, V5 F6 u" N/ W7 G
http://www.w3school.com.cn/html/index.asp# u% k" J* E5 k7 D7 ^
http://www.w3school.com.cn/css/index.asp
4 O# }* l# V7 D2 L- e* [# D! e6 z: i! shttp://www.w3school.com.cn/css3/index.asp
  h' V0 F) |. N6 D! u' F+ S% {非常系统、非常全面。
: c3 A3 O& u1 n( U- d4 i6 E排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。, ^2 |. q9 B. E0 Q9 z7 d
7 S7 c" N  v) }, F" n, d
五、结语( r; ^: Y9 y: v9 o; j! f( p3 [$ U
花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。" |2 ?* j& h$ x. |2 ^+ H( x
所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——! k9 f+ L& p3 `$ `  x
大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。! K( V0 n' D+ C- f; B3 g6 ^- v2 _

8 [7 h" P1 |! S* U/ d打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。
6 }9 w/ S9 H1 x, O6 A" V8 r4 Z, t* T, {. H; u4 b
只是拜托不要打扰别人,真想要就自己动手。+ X" G! S3 f: p& O* X. i
尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。, C, t- v8 U8 F  P# W: k6 T
水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。+ `' ^, w0 X. e% u0 ~$ m7 D
虽然每个人都觉得自己至高无上,应当受到别人重视,
2 R0 ^& G! `$ k: f其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰
  x5 S0 Z# D7 P  G' l6 B1 j
" ]9 e7 U! l7 P* |: J) ^! N# Z6 F7 C( \
========( L* Q% |" \. H+ q
六、拾遗
$ E$ s% J0 j: G关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类
: C& N4 z/ J# X/ ]' \5 p, G7 U确实如此
2 e" F. f5 y+ Y: ~( a: m5 p不过这里只是举例而已,不用太较真啦
6 @/ N7 [( ?; l' L实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏0 M9 M' J) }& e& U3 B
这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。
3 q" i" M/ N5 u3 o* N" U5 y即,8 ?. D/ }, k: r! R5 w" h6 o3 r0 S6 {  \
第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)) l. k- ^% q, Q3 x. M
第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)" e/ _$ |3 F- W4 q4 v
第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作/ z# g$ q/ V& K6 y  c( j% f% J
。。。
3 U8 R- Y& a9 H直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空)
- a0 t5 p8 A( b  W最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。; L9 N3 B& g% e" T5 n
形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。
2 Q. x; x, c- f/ K4 i因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。7 e6 n9 P" Z+ S; H

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:41- D" G, E5 S9 q. `8 q* r. \
感谢楼主分享知识和经验。6 S) b& J$ e/ N- w7 l5 t0 k
/ T7 `/ |: ^/ o9 ]( c
每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...
& Y, F) I1 L' o9 J
现有的mdx词典,其实足够绝大多数人用一辈子的了
* H' p5 o$ v  y* w* a6 w" Y  n4 E+ L& b
本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。$ X3 J. g6 }& M1 l# _; W* o  q! b

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

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。
3 B8 W6 _$ E4 [1 N( M其实只是你没有发现而已。
5 b% G& Y3 o. f) ?2 e; W6 e6 tODE: http://www.oxforddictionaries.com/browse/english/( Z. y, f% L3 d$ f% j, Q0 I2 t( s8 r
RHD:http://dictionary.reference.com/list/a/
  c8 }5 b2 Y/ |+ ^6 h- n4 jCALD:http://dictionary.cambridge.org/browse/learner-english/
& r$ H, ~3 t9 E$ V1 \! t! q
8 F- k1 ?6 b1 U" D# G  w$ q& o如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。+ l$ f) y0 @( J! @' S+ O* y7 K; K5 b  N0 Q
以第二个为例:
- r" _# o8 N% i7 h# I* ?0 v2 sinurl:browse | inurl:list site:dictionary.reference.com+ D: @3 `' g8 Y
' T) f& h( f4 s
PS:最近才发现这里,发现资料很多啊。
+ U* O& V# f" g# j% ]; Q4 {! {

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧0 N' F7 D3 a" y+ ?1 u3 V
1 v) Q: }+ H; i9 G3 U4 G2 \/ H/ r
假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改
) _$ ^, J+ U+ S1 w3 Y9 p或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下! O# b( e& C) ?& {
结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。
6 ~' C+ p- v% |' n: v8 s- C这里有个比较省时省力的小技巧,可以快速定位到想找的地方7 f! @! {. _" k4 c  D
0 X2 E1 @- V6 |4 [9 c) t2 @1 K# }
1、Goldendict里,在想修改的地方点右键,有个“审查元素”:4 [+ M$ l; j# G; k* A* }8 I7 e& w
! _3 q8 g5 K1 I+ R; P" W' r6 g' `
" S* t" \9 ?( r3 ~' a% F# j* j" d
2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事
. u1 A- {8 N4 l; A) n
) i4 k- m4 A9 X
  p' S* h: {; B! d3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方
! ^0 M. ^. l, B  Z) Y: q* F
3 V8 Y- w: [1 ^& P! \. K9 V; y# X7 ~; f% I" G3 i
收工

该用户从未签到

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

& J# e" Z( N3 g0 F. E. S( ?, ]- u: V2 h; f. M! R2 ], e: p

4 G. F4 x7 [  w! }" D! ~( [. R; w( c3 e$ p( X+ v( ~
感谢楼主分享知识和经验。
; p+ C' h% y- N) e! q
( v8 B1 N1 M/ V4 W/ Z每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。0 P1 \* L( K2 `+ u; M3 L: N, P
$ [8 p. d8 y! n+ Q
私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。$ P3 l5 V& x( V; |6 ?1 n) y  ^
. H, \; Y0 o$ [9 k/ X1 y1 S
但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。, J' C; E' D7 K
+ J0 n3 `; R( N2 r. Y: x
除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。8 t+ e7 S& U7 m3 M

0 r+ P8 q" k: c/ z/ E# P& k6 _2 w! A6 b

( X/ F6 i$ B' I; v" k, z& d- B+ d, v7 H6 j

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件3 O2 b/ M; y/ H% r' {
  • EmEditor
  • Beyond compare
    # w" j' C8 c  I. y

& ]' l/ Q6 Q$ |& R3 D/ e1 v1 @2 w' K9 f. L
前者用于编辑,后者用于差分比较: q6 E' ^( s* f" x. v
处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

发表于 2016-6-8 07:41:03 | 显示全部楼层
bt4baidu 发表于 2014-10-25 21:01
9 t) \+ C% g# i$ R8 u+ B现有的mdx词典,其实足够绝大多数人用一辈子的了
- G5 t: i  v; g* F& r5 Y% s1 z% B* J- T" i
本人前段时间制作、收集了不少,经过一段时间的比较 ...

! v/ Z: a9 W  t+ _肺腑之言。

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考; t, ~2 a, ?- n! i& F
1 Z% W( B# i. Z& m$ e
网页设计中最常用的字体有哪些?(中文和英文)
2 R6 W7 b0 a- t9 yhttp://www.zhihu.com/question/19680724
% J& C4 H/ x& m2 D5 t, m/ [! S' R# m) p9 y. J: }  Y( i- C) j( r" X- O
本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode' }5 ~  i) r1 z( M4 f$ T1 O* w
这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全) n. L- @  f; J+ N
另外Open Sans字体也挺漂亮
0 x5 n8 G1 Z! B* u( E( L$ ]
  • 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 n9 w2 r* A- d* V最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...
    4 z& G) Q8 |# r
    感觉找到适合自己的问题好少啊
    2 m4 s. T8 G; c7 D这个适合的话感觉是兴趣和难度
    / n1 I( D2 A& K5 y$ {想请教一下楼主是怎么处理这些问题的呢/ V, Y8 b! T" H* P; D1 a7 F/ M2 {) c% f' p
    还有种不系统的感觉
  • 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 编辑 7 n7 P+ p6 d' C+ W/ ?6 z* o
    6 i  Q; V4 h- Q. s
    写得很好。刚看前几行的时候,的确激动了一下子。虽然没怎么懂,但是第一次能坚持把这样的东西看完,觉得也是对自我的一次超越。谢谢!

    该用户从未签到

    发表于 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 编辑 ' {; q5 V. S$ ~7 O
    & h2 o. ~7 ]+ P8 t% F% B
    java和.net就是个垃圾,我懒得提而已5 b* O$ {7 a( e* {
    在Linus这样的大神眼里,连C++都是垃圾:
    ) q/ ?# W% ]! @; f1 S9 Dhttp://www.csdn.net/article/a/2010-06-12/2187855 s1 K: _8 y* C: ?/ v
    , k: S4 h, p- Q$ t* X: y
    如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。
    + E' H, ^' k9 R. r2 X5 Z. G% R
    . g7 H% x$ O+ b/ N2 X& V不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。* X$ r& t& W: [3 V; _7 i
    我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。( }" M+ H) V! G$ K% n
    这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。: I0 v1 g' S  `5 g
    不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。
    * s6 c2 t+ V* h2 v为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?+ _$ E. o, U* D8 O( @4 m: Q5 R
    因为垃圾代码太多了。
    : d$ z) _. _1 H. \* |) W0 E* P
    * J1 k1 o( o, h' l: a! I, o4 X1 a* v1 y2 Q/ y. ^; o9 `

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑 0 Q9 r, ^0 O, S) t

    6 g7 E$ A+ h6 {4 N: a# B; d1 e
    ! [9 L7 b! X+ J* R2 Z7 w0 r算了,道不同不相为交流
    5 n. O$ Y+ f. Y+ e0 ~  Y4 J2 j想起某个梗* R% H0 D. F' I  ?0 S# s9 J
    程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!
    3 E$ D) t- b% t! e4 n2 @* X4 S, I2 w4 L; b" P3 F, B( X
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。
    % W! p# R( O: a& L* H
    ' G3 G" r, B; `/ [: L另外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
    ! {, r, m5 ], I4 z3 z# O7 _算了,道不同不相为交流
    7 A4 F0 I5 q6 A! |& X6 i; m想起某个梗
    : v$ G) k: w; D程序员眼中的编程语言

    # [+ i1 @. e0 }; m2 ~8 C) f- s不同的语言适用于不同的人群:
    / M6 p+ i$ Z+ _: d) V如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。
    + G0 u1 d! U: i, n; c2 ~6 c如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。
    ; [; Z! Z$ c& r7 F+ M3 s* O/ k5 p0 D% u至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。* x9 z$ @7 H4 G4 W9 ]" O

    4 V% X9 P: c+ e+ v7 s编程语言的口水仗永远也打不完,不争了
    . {% c. A5 J* J/ U! t9 X

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:35
    , C) B- ~* }. p$ d) F- ~$ C1 v不赞成多线程抓网站,但是好贴子要支持!/ c/ `+ Z% v4 w# @! \* F

      p  W& N) O3 k' C& E自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...

    - q# X& ~- B. m下载软件?推荐一款?
    : c' ^/ X: H* a3 r0 }最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    + C1 M, a7 I4 d( o, x& z& o$ q2 R现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?
    5 V( [( G/ y) T) J" T比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。
    " ?: E' g' _" b3 R( z! e6 f3 M. l; ^除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。
      G0 q/ k$ S# p- L目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。
    & {+ B1 q# }" p! B7 e, ?2 d$ z5 s  }
    至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。
    ' Z0 V/ A) V. ~- H7 u) m对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,
    0 I8 ^' j8 }( I0 |目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。
    7 \2 n& c- `) s" A) {# B

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:6 r* C& R! O7 y0 L2 I
    随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。2 a3 q. o1 i$ z1 A& v
    未来会出现一个新的行业:私人计算机管家。9 w! Z4 T8 A+ U$ V
    专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。
    ' E/ f. l% Q6 q但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:29
    7 |- n0 f' L) w7 c. J下载软件?推荐一款?
    5 Z0 Z3 u6 a: F8 G& F最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    5 b! L0 P% K4 K  b* A" K现在99.999% ...

    7 N( y1 h8 B/ T0 b- h用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。# O( \& g. ~* m7 G0 N% L

    0 v% D1 g: u; f& w4 g十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。
    , M6 Z0 @, R" w% c& v" y9 V* G/ J3 j/ W* F) Q/ l
    用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。
    ( `5 a# Q  _7 k, _; _' E
    ; `( _4 P; r( q3 B  d我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
    大熊部落 发表于 2014-10-21 16:18
    $ t! e3 x- Y; \5 {7 P. @- `用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...
    $ Y4 F: k4 H" L$ I" J7 q
    我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件
    , j5 A2 b4 C% A
    8 b" w! e9 y( w+ ], i
    下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
    6 v5 e" z( t* s5 v, e' q
    推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

    该用户从未签到

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

    : ]7 W! {( Z2 H# c2 J( C最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差
    4 x, O/ U# f% _1 E8 J5 \& q% o计算机是用会的,不是学会的;8 s3 u+ U" R) n1 w0 P/ f; N# {* e
    程序是调试出来的,不是写出来的
    9 g4 e0 w1 v+ U2 U* h4 X# Z$ Y  l/ v0 X% `7 r
    既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。
    : }/ {" w% X5 S* p6 l: P. Q. ]你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

    该用户从未签到

    发表于 2014-10-22 21:25:59 | 显示全部楼层
    bt4baidu 发表于 2014-10-22 20:21
    ( q4 g( ^# _& h; q8 j" C( ?& h8 q最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...
    2 q% O, ]( M0 ~1 O1 }6 ]
    多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。' J; _% N; b; L5 H& h- h' y

    ! m4 Z% m% q3 b$ H$ h我的一点网络小技术是很久以前在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-5-4 05:03 , Processed in 0.098773 second(s), 13 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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