掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 50964|回复: 148

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

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑
1 w) G. H- c& S2 O) ]  g' K! U$ ]. g- u2 V% y* ~, y) H
这篇文章主要是给计算机小白和初学者扫盲。
. C7 e9 w+ \* _本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。
' Q9 |. x2 `# T" \9 [% P$ G- H3 a只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。
2 p1 D, i, i, Y: a# n: R% \5 z% G* m/ ~- s$ r, |( [
一、计算机的两个终极哲学问题
" Q8 a' D3 ~; s" l+ F7 O, e1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。
* u7 S! q4 m2 Q) M1 S, |7 v7 ~图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:
! q! b, e  g5 T" e设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;
- }9 O1 t1 s: {3 p5 L机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。
# _$ C9 K- Y+ R6 m( V方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。
/ O* d& f0 B" I. E“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。( @; F5 \0 {1 W$ `" c# W5 T
' e# m6 H( g8 Q/ ^# c$ c# V2 ]7 N
那么要写出程序,立即就会发现不得不解决两个问题:
+ D; Y8 Q0 j+ S: r1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址  A9 ]$ b$ W: K# p
2、怎么把两种方格区分开?也就是特征识别. h0 O/ ~) D( L7 Q; V$ }3 C
这两个问题,就是计算机的终极哲学问题。2 M) f/ k; ~( l0 k
理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。5 h& L2 t  R" u+ n, K  v$ D0 T
下面的讲解也会以这两个问题为核心展开。
% x* @' O0 c; a- B% U6 @  b1 }1 D% d! O+ }' P& d- q
BTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,) M8 H2 s) x/ m
——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。& C3 j5 g: _$ z$ i" _" o
所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。
; z& C# t7 c& M+ ~  i前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,3 G. w1 d1 f  [4 V, F% Q2 \1 K
而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。3 {% a" d7 D9 x
具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。
8 |7 {. y) m; G+ ~+ ~2 Q8 T7 U" Y7 R
不要觉得自己上学时学的不是这个,or文科生,就不行。* c0 R9 a# o; ?4 a7 N7 H
江民杀毒软件大家想必都听说过。
5 ~! k+ G6 ^* _7 Z- M* l& K' g- \创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。& s; t+ k3 M. {# V. \
咱不奢望成为专家,写写程序总还是可以的吧?
0 ^0 n- B$ c% z6 T
$ K" c0 Q3 v0 N/ ^6 z二、采用何种编程语言
9 \# N( m- N$ ]; E/ i上面已经说过,存放、读取、组织、区分数据是编程的核心问题。) `$ ~! g! T: q0 q( R2 }8 G, X  Z" I
显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。
! q' L$ U. A' p- o6 [- ?抓网站,恐怕没有哪种语言比Python更方便。  P  N' d- J' d6 A7 S
当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,
* {4 `- {& @5 v6 Y" W6 p计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,4 X5 i% ?; ^! |4 \' A- G
没有慧根就别吃这碗饭。
$ e9 M. i+ G* `- U) |! j  u& m! t5 X0 l: @0 x9 k% T& ]
三、网站抓取技术
( I0 ]# i. K7 g1、下载某一个网页,提取其内容0 f7 ]5 t; E6 R6 t7 }, U( J
以前写过一篇,就不重复了。参考:" B$ L- M4 A* |9 k1 v9 {* O1 G) @
用一个简单的例子讲讲怎样从网站上扒数据' ~4 V, g6 Q1 ], W5 o: |
- |, f3 H1 [; L$ d
2、寻址问题" s0 O. K, x* K( U
下载网页,自然首先要知道网址,也就是东西放在哪儿。; I! n; I7 ?: k, @8 }
如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。
7 Y; c8 d# A$ T/ x/ C2 R  K2 ]但是大部分在线词典,到底收了多少单词,事先是完全不知道的,0 ~4 i( ~$ r: K) ^: t; [6 J
要把单词弄全,就要想办法得到每个单词的网址。0 w) @9 B- M; I7 `
总结各主流词典网站,大概可以分为这么几类:& v/ [4 D- \- e$ F
I. 事先有单词总表& W& O% n8 S. Y& \5 {$ I
比如http://www.vocabulary.com就是这种类型。' `5 B9 `: @7 `- q$ ?7 u
它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。
4 A" X/ e* a5 x$ c& f8 a' Q, H; z) b, l2 Z3 i
II. 网站有索引页面2 r4 [) c) S' _' N0 ^0 y
如:
; [* T( F0 a9 J6 D; C* M4 G$ AOALD(http://www.oxfordlearnersdictionaries.com/; K8 K1 V$ `( o( e2 h9 ^* [
它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/
! F: R' m  p- H* c; w2 |5 W- _9 YLDOCE(http://global.longmandictionaries.com/$ n1 a- T5 |+ r0 \/ b2 {
采用框架结构,左侧边栏就是索引页+ L$ \& n% V0 p! @; |7 h
MWC(http://www.merriam-webster.com6 s$ {8 K& D, ^* C  }8 y
索引页在 http://www.merriam-webster.com/browse/dictionary/1 o) W) ^) W2 b! H9 K4 R
等等, l1 V4 o5 l3 f& Z$ Z& M
这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。) a5 |  Q1 t0 k6 T. x5 O( c9 d/ N

  1. 1 `, i' b2 A9 G
  2. urls = []
    , C, H+ J% [+ M) ?
  3. for someindex in indexs: # 循环所有索引页% n4 U& ^1 F' O* a2 e$ [$ G
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    9 y7 C" ~0 p& R0 g) l
  5.     browsepage = getpage(browseurl) # 下载索引页面
    5 q4 C7 i' D: v  Z0 M0 a
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域1 u# X7 L" B3 s& t* g# Z+ I
  7.     bs = BeautifulSoup(browsepage, parse_only=target)
    9 g1 c; o* H4 ^
  8.     if bs:
    # R/ H  |* C( B3 F
  9.         for a in bs.find_all('a'):0 p( e# I8 p* B6 T  M5 R! {" M+ t
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接3 Y; Q) p" T5 l: ~6 Q
  11. 然后:
    2 I7 @& m9 \2 b& j+ f* r
  12. for url in urls: # 循环所有单词6 R- L  ^+ ?; g& {. @! a1 c
  13.     wordpage = getpage(url) # 下载单词页面" [% \% u$ t* b! D2 y' {
复制代码
) Z6 A' p+ ?3 l5 d

" F& f3 k7 @' h0 A8 x$ YIII. 索引页和单词释义一体型网站8 K$ G- A4 z" j1 O0 ]
如:Online Etymology(http://www.etymonline.com/
9 a4 S3 N' k+ }8 G+ z+ D和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可
9 s" }' t0 i7 ]  r4 S- d

  1. - h! h% M9 z9 n! j- n; r+ d8 W
  2. for someindex in indexs: # 循环所有索引页
    $ R9 t9 K8 J7 v! U( g# @
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    . J& Q$ U. a7 w3 T/ a+ U! ]! @+ }% s2 a
  4.     page = getpage(browseurl) # 下载页面% Z# T  w: E2 Q* i
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域/ s% k7 j% Y- m0 |# w
  6.     bs = BeautifulSoup(page, parse_only=target)
    0 r7 O) Z  [+ M/ Q+ I9 _" t. L
  7.     for tag in bs.find_all(target): # 循环抠出单词3 b) |! \' E# E3 u! m7 I0 h
  8.         worddefine = getworddefine(tag)4 ~% @0 y  V! R* \
复制代码
( i2 k$ A# p. p

5 u) I( p7 a' C% |. H0 d2 D/ p4 FIV. 片断索引型网站3 r0 I2 P& B0 f3 Q( Y0 {
如:; y% e- W5 _' A( }' e, B
ODE(http://www.oxforddictionaries.com/2 B, P, E! E  ~% g) c+ y
每查一个单词,右侧边栏有个Nearby words0 P6 y; u1 x2 ~8 d0 r& f
RHD(http://dictionary.reference.com/
: r$ Q2 |3 x! j7 `0 x右侧边栏有Nearby words
6 h  x. ?# s. U9 xCALD(http://dictionary.cambridge.org/
7 m9 F! P. b$ o在页面的最下面有个Browse栏,给出前后相邻的单词
7 y9 m) `& F  f- y$ q  u' u' y这类网站没有总索引,只好利用它的Nearby栏。  a$ A* R6 Z3 y4 P: d
思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,
, ]% L) U; q0 j) k每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)% Y; g7 c" S2 [: [6 v' u' U1 K5 y
  1. 3 d+ R9 d# j/ X; V
  2. cur = 'a'; |) r  [; t. M* N. _) K
  3. end = 'z'
    & N! u" g4 D$ G( d
  4. nexturl = ''.join(['http://somewebsite.com/', cur]); ]# u5 O/ |: e1 h
  5. while cur!=end and nexturl:
    # v* R0 e- ?. N! Z  g9 _% W
  6.     page = getpage(nexturl) # 下载单词页面2 _4 h& g2 }) A/ ]1 q
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接2 s9 @) R7 H/ N/ G+ r4 e2 W
复制代码

# B8 R; U5 M7 ?4 r: `! U1 w+ e  i0 c; V1 a( k9 W
V. 完全没有任何索引,那就没法子了' _: c/ W4 X: k2 s: F+ X3 U
当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理+ P) o7 \, M! k* l4 V
理论上也是可以的,就是效率差一点;' }3 L) c2 D' T6 q* `6 e/ |( D
另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。0 a, @, ^* M8 q/ O

9 F7 V  z# O8 x; `3、提高下载效率
& G% l) {  `- q: V8 h- kI. 多进程$ g% c6 t1 g; w" r+ l" k  _
上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。  _) ~4 Q/ N6 Y! R# d7 e
实际抓网站时,这么做效率显然是非常低的。
2 t* y" R# U8 m假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,
9 K, e% t* `1 v. l  B有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。, R* H9 |9 I! z4 X& }; E* q9 y" C
假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?
' m1 `2 `' U' ~' P- T要速战速决,就得开多进程。
: M4 [0 Q! C4 L9 h& O7 C同样十万个单词,分成25个进程下,也就是28/25=1个多小时。
# j5 F( L$ W* S  ]1 h! h! X再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。
$ n. i3 L6 l+ ]1 ^- ?% _在Python里开多进程,同样十分简单,6 _1 ]5 Z# R, E- B3 x9 ?, c

  1. 4 W; w* }$ m& u5 E/ d: F: C6 [; n
  2. from multiprocessing import Pool8 Q8 _) q) k) r, r9 Z3 N0 A
  3. pool = Pool(25) # 开25个进程& ]5 y3 T0 Q4 B) y# r& x3 O
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数+ l) V5 M, \% |+ T
复制代码
+ |3 k! f. s8 x4 v2 X
这就搞定了。# W/ f, A1 Y& z' z/ O

