掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 51665|回复: 148

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

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑 - N$ u7 f" }; x" \! |

7 I! t, v! u- A# F8 E) i这篇文章主要是给计算机小白和初学者扫盲。
" I' i6 q0 k! h4 _/ o5 g- f本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。
' E* y2 V& b/ H6 E) t8 {' U" Z/ ~只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。
2 D* W7 ]9 X6 M1 R" D. X" Y3 S, H/ B2 h+ S/ I8 M2 L/ i
一、计算机的两个终极哲学问题
9 ^+ O1 J5 `0 Q$ k# [1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。' W/ G; w: H9 `
图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:3 G+ J* ]/ ^# [" {9 P" q
设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;1 F/ U, B3 ~. E, [# v0 ~
机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。
" f$ V8 l5 _7 A方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。
- }% R- c; D+ A" X6 \( k; w“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。$ O2 r* b+ k6 r/ l& Y8 p
; U% T  Q' T1 b7 T4 S9 c
那么要写出程序,立即就会发现不得不解决两个问题:
: p, z4 k$ s! i4 l1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址- p* A, r3 \% O
2、怎么把两种方格区分开?也就是特征识别
& a. k4 ]8 O% X. h  I6 z6 m这两个问题,就是计算机的终极哲学问题。* a/ v0 F! z- T) ^) x  H# z" ^
理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。5 f" a# g" B% e# r% h' S# u
下面的讲解也会以这两个问题为核心展开。2 F3 R! H+ f8 E' F# ^- r0 p- g

1 R  F, @3 S  JBTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,
- H+ t1 ~  ]/ Y" J9 d% }2 \7 _——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。
+ [: y! c% h' [所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。% W& A$ @3 |2 v7 {; E
前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,9 W  e1 S5 X# ?( k
而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。/ {; \7 a" Z9 R
具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。" M. y5 v8 E% a# Z) O2 X2 r( O
8 [2 b3 i- f8 ~2 S$ W! U
不要觉得自己上学时学的不是这个,or文科生,就不行。: J/ \. u% V6 g" q6 V! @7 c* e
江民杀毒软件大家想必都听说过。
6 z; n0 a! S* J创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。
4 [5 q9 p, l8 e4 `. {咱不奢望成为专家,写写程序总还是可以的吧?- V+ c+ j7 x1 e: @, e' b# Z! J

" u& `0 \) R( s! d4 J% F* t二、采用何种编程语言
) E7 u2 J/ d' Y! B, J上面已经说过,存放、读取、组织、区分数据是编程的核心问题。
7 c% U3 u1 p8 y8 c1 e* {; s显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。! B* d& {$ _. u) Y) O7 n
抓网站,恐怕没有哪种语言比Python更方便。
: p/ G+ r% O$ e6 V* q9 ^# C: S当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,5 Y. p7 z2 U7 `' K) T* ]
计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,2 c) j# L9 q9 \$ u: g+ D
没有慧根就别吃这碗饭。
# c; m" V$ u* f1 a
8 [1 I+ k- I. P% s6 t. m7 N三、网站抓取技术
& f9 {) A/ I. F/ I$ x( q1、下载某一个网页,提取其内容
) i4 S0 B9 ~% f! q以前写过一篇,就不重复了。参考:/ O9 h* V: d; o5 E7 O3 L
用一个简单的例子讲讲怎样从网站上扒数据
3 i2 o2 P0 J* P, K$ `, S- H" e6 z% \/ g1 U
2、寻址问题
7 O0 X( U4 X1 f- F9 l4 b/ z3 L下载网页,自然首先要知道网址,也就是东西放在哪儿。  h! _% K3 B7 C" z- z$ B
如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。
/ Z) f  F  }% b7 U& x6 e% g但是大部分在线词典,到底收了多少单词,事先是完全不知道的,
7 v, S+ m4 m' B/ ^7 P要把单词弄全,就要想办法得到每个单词的网址。
1 h3 A! T3 I% c, Q总结各主流词典网站,大概可以分为这么几类:7 g/ D8 ?: W0 }$ M6 W
I. 事先有单词总表8 N2 @; Z. r% E8 z/ a, H, g% E* z
比如http://www.vocabulary.com就是这种类型。" H, ~7 c. P3 C9 h3 N/ S+ j
它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。' Z* O; t+ F. c- U/ G

+ M* T, ~* N# UII. 网站有索引页面
7 h, u, P" i. k0 |1 T( d如:# N+ d- l) ~0 S; G
OALD(http://www.oxfordlearnersdictionaries.com/) O2 C6 y) |5 q4 Y6 k) i1 L
它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/
: I/ [+ T/ ^8 i3 n7 y0 hLDOCE(http://global.longmandictionaries.com/
. A! G! P. w/ C$ l$ `: y$ t7 M采用框架结构,左侧边栏就是索引页
( V7 p' e+ k, N% L6 P1 ]; _7 {MWC(http://www.merriam-webster.com: Z: A# x! O1 q5 x+ U
索引页在 http://www.merriam-webster.com/browse/dictionary/
; H9 Q; U" z5 R等等
! `+ K: r( z  m# ~0 M0 n这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。8 m4 H* W7 m3 V/ B# `
  1. 3 Y, ]+ U5 Y, y
  2. urls = []% G$ l0 X4 Y& c" Z4 J+ K1 J, f
  3. for someindex in indexs: # 循环所有索引页
    8 Z7 D. W' M+ v/ v/ {  n
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    , m; G) C# y$ L
  5.     browsepage = getpage(browseurl) # 下载索引页面
    8 S$ e8 p! a! b  P' G$ ^: C
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域- y( J5 P  z% G! O8 z) W; ?
  7.     bs = BeautifulSoup(browsepage, parse_only=target); ^- Q4 B. H/ X
  8.     if bs:
    5 N2 @8 ~: z  z$ k. A
  9.         for a in bs.find_all('a'):
    ; Z% r. F$ t$ V6 D7 |6 @
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接
    5 k" w$ F- Y" J; m0 V* f
  11. 然后:. T- n/ M1 s/ _* k
  12. for url in urls: # 循环所有单词5 `7 ]9 V5 @) z# `- O* N) T
  13.     wordpage = getpage(url) # 下载单词页面
    6 x9 u9 B" G: q" E. I) b+ q
复制代码

: |$ q* A4 `' M# a) u
9 E. C- ]1 N7 V0 b3 R8 gIII. 索引页和单词释义一体型网站& ?; c- A0 U$ H7 n8 w" I0 u) M
如:Online Etymology(http://www.etymonline.com/& i0 I' f$ J1 i9 `6 X
和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可
6 A2 D  |: ^" s; Q2 t
  1. & p  [2 e7 o& W, ]
  2. for someindex in indexs: # 循环所有索引页5 k- c/ f7 i9 _% H
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    9 m3 n, R: w0 Q# p' W) V1 g
  4.     page = getpage(browseurl) # 下载页面
    3 d3 @4 b! i" v0 R) s' t
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域3 n( V7 {  i4 D: x
  6.     bs = BeautifulSoup(page, parse_only=target)
    & d% T) O; w% }' J2 s9 ~  K9 T! I% Y
  7.     for tag in bs.find_all(target): # 循环抠出单词
    9 {) S) R& o) z+ s4 T
  8.         worddefine = getworddefine(tag)
    5 |! c% _. c  y