; h3 \6 H) b' D$ }0 O对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,* ], Q6 X7 d* T! O, M
关于IV.,事先没有单词总表,就只好采用区间的概念,! Y& j/ H$ w  K$ W- `$ X* j4 w
比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载
/ |+ n  L8 k  [4 {# k# w$ ~* G
( T8 X+ e, a. ~4 y, }初学编程的人,一碰到进程、线程,常常有种畏惧感,
* q) ]& U) x# {& k看到同步锁、共享内存、信号量什么的顿时觉得头大。7 n/ _4 f# M$ B6 n% s2 ~
其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,  N" A1 ^. g/ X3 O7 H1 C; |$ N7 K
其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。+ U3 B$ Y. |! W
' r( h' w5 e9 Q) F6 c4 o
II. 断点续传
3 }- e! Q2 f" P* @* y事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。
* `2 C# {# e0 n3 P. }所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;4 L+ X% _5 k/ P
即便无法自行恢复,也得容易手工处理,不然可有的烦了。. ?+ O% r% q3 Z: E
这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,2 f5 O1 e, M) `$ n
直到所有区块下完。
: u# ]9 P1 F. o9 n

  1. $ ]: Q. x! J* K8 e
  2. def fetch_a_word(part, word, url, data): # 下载一个单词. F# T& m& D9 E9 W
  3.     word_define, failed = get_a_word_from_website(word, url)
    $ N4 Q" [9 i, |+ L7 ]; S* Z% _5 _/ g
  4.     if failed:
    , L% R8 D0 B" V4 Q/ D0 w
  5.         dump_failed_word(part) # 输出下载失败的单词及网址
    3 @1 w. W5 w9 G6 e
  6.         return False
    6 \& U3 V6 L% ^' V' j7 j7 _" Q2 j
  7.     else:
    5 `- s% V. ]7 [; ]2 j
  8.         data.append(word_define) # 保存下载成功的单词数据
    6 k5 I& u9 g" H, n
  9.         return True4 m9 y! m/ o$ e8 S/ M, _

  10. : f9 w* w4 _. ^* `" a
  11. def download(part): # 下载一个区块
    - A" O+ l* Y# v1 j
  12.     words = getwordlist(part) # 读取单词总表
    ' `7 N. v( F/ I3 z, d, C# f: Y& I- V/ m
  13.     if hasfailed(part):
    8 |  T+ K! u& t/ B) v- k. C- N
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址
    # Z9 e; S- J$ m) g5 i  i  k
  15.     else:
    5 \2 X% f. S, t
  16.         word, url = words[0] # 首次从头下载
    # O/ Z5 W) b/ R7 p# ?
  17.     data = [] # 用来存放单词定义
    ! _# @* M: M0 B0 k" ^
  18.     while not_end(words): # 循环下载$ w; h9 ^1 \5 b& i  V
  19.         if not fetch_a_word(part, word, url, data):
    3 `- q& U4 P0 b: x/ O6 E
  20.             failed = True
    6 m) O! n" x, K& k3 n1 `5 V% U. |
  21.             break
    + K3 U+ A1 |. e( @" J
  22.         else:
    1 b1 @  w4 o/ j8 h
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址
    ' b6 n9 i7 N( ~& T0 R6 U) }
  24.     if failed:
    9 O: A8 J+ A0 @9 j+ @
  25.         suffix = '.part'" Y% ?$ V! P% Z
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'/ h2 i3 C' m5 {" A
  27. ( X/ S9 A5 j' t3 @4 d
  28. def isfinished(part) : # 判断某区块是否下载完成
    # o/ X# b2 Y. o  l+ X& Z
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断
    , |' \# _2 i' }) S
  30.         return True
    " Z0 j! \: c* i# E# m6 g6 g
  31.     else:
    : W6 Y! ^9 u2 A) X) j
  32.         return False6 [4 Y; E6 P8 y. f2 p
  33. 8 o/ x- e4 A# k$ `* w- u% S
  34. def downloadloop(): # 循环检测未下完的区块
    3 b1 `# ^% N4 @0 S9 Y
  35.     finished = 02 F1 Z, N5 }' z2 q
  36.     while not finished:0 N( t4 G( A: Q5 z
  37.         nf = [] # 没下完的区块
    - I! z( j9 T# q
  38.         for part in parts:, a/ r# p: P% V& n
  39.             if not isfinished(part):4 N; T  d  f' |. x) Q2 }
  40.                 nf.append(part)
    # z& `+ J: d* m6 W3 E" S
  41.         finished = not nf0 K# q+ _* l0 x
  42.         for part in nf:
    9 L' R( \. w, W! c. i7 R8 \
  43.             download(part)( L$ K; G' T& y$ c
复制代码
0 Z3 ~2 [! J! P7 d" r( [; D2 P

' |; h+ R, H3 E2 Z' p4 {" E5 b; PIII. 高速下载网页的小技巧
( A% R, O2 @' g4 y3 P9 _Python里面有三个库都可以用来下载网页:urllib2、urllib3和requests。
. ]5 v8 x6 M6 W$ U其中urllib2是Python原生的,urllib3和requests为第三方库。
9 t6 ~# E; D/ z+ J(似乎Python3已经把urllib3收编为正规军了)) M  P: x* |9 n% B
这三个库有什么区别呢?* n* |" G( ?; Q7 g
形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。
; _# S& X2 W/ j& L0 {" n再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,
! f4 x! r& [) `0 ^9 z7 r所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。
  Q' N+ s4 t2 q* P. l+ B& _2 l但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。
0 n1 Q4 H, g; {6 J$ X8 e" w) S这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,
0 g& K2 x" h* q# x$ A通吃一切网站。
; d# g$ a% g4 C) N所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。
1 _& Z3 m* o& |8 l4 @这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:
! `9 U4 k8 T1 j$ b! T+ C- b# ihttp://urllib3.readthedocs.org/en/latest/
( {- p7 I. x6 J  f) W- khttp://docs.python-requests.org/en/latest/: A2 z* P! J$ E8 {7 U* v6 d' V
  1. $ ^" G3 s' Z* ^/ U2 M7 h; n0 {
  2. #urllib2
    ( _8 A! c5 f2 e8 |0 ?- w
  3. import urllib2  h4 q4 L" A2 G0 G( D" k8 t- a& U
  4. def getpage(url):- F9 M" ~& Z0 k$ r7 d9 Z6 A
  5.     req = urllib2.Request(url)1 L& v" ~2 @1 m8 P  y) W; N8 |
  6.     response = urllib2.urlopen(req)
    * Z1 n* X- W- t, v' `/ t9 ]! E
  7.     page = response.read()
    : A- n& c/ C4 ?, ~  H9 w

  8. + I& l2 `/ h* Z/ M) J5 d' u0 \
  9. #urllib37 n( ?9 x$ I( z7 T
  10. from urllib3 import PoolManager
    . H6 i6 {) G$ a' v. N7 q
  11. http = PoolManager()9 c/ C  s: ?$ J+ g
  12. def getpage(http, url):
    , H, l9 I5 m+ n
  13.     r = http.request('GET', url)+ I" l5 `/ e2 b( |+ P' `) e
  14.     if r.status == 200:
    + G/ }8 B& M5 w
  15.         return r.data+ Z9 X  O3 d3 U' ?
  16.     else:# ^0 [" h/ R8 X- k( W1 ~- W* `/ Y9 W
  17.         return None5 \8 Z) r, }7 h, _2 _- X: A

  18. ( N; O- y' D1 w" r
  19. #requests
      t2 v' k, w9 z; B* b7 x
  20. import requests
    ( [% g' l' I2 }" {
  21. session = requests.Session(): f! Z7 o% }6 N9 U  P5 r9 ]: i
  22. def getpage(session, url):
    ( K9 w: d) j) N1 e9 U3 y
  23.     r = session.get(url, timeout=10)
    * B6 ~1 e! Z( o" ^& `9 L' Z
  24.     if r.status == 200:
      b+ N/ |$ J% G: n- z2 a* ^
  25.         return r.content/ ~% W2 K/ T2 D
  26.     else:8 C2 i. _9 }7 B$ W  C
  27.         return None$ Z- d: c" v# B$ T" d
复制代码

  _' H) i8 Z; i) A( h四、后期制作5 f6 V; U: a- O- P2 q; C; Q
1、文本处理,是个特征识别问题。; {2 Y/ D0 @3 E4 S% z. I
本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。4 D: `$ L5 i4 G; a
当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)
1 C& L1 w$ P" \" K& h9 E. p都涉及到特征识别问题。
- B' j4 u/ |& z3 v9 q1 h+ P相比这些高难度动作,文本处理算是比较简单、基础。6 H2 `. H7 O* {1 b. f
Python里常用的文本处理技术:正则表达式、BeatifulSoup、lxml
4 j4 x0 \9 u5 Q/ M' F& l: L, z+ t正则表达式非常强大,但没法处理递归嵌套的标签型数据* O) U7 v# a* M
(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);
& k% U  ?6 _" w$ l" F: J( WBeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。$ B/ a, _: S8 t; r1 ~
所以常常要结合使用。; s( X5 D# S* u
这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。% w* y3 y' f  R4 g

8 d: x  @5 W2 R9 |! E2、排版. B; J; a2 J0 N
HTML、CSS的基础知识:
7 H5 ]7 b. W0 g+ i; Rhttp://www.w3school.com.cn/html/index.asp8 j1 F1 _% H: ?
http://www.w3school.com.cn/css/index.asp4 }. Z! r9 r% g/ o7 [% @
http://www.w3school.com.cn/css3/index.asp" I4 U; u  x3 B2 P* L+ a
非常系统、非常全面。) b, R  j, |6 E6 I, O7 l, F# f
排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。3 ?/ w8 m' q' U1 r8 ~4 C

' {6 o, c; Q7 \4 L& Q- L+ R4 R; p五、结语% [% f' _; h9 Q6 W  Q
花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。8 P% x# ?. P$ X" F) s- s
所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——
  I$ d9 b/ ^7 ^* c2 F大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。
# J  X2 _! g* a: a- f
" c0 R; f- Z) G$ }1 W! [% m1 f打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。' D2 D/ {+ g- C' |+ @" ~- f( i9 L# e

, @2 D0 H7 T0 [$ P" {只是拜托不要打扰别人,真想要就自己动手。7 z# |" U" q" N) W6 W
尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。6 N% D7 O+ ~' v4 u. d# G
水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。
4 t9 c; \5 T% Y/ H( v虽然每个人都觉得自己至高无上,应当受到别人重视,3 ~* X* Q1 {4 e3 c6 x4 \( @
其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰+ B8 U  z  B+ @) N

! P- c- N4 `7 L/ K7 p9 l
# Z7 K3 M8 }( A; }- X& |' v6 p========
8 {2 ]8 D! f  g5 L六、拾遗$ H8 b* H/ c$ |2 J+ v5 }. L8 e: C3 ~$ s
关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类
! c1 Z( I- c- k# y确实如此( T2 O" M5 `* l2 |- O
不过这里只是举例而已,不用太较真啦
/ S0 L2 B# d' B实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏! J. Y, ?6 t# B; P$ r. w; R" w) Z
这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。5 c2 _" ^. d5 J, _' H
即,
- d. |8 N" t% j6 B第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)0 ]8 ^8 v: F2 Q2 ~) U' B
第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)8 j7 O4 U" S/ Z7 ?: d
第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作" S2 j7 g9 H( O0 s) c2 w
。。。
1 X: J: E) e* F% f+ L直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空)
7 _: s" V1 r. j最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。
! p3 K! G- I/ `/ w9 a$ y; p形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。
  O. }  y" b5 `0 z/ I: q) h因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。
' I+ n- i) X( n) D! x

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:41
, O8 w& V3 z( o) c! _感谢楼主分享知识和经验。  [& |2 V* `9 q' L+ y& q
( n% x# t) B' q/ G8 D) e7 M
每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...

. r: R& ~# v. U9 P现有的mdx词典,其实足够绝大多数人用一辈子的了1 i5 C+ ~6 z, m. g

2 [* B5 I8 d' d. D5 @% Q本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。
& K! @7 E$ B. p# V* ^+ w- x# Z+ H% O
本人最常用的词典:
* V8 A% R8 v+ a' m+ _6 M. U6 j主力阵容:VOC、ODE、WBD。
/ O9 Z5 Q+ s! M5 L. y! g1 ^三本都是中型词典,收词量均在14w上下,以本人目前的阅读面来看,还未遇到这三本里面查不到的单词、未收录的义项。据说史上掌握单词量最大的人是政治家兼散文家丘吉尔,也没超过14w。除非钻故纸堆,恐怕用到W3、SOED的机会不多。
% [- N, M$ e7 B# p- ]; U# O0 f4 f7 V, F  L1 O3 G
替补阵容:LDOCE、词源、短语8in1、韦小黄&韦小绿、Garner Usage。
* G1 y7 I0 ~% g  O/ `$ WLDOCE用来查常用词的惯用法/搭配、语法信息;' N6 V3 I" \* K  s1 s& p2 v6 U6 B
词源用来辅助理解、记忆单词;9 i1 ?, q% h- m8 _7 r0 m" {
短语8in1用来查漏网的惯用搭配、非正规用法;
. v% U% e3 q4 r9 W+ v! _韦小黄/Garner Usage用来辨析/比较同义反义、正误用法;
+ y2 J8 L& u+ R; @$ n7 C韦小绿用来辅助理解、记忆大词。小绿真是本好词典,有人说里面收的单词都是一辈子才能见一次的那种,其实不然。它虽然只收了1400多词,却几乎都是高频的大词。从本人的使用体验看,查得率相当高。比如最近看新闻说一种超大蜘蛛,里面有个词arachnid。别的词典只是干巴巴地说4对脚的生物之类的,只有韦小绿说了它的来源:从前有个女孩叫Arachne,编织技艺了得,把雅典娜女神给比下去了,结果激怒了女神,被她变成蜘蛛,终身织网。这种解释多有意思,看了永远忘不了。& y9 {. W7 a. g
4 [- e8 a, p4 Z6 v! e2 N+ X% G
上述词典,坛子里都有,无非是版本新一点旧一点。比如朗文5和朗文6,有人统计95%以上的内容都是一样的。如果是完美性格,非要用最新版,那就只有自己动手。不会有人在词典出版的第一年就去挑战版权方的。. f# N/ t. V  L' c
“对于好学生,任何教育资源都应该是免费的”。虽然本人同意这种说法,也认为现行的版权制度存在重大问题——有人靠垄断知识获利,却完全合法;但是本人从未打算挑衅版权方,更未想过做Aaron Swartz那样的斗士。靠垄断知识获利是有点无耻,但如果没有利润,也就不会有人去做整理资料的事,这确实是个难题。
  S0 x+ j- z4 g$ K* H- Z6 V7 D' v* P
还有些人没事喜欢收藏词典,收集了一大堆,却从来不用。说到词典收藏癖,想起以前的一位室友,那家伙每天最大的兴趣就是下载影片刻光盘,大概刻了几百张,还在不停地刻。但是从没见他看过,他也不让别人看。
/ ]9 l( ]; Y$ \7 s, U这种癖好大概是来自于原始社会的一种遗传,人们总觉得应该储备点东西,说不定未来某一天就会用到。其实那一天说不定永远也不会到来,不如就把今天当作那一天好了。有多少人买了一书柜的书,到死的那一天都没看完,甚至有些书连封皮都没揭开过。
4 z- s( U" u! x

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。( L5 G7 o  z$ G  v! b1 R
其实只是你没有发现而已。
; P' O6 l/ v  v# O% h7 gODE: http://www.oxforddictionaries.com/browse/english/5 k$ r9 m3 Q; Q
RHD:http://dictionary.reference.com/list/a/( D) X2 e$ T6 z
CALD:http://dictionary.cambridge.org/browse/learner-english/
1 |3 ?; V/ b7 M+ `. u
, G; m6 g% g$ f% `5 u6 \如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。
4 O" X9 m! k( e! k/ Q以第二个为例:
; G- K8 Y2 N6 W% K* t: r% p6 Rinurl:browse | inurl:list site:dictionary.reference.com
+ P3 m& s, y' s) W1 j( j  n, X- F+ b
PS:最近才发现这里,发现资料很多啊。
0 _! Y( t$ h5 v$ c1 V

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧/ }5 A6 V* }7 ?- [

& c) l7 j9 F( H+ a# H1 }  X假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改3 s8 K; S, f/ h" [$ \
或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下
. j5 @) G3 j8 i3 P3 i! P. ]' x结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。* i% ^: _, r. V" A- S+ ~
这里有个比较省时省力的小技巧,可以快速定位到想找的地方
' M9 F" ]# P* ?4 Y/ e) A. L3 j$ R: D. j
1、Goldendict里,在想修改的地方点右键,有个“审查元素”:4 C& ~' G+ a/ I5 X

: x) ^+ j# l& \$ V: ]& T4 x" g3 _9 t: m* V
2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事/ ^2 I2 _2 D& `

2 m0 |4 ^/ q/ m) q1 c, c5 V/ B( O: V
) ^5 G5 S5 h4 p7 W, I. |3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方8 |5 B! u: E5 G  K' v

  Y3 _6 s. @( l1 D. j
4 S. z* {! c- p, a" ]! r收工

该用户从未签到

发表于 2014-10-24 18:41:00 | 显示全部楼层
, m+ G; M5 C' H4 B  ^' I( x

4 ?" v* Y& F( f4 ^+ p2 s+ Y9 z- I. S   j& J: Z' ^- u$ `* K
/ t3 ^( r, ]; \* e7 E( [
感谢楼主分享知识和经验。
% h3 q; f% Y# B* {) e% `4 l& _& u: G2 R
每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。
  {; n# Z& H# M* z0 j* U  H
* A' F' K* k% @  F私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。! _: c# T! q- k) B1 v
  ?6 s/ {7 q( P
但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。
. ~2 ^" G- u4 I7 G. [* N* q) {
: y: {- I. _" n$ c9 i除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。2 c: J5 P/ F5 Z/ J+ E& s

# N& ]1 q. s, J5 L( }) J% d5 y, O) _1 q, j" H4 l! ]6 d& n
8 M. [5 V8 [0 @6 m
- J* Q- J8 _/ `$ U% p2 `

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件
' j6 L6 }) e, b$ ]+ `
  • EmEditor
  • Beyond compare
    - B) x! {2 P7 x: V

0 ~: \# o7 m6 R' o) P# g+ O
" e% B/ a  i" x3 A7 v前者用于编辑,后者用于差分比较
9 g$ j5 @- v& @# X# _1 l& V处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

发表于 2016-6-8 07:41:03 | 显示全部楼层
bt4baidu 发表于 2014-10-25 21:015 O2 S0 l' c& C' L9 Z; f
现有的mdx词典,其实足够绝大多数人用一辈子的了
0 K, ~4 u3 B  w4 ]" c) R9 _( x5 H+ p: e% L  c
本人前段时间制作、收集了不少,经过一段时间的比较 ...
; C1 m( T+ I5 I/ s$ Z0 @
肺腑之言。

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考) _5 s% y& v" X: Y" l

7 {) U6 M  m1 H. h6 g6 f' u网页设计中最常用的字体有哪些?(中文和英文)
  \9 }$ t" K- F7 X4 e1 |9 Dhttp://www.zhihu.com/question/19680724
# O, G+ t! k7 B( R5 V, w/ V: |
- B8 [$ o3 r( G本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode, ~  p8 A! F8 A5 c0 P# L, {. m
这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全
1 m! T& A  v9 G$ a( Z另外Open Sans字体也挺漂亮
3 |$ ]$ r3 E* p% x) H7 }8 U
  • 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
    - U5 Y! ?' W4 P( S最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...

    $ K2 f! B. l* ^, t' y; r9 T感觉找到适合自己的问题好少啊" i9 f# x" y6 \% j2 _/ C
    这个适合的话感觉是兴趣和难度4 `: V2 E: M* L( I9 `& x
    想请教一下楼主是怎么处理这些问题的呢7 ~- U+ G2 M( 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 编辑
    : P" R: h3 Z& s: |$ ~2 `8 X' w1 X. K6 l5 p  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 编辑 & S9 e& ~1 n  x; f) @
    1 F+ k. ]7 b  _# h3 N% Q* q
    java和.net就是个垃圾,我懒得提而已- G8 u* p* r/ Z$ f
    在Linus这样的大神眼里,连C++都是垃圾:) D$ i  m5 {" u* J
    http://www.csdn.net/article/a/2010-06-12/218785
      T# k  k) K$ I8 F' H) i
    ( m. H% ~4 F& L/ ^6 x如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。/ ]5 a  E% |: g8 h- t3 X
    2 A* {" P: E3 a" `
    不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。
    1 J0 e( f8 T. h6 E8 z+ E+ q9 x( f我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。
    ! v5 i+ [' t  K8 r% E, \) M0 `# T这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。
    ; ^! P9 W. x# E- q3 N% i" m) [不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。# k7 |& C- \1 y& p- l/ c6 P
    为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?1 N& |. h2 }+ w
    因为垃圾代码太多了。# k8 W6 d2 _# j, E2 ~' j
    : }- I! ]: Q/ \) z/ b
    2 q1 r! G  f( z% H: B

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑 + a, x5 ~# c& W1 K

    6 E( f; C- }5 _3 q4 B/ b' c" m  i, G8 @1 E' E9 I7 y, p+ A6 P. j2 r+ C
    算了,道不同不相为交流
    , J2 u/ T0 f# `" ~: ^" p/ C想起某个梗, X' j+ {0 x2 f9 X0 L- P6 Z
    程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!
    ! C4 I9 ^; C! M9 J% E) c/ s
    # ]2 m; m8 d# P8 t4 \/ P) ~自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。6 ~- u* z# f$ ~7 O2 u
    7 U; Y3 D- T4 x: m8 t
    另外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:079 }+ k6 V5 U( Q) |' g: b
    算了,道不同不相为交流7 W. o  Z) `* G+ i4 r" G9 j
    想起某个梗1 F; @% E& k- n+ h
    程序员眼中的编程语言

    2 H9 Y; t7 x* P2 D% K4 l' C不同的语言适用于不同的人群:
    ( E5 s6 A" }! z% e8 N如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。$ t& r4 }6 G8 M/ E- c, ~
    如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。
    ! i! b: d. [) M0 V) k! `4 w! H% Y至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。
    " R- a: c' O) c" m% S1 ?4 b, R# [4 z
    编程语言的口水仗永远也打不完,不争了* M8 l& l- @5 q5 l

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:35
    . [6 Y/ W2 K8 @0 S  ]$ Y& w不赞成多线程抓网站,但是好贴子要支持!! _7 J6 m9 Z; k! b" J

    ( z" u" }' G( r/ V) {* L/ a自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...

    , ^" L" q  q. a: K下载软件?推荐一款?3 ~0 [* \& J1 m0 ]7 a7 K
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    " A0 N8 a% X" L* ]现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?$ e, N5 n7 k- X
    比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。
    4 }* F( E( w0 m9 P1 h8 P% |9 C除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。3 a1 k5 ~) U( X5 p' U3 C5 p
    目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。& T, `+ }; N% I5 Q# z0 e3 B

    2 J/ L$ a5 l# W( X. r至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。
    + h  x' }" j( o3 `& o' D/ o. k对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,
      O8 ^3 Z! l7 Y9 D目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。
    1 n, G0 c) l( G* C- B' f" }

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:. W4 c: ^# j3 `9 p4 m$ }3 v3 W7 a
    随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。# W# F0 G, b! B/ \; ]6 K1 N: Y
    未来会出现一个新的行业:私人计算机管家。
    ( V0 x) A. q( x. l专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。
      y( n9 h( G  }8 o0 U9 ^; @但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:29. r5 t# g  V, M6 I1 V1 J
    下载软件?推荐一款?% Q" h; B5 ~# [5 h" G" W8 E9 `- F2 ^
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    / z& G% X8 e) t( J0 t5 P现在99.999% ...
    2 D5 ~  a0 `7 }9 M, X9 N& c6 ^% x
    用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。* Y  b6 K5 l+ `% {1 s

    % w& R0 r9 C2 N' y3 z十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。$ R4 r. o2 r$ W% {; r' B* U( s- L% f

    9 o+ k) q- O; }* K4 v' P用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。
    # E8 v7 z. f$ y+ o: Q
    ) ~. z- K5 Y! W5 z: A我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
    大熊部落 发表于 2014-10-21 16:18+ l  n! ^* g8 b( {: \2 F
    用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...
    5 {( ~5 x, q5 \+ c0 _1 h+ {7 Y; `2 I
    我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件
      M0 K% c+ A( X: U/ _0 ?# _0 |! j9 g# o  Q# h. l9 Q! _
    下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
    ! p& O$ e& s) P
    推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

    该用户从未签到

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

    4 I- G/ b( x1 Z, U- _, @
    7 {! e/ O9 l. _& h1 }) j最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差
    6 E. ?5 e4 `& o/ g' [! A& X+ _6 r计算机是用会的,不是学会的;
    % i6 {9 G1 D* ~+ B0 M程序是调试出来的,不是写出来的
    . R, q4 ]) T2 ]- o; e1 Q4 S7 b( D
      ~+ O  G* T& _( ^4 O既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。
    6 U1 C& a0 G  U/ ?你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

    该用户从未签到

    发表于 2014-10-22 21:25:59 | 显示全部楼层
    bt4baidu 发表于 2014-10-22 20:21/ ?, l6 {8 b+ ~
    最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...
    $ X+ J& E0 q6 R. [
    多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。2 \2 S, K) z8 D
    : j0 p. ~* `% b3 s/ `
    我的一点网络小技术是很久以前在X客基地学的,当时花了几百块钱,没想到有些技术到现在还没过时。抓dictionary.com的话用一般的软件就能搞定,老牌的离线下载小软件(如offline等)或这几年流行的火车采集器(www.locoy.com)都不错。
  • TA的每日心情
    奋斗
    2021-9-21 18:07
  • 签到天数: 167 天

    [LV.7]常住居民III

    发表于 2014-10-23 09:53:00 | 显示全部楼层
    就需要这样的教程!学习了~
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2024-4-27 11:16 , Processed in 0.069471 second(s), 12 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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