复制代码
. h6 j' W$ c4 N" h" j+ O
) x: Z. @6 h# z( x7 o3 }
IV. 片断索引型网站
/ D. e- }! P: D) ~% L0 W' d如:
: K7 d" v9 ]  P! Z3 i2 v& H. rODE(http://www.oxforddictionaries.com/6 p5 P" y/ h) g  F5 U! ^# Y
每查一个单词,右侧边栏有个Nearby words
5 y( q' f+ m3 vRHD(http://dictionary.reference.com/
$ u6 |7 }' e  }右侧边栏有Nearby words
: K$ P4 z6 L1 y: G/ sCALD(http://dictionary.cambridge.org/
6 }4 @  b- r6 P在页面的最下面有个Browse栏,给出前后相邻的单词6 {! H) X% v" B& j- M" R
这类网站没有总索引,只好利用它的Nearby栏。, C9 H, V2 C  B7 x  t9 W
思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,& j/ a, Q/ F# s7 U3 u2 n
每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)
; t6 `8 W  w( C2 d, @1 ^- m

  1. ' p' c7 I& L! U/ r4 S6 R
  2. cur = 'a'
    % D1 \# I' f' P- O) k0 l
  3. end = 'z'
    ! q1 _* }7 j0 ^
  4. nexturl = ''.join(['http://somewebsite.com/', cur])! u5 C+ t& O1 {9 [$ D" p
  5. while cur!=end and nexturl:) f0 Y* U* R( A1 O* G# \3 t
  6.     page = getpage(nexturl) # 下载单词页面
    4 ^' t' N; Z/ Z  C
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接
    4 z* d( k' x# Z, e4 m  m3 w/ u
复制代码
' I! E6 ?; z+ Z" O

$ Z/ q! s2 w: w4 @9 P; }8 UV. 完全没有任何索引,那就没法子了
) o* ~9 s0 e( m$ H9 P# B当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理$ N: f, _; }% c4 U8 N% @1 _
理论上也是可以的,就是效率差一点;
: e6 F2 m9 h2 W  N! J1 e' ^另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。
# i" j! ^& B1 p6 K" W
" n) J# Q7 u! c8 n3、提高下载效率0 Z- \+ F4 L& ?/ m1 H7 f) m
I. 多进程6 \- R0 W$ I& g' c( l
上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。) T8 m( A5 N1 w" G  u
实际抓网站时,这么做效率显然是非常低的。
2 e7 G6 V3 s5 K2 z! L3 R假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,: ^* `0 ]; [/ t/ |' e6 I4 Q
有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。
* P4 r- b9 a9 a& r: ]. b假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?
* l6 f2 T9 X5 y* R# @7 F# L4 M要速战速决,就得开多进程。( G7 l1 M, e3 [9 B3 Q
同样十万个单词,分成25个进程下,也就是28/25=1个多小时。, F: D/ `  u1 m
再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。
! ^4 z* a% v3 U: b在Python里开多进程,同样十分简单,+ x+ \8 Q$ w% s2 N+ e

  1. - L7 m  \, B- D" r
  2. from multiprocessing import Pool
    ; l/ @' e5 b& S! d9 Q, t5 g: D' O
  3. pool = Pool(25) # 开25个进程
    - i+ ~5 H6 t5 F+ F3 D: k3 t
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数
    7 c9 u) C8 u- Z! {+ x
复制代码

6 d# k4 T. R* m6 ~2 Z% Y+ e这就搞定了。
$ T. h" A3 F8 c6 b; u8 t2 W0 y% A" j$ H9 e7 `, _( Y- N6 |
对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,
8 L3 N, ]/ O$ l5 u2 A/ u- s关于IV.,事先没有单词总表,就只好采用区间的概念,
) L7 O3 F) b0 Z  y+ j# R# _/ n比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载
- D$ A0 E$ u) X! b. x3 l- Y: T; _( j4 L
初学编程的人,一碰到进程、线程,常常有种畏惧感,) {+ v8 R" T8 G
看到同步锁、共享内存、信号量什么的顿时觉得头大。
( A; ]* O2 ^, C1 d其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,- B" _' K7 d+ ?& F8 x( k# J, _) h
其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。# n( [/ g0 z2 F: p6 a

; D2 n1 a( v$ D* h4 f" rII. 断点续传2 N! q, J+ Q4 P$ ~: @
事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。
; U7 g. k2 w+ _6 R7 ^9 ~所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;
4 F* t2 d/ e9 @# h/ l即便无法自行恢复,也得容易手工处理,不然可有的烦了。
* z, X* ~4 ]8 Y这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,
3 o% b3 w5 z, {# H. J, n; `* Y# a直到所有区块下完。
# F1 S4 g- G, G/ p

  1. 1 c6 k8 y' G  b2 ]2 q+ `& [
  2. def fetch_a_word(part, word, url, data): # 下载一个单词) @% ^0 S# z3 s
  3.     word_define, failed = get_a_word_from_website(word, url)9 N( g+ O; D9 c
  4.     if failed:- G3 f+ d* |8 W/ h
  5.         dump_failed_word(part) # 输出下载失败的单词及网址0 h0 V% R; ~, E/ w1 l! I, }
  6.         return False! ]6 G! n+ o1 T
  7.     else:% H7 i) X/ S- ~- C# f+ w
  8.         data.append(word_define) # 保存下载成功的单词数据
    / `& m. V6 |( N4 T( y
  9.         return True4 q1 Y7 ~2 w. ?6 E* m* W3 U
  10. 6 H: Y; w. _- K  h1 R
  11. def download(part): # 下载一个区块
    ( f* \  N7 B4 I0 w5 K# S0 B
  12.     words = getwordlist(part) # 读取单词总表4 Q; k0 S& S' ~9 p! X' F  }
  13.     if hasfailed(part):
    2 C# B' Q  x/ C! h6 r  A" `# j9 H
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址; i. n1 Y2 [+ B1 Y% v
  15.     else:
      k) ^6 h) T/ C' w( r' v  k! [
  16.         word, url = words[0] # 首次从头下载
    . P# a- G: i6 a% ~
  17.     data = [] # 用来存放单词定义
    $ L4 x" m4 m: ^
  18.     while not_end(words): # 循环下载) z+ q6 J' g" s9 r2 n
  19.         if not fetch_a_word(part, word, url, data):
      }8 R6 |' o$ C% o: ]
  20.             failed = True/ v: r8 }. Q3 L3 h1 K
  21.             break3 A+ f7 z& O7 P4 z1 M' {8 F+ L
  22.         else:/ `+ q9 [* `" Y% h, k  @9 U# x
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址. l9 @7 F0 k- I9 e
  24.     if failed:
    3 v" `% A$ U' I) x9 k" b* _1 R# v2 B
  25.         suffix = '.part'* ^* _2 G4 ^' \( l3 e) c( m4 Y4 R
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'
    ( V: h* ]) _" O

  27. 6 Z/ T- i. _- P8 Q- i* E4 L$ \5 W9 E
  28. def isfinished(part) : # 判断某区块是否下载完成
    , K) m  i* J8 ~; w+ p
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断
    # d2 K8 \7 ?, b. J3 G6 e3 ^: U
  30.         return True
    ; J0 Z, |8 }5 ?+ P' U
  31.     else:9 Y4 _8 ^  u& j* w! B
  32.         return False: x! V) j0 U( b2 X% _
  33. & c% w4 d) Z: k
  34. def downloadloop(): # 循环检测未下完的区块
    5 Z# [% l8 l1 C7 l
  35.     finished = 0
    + K& J% B3 C' s
  36.     while not finished:1 S: ~- S3 r: `  s
  37.         nf = [] # 没下完的区块
    + `5 o. M6 X- g* K/ f8 p
  38.         for part in parts:3 S6 ?# I, o5 E* l* t4 h& q$ d
  39.             if not isfinished(part):, G  J7 b+ C- X; {' h! Y
  40.                 nf.append(part)% Y( P" G) D$ {7 [' J/ |8 E
  41.         finished = not nf
    $ ^& @& ^! d5 |  _
  42.         for part in nf:5 G/ E3 \+ L7 j6 o# |8 ?, H+ q
  43.             download(part)7 f+ L: v# g. L
复制代码

' m# u4 T; x; d+ S% B3 F' D* e, F9 s! g3 y+ b
III. 高速下载网页的小技巧
: A% \& @* }* n  ?4 U$ M2 _Python里面有三个库都可以用来下载网页:urllib2、urllib3和requests。
8 g  `3 U4 t% T3 ]- {7 f其中urllib2是Python原生的,urllib3和requests为第三方库。8 b8 j9 h1 d1 `' q0 b
(似乎Python3已经把urllib3收编为正规军了)+ g# s; S9 H; y
这三个库有什么区别呢?1 p3 F; h% ~9 G
形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。2 [& F! ^/ K: j0 G6 t& j" M- \* p( O0 {
再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,
) J( m! s: J- t: u* t所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。
1 E. a* o: i9 w' V" N# a2 i2 u但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。: R9 V5 @6 e7 |9 y3 d. D% n
这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,- h7 d* {+ z1 Y" m: Y( y7 t
通吃一切网站。" C: I) C8 A" e2 F% H+ A& v9 p4 n0 C
所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。
0 C' m" I; _8 M! ?. z& f这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:4 \& G7 N* D* e: `6 V
http://urllib3.readthedocs.org/en/latest/, L$ s4 @( J7 I; K- F- g
http://docs.python-requests.org/en/latest/! c8 ], A# {8 Q$ O0 P5 V) U
  1. ' R) C/ ~, a" l! N
  2. #urllib25 X: y" I, L  t
  3. import urllib2
    9 x) p& P+ L* m; V$ b/ w" X
  4. def getpage(url):
    5 ^: i( P! j( i* L, U3 B. X
  5.     req = urllib2.Request(url)6 Q, `! E0 M0 e
  6.     response = urllib2.urlopen(req)
    . c' D  |' E& E2 J( \
  7.     page = response.read()
    0 F4 m/ R: u  a

  8. 8 W; [$ e/ Z$ r% R
  9. #urllib3
    * }% }) f7 [' d0 r: x
  10. from urllib3 import PoolManager3 L. S) ^3 X1 q# W, M8 ]
  11. http = PoolManager()
    # O7 F% P1 e1 i. e2 _1 b
  12. def getpage(http, url):) H2 |+ v4 b& ^! l+ F& s
  13.     r = http.request('GET', url)
    9 z% @& K: Q' w; e+ D/ r! p
  14.     if r.status == 200:
    + ~7 w! r' I6 |, B+ `
  15.         return r.data
    - B8 V. q9 {( n8 V* f
  16.     else:) x  s. j5 q. q' {4 A' \
  17.         return None# }9 n+ v6 z2 L! [% C8 E

  18. * _; j. D' a4 t& d7 P( S& z* S
  19. #requests
    4 x. d- h: T0 q
  20. import requests) V8 m, i- P1 r. P
  21. session = requests.Session()
    ( `, z- }5 s' H  u6 Q
  22. def getpage(session, url):: Q# `2 n8 H3 |, J& i
  23.     r = session.get(url, timeout=10)5 L* K# T' I0 K0 d# R
  24.     if r.status == 200:
    : a* z& W$ }3 @" w8 t: o' {  R
  25.         return r.content- m9 `7 h5 F1 F) ~
  26.     else:& C( d! a6 q. q3 M
  27.         return None7 }; r; W: B3 ?+ ~- D* A7 s' \
复制代码

- y4 i% ~# o; A2 K( H. |7 ?四、后期制作7 I. U9 t1 v% E) L: f
1、文本处理,是个特征识别问题。
9 w/ q! n$ F3 a' o1 w4 g本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。5 V  O# ?5 Z$ U0 K% k  K+ x( y# _
当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)4 [! X$ |7 L& g  a5 x1 S  z: i, j1 H
都涉及到特征识别问题。5 N9 e( ^8 V4 o! j" u% r- R" p+ y
相比这些高难度动作,文本处理算是比较简单、基础。; X  ?& A: d5 W$ W0 G/ M
Python里常用的文本处理技术:正则表达式、BeatifulSoup、lxml3 _  j9 s) x9 _+ w2 p
正则表达式非常强大,但没法处理递归嵌套的标签型数据' |3 c$ X# R" u3 A) M
(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);/ {* \# }' k/ r" j$ w+ ^
BeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。
5 U1 l; [& ~) l# `$ h5 U' ]- P所以常常要结合使用。
  ~5 F9 y9 C0 c4 q% S) K- p' b这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。, E8 M% b0 X) x# J/ Q) p1 F' }
) f& {! H+ V; z8 m8 a& `
2、排版
* r9 _4 u) b) C9 SHTML、CSS的基础知识:
. U3 Q) K& v: s- }+ Zhttp://www.w3school.com.cn/html/index.asp
: T+ ~1 Q7 j" Fhttp://www.w3school.com.cn/css/index.asp
! A+ k6 K$ T: o4 U8 p% |http://www.w3school.com.cn/css3/index.asp
: X8 z" k: P5 Q+ B+ T$ D非常系统、非常全面。" t5 ~; [, ?8 `5 x5 c
排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。
( h$ N5 H+ S$ n) L6 }7 u3 L& O2 w, l% N. q) D% R
五、结语5 W' C2 R% u5 r( {- M8 U
花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。
2 y7 d8 `: j. i  d' ^所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——, `. {% f4 I9 U9 {0 c
大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。* I/ g" J, l- Y* ?) j+ H2 c
8 D) G. T; H, e0 j& F4 ~2 v  `  x
打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。( L3 d" T3 E5 K# z. W: A& E. g3 ]5 R
5 H7 V6 L$ o5 f  ]
只是拜托不要打扰别人,真想要就自己动手。
7 e; h, q# e4 c, p1 D- p$ j尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。
1 t- U! `1 o6 f( [5 o! O水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。, r+ P1 x5 ]' g! P* E; R; ~3 i
虽然每个人都觉得自己至高无上,应当受到别人重视,$ }" A' N% d+ N1 J# U/ A# ^9 ]
其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰" r; ?% t0 ^$ R1 F0 |

7 }8 H* w& q* p. i
/ K$ L2 z/ ~" `5 J( B. A========; E* K: L! Q( ?" `7 v
六、拾遗( ]( W, C2 [% ?8 U1 ?
关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类% T( h9 f( i1 F( J6 f
确实如此
- t: t" Q' y% \$ s不过这里只是举例而已,不用太较真啦
- d! x* i& ]$ V- s: p  T0 m实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏- ^; c+ V7 S( {% |( m
这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。
1 y& T* ]# J) V即,
1 w0 q  C1 v: L9 G8 _3 [8 n第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)6 z, y5 q  F+ B* k1 n2 c& c+ ]
第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)
) E; |/ U. m) c; R第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作
: b2 `5 J2 k# D。。。
# {. D, E( n: a% X7 [  E/ U' W  `直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空)) L/ X& a. A6 ~
最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。/ C4 O% k  b% F: @6 E' z( @' y
形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。
, F8 m/ e" @) `8 Z! R! G因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。
% _8 O1 x" F& i' k* u

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:416 i: [, Q% u; E+ w
感谢楼主分享知识和经验。$ G5 N. {  x9 x* u7 r/ q/ e
, C3 a# Y9 i- e* R
每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...

2 ]2 z. v: Q, Z1 b" K) u现有的mdx词典,其实足够绝大多数人用一辈子的了) {0 w9 W' q! N

/ d8 j: w9 |7 Z本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。
( r. P% s1 W" Q* d' L3 N* `8 j/ {
本人最常用的词典:- }5 f( `6 W& R0 \# s- Z
主力阵容:VOC、ODE、WBD。4 W( y# G2 ]4 M; {  j% A5 e* R
三本都是中型词典,收词量均在14w上下,以本人目前的阅读面来看,还未遇到这三本里面查不到的单词、未收录的义项。据说史上掌握单词量最大的人是政治家兼散文家丘吉尔,也没超过14w。除非钻故纸堆,恐怕用到W3、SOED的机会不多。1 Y$ F2 C/ P; w9 ?, Q1 L

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

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。
" M' L/ ]. [/ q7 i0 m- q9 t/ w4 h5 z0 ?其实只是你没有发现而已。' V& u+ p/ j: q/ K: q
ODE: http://www.oxforddictionaries.com/browse/english/7 ], w; @% V  [. _; R
RHD:http://dictionary.reference.com/list/a/, r" k+ p, L9 Q) q/ `" k  H/ |
CALD:http://dictionary.cambridge.org/browse/learner-english/: J7 x. l0 O+ i" Z; l# L; d
: c. H/ O. ~  C- B6 h) d. c8 \0 t
如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。8 S) }. ~7 t, K6 `6 K3 C& G
以第二个为例:4 N  [  b) i6 H  J+ i
inurl:browse | inurl:list site:dictionary.reference.com
3 @- c6 f3 c0 r4 _2 Y3 u0 I. x0 i. \6 u/ @
PS:最近才发现这里,发现资料很多啊。1 o& e) F& Y' E. M$ F

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧
% n  R3 I! p9 }: x6 c3 L% x+ e  _. a" W0 G. F$ L
假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改/ n" i/ v; t3 S* f
或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下
6 ?9 ]$ B4 s! N: a1 ?" D结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。
9 _: D: ?( x/ o7 q' |5 C9 x4 K这里有个比较省时省力的小技巧,可以快速定位到想找的地方
; B. u5 k# Y' X9 k9 r1 v* x& Y. u$ b% ~  j- C; C- q
1、Goldendict里,在想修改的地方点右键,有个“审查元素”:
5 H" K, Q7 A; H) ^  F* T# r$ c5 M# F3 L; \/ z) {$ X
, r! c; r2 l  J9 W- h4 O2 A: D& _
2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事8 W- \& E0 H4 Z3 a; `1 D* G

2 Y$ w/ x" J/ T3 {# {3 Q1 j, G2 e6 t+ Y+ m
3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方
2 `# b; C: M! U& W. [/ v: a
- @$ o: M( |1 X- l1 d" [8 P/ a2 `. j
收工

该用户从未签到

发表于 2014-10-24 18:41:00 | 显示全部楼层
% z! _1 Y. E3 s$ J1 U. |' r" S) |
& T3 E: V0 v# ]* L" ~

. B4 G  s- w0 f4 s: W; d2 i
/ R# ]$ j: A7 l* _感谢楼主分享知识和经验。
) P, b4 i) K+ t. b# z5 n: {/ p. e6 e" K1 M" n% n; X: M
每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。
; F, j8 i' h) O& {& s$ z
& T% c" ?, a$ a3 y3 C私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。
& @9 H8 C1 T9 i. \/ q0 C) H( U
+ k; ~' d1 o1 l但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。
6 o# e1 A1 G% M5 B1 |# X9 I. ~3 M
% l# B+ B" B: V2 e除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。  `7 V7 N/ r5 ]9 Q% Z; q9 @

0 Q4 _- e% ~7 |  `6 h
, S3 W' [8 @1 x/ y. W
7 h& B  v! B1 C5 _( x: @% `" q( }( r. V, x

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件
" J, c2 T2 Q; [3 d( m7 b' ~
  • EmEditor
  • Beyond compare7 \/ K! |6 _3 Y) G

. e* V% S* |8 K- d
' n% ^+ A5 ~* S9 Q前者用于编辑,后者用于差分比较) F* A8 C0 S- g+ {/ ?  H- i5 a
处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

发表于 2016-6-8 07:41:03 | 显示全部楼层
bt4baidu 发表于 2014-10-25 21:01
1 m4 F4 j$ Q& u3 @现有的mdx词典,其实足够绝大多数人用一辈子的了
7 X8 ]4 U. A4 K6 D5 d& s1 N( w
' J* M' {0 T* V: w. O' G, h$ C本人前段时间制作、收集了不少,经过一段时间的比较 ...

& U$ Q  G% B  \" u4 l" A肺腑之言。

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考
& s4 U5 r8 C' ~7 R2 f
! y6 U* p7 V1 m! K网页设计中最常用的字体有哪些?(中文和英文)
; A% o: o/ |2 X) _) _/ a7 khttp://www.zhihu.com/question/19680724
" c+ B6 ^3 l3 l* x3 e; W7 A) L  |9 y2 K$ R9 }1 f+ X. y' g+ Z( m
本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode+ @2 b" M* Q7 b; P
这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全
( F" w8 n7 c, w$ j6 J! ~) f另外Open Sans字体也挺漂亮; B. T7 z) R8 t7 z3 Q! 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 t8 `) y9 x0 R$ F最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...

    : A3 r; G$ a" i3 `感觉找到适合自己的问题好少啊# x7 O$ X/ Z6 s" ]6 d
    这个适合的话感觉是兴趣和难度
    ' y: [5 ]; e# |' s9 l1 j  n. k: _想请教一下楼主是怎么处理这些问题的呢
    . |6 J" I( E+ Z( c# ?: j' x2 o还有种不系统的感觉
  • 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 编辑 " N' s% x4 Q8 m" y7 X
    + ?$ v# F! Z! i
    写得很好。刚看前几行的时候,的确激动了一下子。虽然没怎么懂,但是第一次能坚持把这样的东西看完,觉得也是对自我的一次超越。谢谢!

    该用户从未签到

    发表于 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 编辑
    * Z. W) x5 p- e( j  }
    / a0 X! H0 J# a; c' {+ `& u( Ljava和.net就是个垃圾,我懒得提而已
    : z  X+ M! Z. M9 B0 s) U/ m4 ]在Linus这样的大神眼里,连C++都是垃圾:2 c0 Y# A! h" D% L) {
    http://www.csdn.net/article/a/2010-06-12/218785
    ( ]' K1 I3 U2 z+ M8 e# K) ^$ K
    ) N% j% x$ C1 h9 s& ?如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。
    2 }6 i4 V5 a5 B! h& ^2 A( ]8 J" s7 \# j+ s% z
    不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。
    " D* H5 d9 |+ f我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。
    ) M6 i! w' l5 O  c! n这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。5 M6 f/ r4 s7 ?7 R  \
    不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。
    4 }6 m( N' b; y8 T9 Z$ {* {为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?& j- M  H+ m, ]) B2 _
    因为垃圾代码太多了。
    7 k! M* T' w; K0 P
    2 d7 X/ y9 D9 P) o$ ~# s0 N$ O
    & G* r; j" s6 w, A7 m

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑 $ Q) s5 v  T6 \6 P
    & ^; Y( i- a6 q1 i& e

    0 J) O& E- u3 W% M" B2 D6 e5 u算了,道不同不相为交流! Q. h/ j' v! J  q9 i- V* A
    想起某个梗
    $ _$ `9 v! P+ R3 [, ^: ~程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!. F% w8 e4 Y2 U3 C% Z$ U

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

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:35
    & u3 ?* e3 W6 W; [# W不赞成多线程抓网站,但是好贴子要支持!
    7 J# y# C9 S, r. W4 q# f, t3 m, n" e, s; r6 a& {
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...

    4 r3 [) z8 f* d: [下载软件?推荐一款?
    % G! A& K% _6 `6 T& L最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    4 F. a4 X: T- z, f  m6 H' n现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?
    , a/ a; o  w5 k比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。
    ; w6 W- h6 c2 r% E) S* n除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。. B, G' n( o- v# l5 {" Y
    目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。4 P- R% \* E2 G3 z2 U2 }
    * }) D, I' O0 `# g
    至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。
    " C1 w0 R% u2 d对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,
    7 ~, H( R: n: u+ f) V目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。" t; i7 a+ d5 K

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:
    $ s( x' h" `4 ]! h. |" q8 \随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。; T! A2 E& A$ G. Q* H  M0 F, u0 m
    未来会出现一个新的行业:私人计算机管家。
    ' _0 e5 V" C' i1 S专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。/ K$ [- @9 \$ @1 [0 G5 m
    但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:299 [6 ?. x; F+ B8 W+ q, o1 |
    下载软件?推荐一款?
    3 C; `! i" ~! @% Z8 b1 N最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    & j/ e/ a9 O3 }. ?) j4 e, K现在99.999% ...

    7 H# A* {1 s% r- _7 `用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。+ J! f' ~  ?8 `! {2 }
    / P' i# ^4 e/ O# n5 d& }
    十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。( k. j3 j% c- G- s, A% V) i; M. J# u
    / a5 a" i  K' p& j, e2 B- ]
    用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。8 l# G6 J# w  Z
    4 `  t, a) i1 ^  a; z* s
    我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
    大熊部落 发表于 2014-10-21 16:18% ]: X2 n7 t7 N" o( q, m6 g
    用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...
    + e% p8 V3 T) A; a+ d6 ?  E$ U1 X- f
    我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件
    9 Q# @2 @; s6 c: E, u
    : t5 e  ~! \' t3 u+ P8 j
    下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。

    1 D  ^& b+ y6 G3 K推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

    该用户从未签到

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

    ' J6 Z6 T: K! P+ z; A+ {4 d$ _最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差: Z4 r! m2 ~9 V, U2 r0 B1 M# t
    计算机是用会的,不是学会的;
    , s+ G2 p8 G! I9 q# w: w! P6 i3 W程序是调试出来的,不是写出来的
    - G" ^2 C! K+ C6 G$ x
    9 @0 C: P. m6 K( L8 Q! {) ]既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。) i. k( z) H$ I$ |6 `7 V9 \* k
    你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

    该用户从未签到

    发表于 2014-10-22 21:25:59 | 显示全部楼层
    bt4baidu 发表于 2014-10-22 20:21
    & X, @: q& ~5 O: A, `; E1 v& D) q. g5 D最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...

    ' I& b  @5 J0 e' j* B多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。" S+ I' A7 p( [1 k& G( }

    * s6 g9 q( D6 Z9 ?$ x我的一点网络小技术是很久以前在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-6-9 14:03 , Processed in 0.092335 second(s), 14 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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