掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 50958|回复: 148

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

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑 4 z% F9 Z. s# J: m! m# Z
4 @* J9 V4 ~0 F# {( n
这篇文章主要是给计算机小白和初学者扫盲。, R8 W2 x9 |) U' F1 Y; @9 R/ K8 z
本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。' I% ]8 H0 B/ y3 K
只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。
+ y# {9 @+ E: f7 G: V. {& P2 @) {( q" T/ D% o- N4 o
一、计算机的两个终极哲学问题" N3 e) U+ u: F! w( }
1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。3 ], W. {# \  L: {/ X
图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:
% O! e, Q/ M( g) t6 R设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;0 P+ n: h5 h! O. f/ D
机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。
# m% ^$ r! ~) x, [+ S* `+ @方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。- c3 O3 ?0 Z* ^' i
“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。
  |. o8 Y4 Y# X. R; v' z' U6 d+ J' s. k) J0 @3 J) @. p
那么要写出程序,立即就会发现不得不解决两个问题:! t  X: }- T9 ~( y
1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址& `- p" y$ f, V# T7 w) c
2、怎么把两种方格区分开?也就是特征识别
2 P  s0 U4 ^: f$ U8 ]这两个问题,就是计算机的终极哲学问题。
+ X7 `+ U5 I" q: |7 S! S& ?. |理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。
- j8 a, I# X( v2 B6 L2 Q2 C+ Q下面的讲解也会以这两个问题为核心展开。
, F1 a! D' r( h- y, b4 E$ }$ l* Z- \2 d: H
BTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,$ |4 f+ f1 O1 y3 K6 C. [% }5 Q( {/ Y- s
——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。
" E" {8 Q6 \0 ]- J7 x7 ~- ^* f所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。
4 {' ~* J4 P9 |6 |. Y前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,/ O( s* X5 `1 x! T% H+ w
而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。
, R2 n* v% P" }/ v' W3 e$ u& d具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。
3 ~: Q3 m+ Z2 Y1 i0 _
" E( g. u" W' [& [# a不要觉得自己上学时学的不是这个,or文科生,就不行。5 d! f& Y: S# p2 S$ z% B: V. ~
江民杀毒软件大家想必都听说过。% `' ^/ Z# s" M& }
创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。* Y5 h8 x; L5 M& @* K% a  s0 j
咱不奢望成为专家,写写程序总还是可以的吧?0 A/ s+ x: x8 F& `2 \5 `% ~

6 z# K" ~" o9 |9 P二、采用何种编程语言; X- s. t6 W* R
上面已经说过,存放、读取、组织、区分数据是编程的核心问题。% B8 \' @; G) Q% m  Y
显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。
! H) `- B% g2 `& t3 d) a抓网站,恐怕没有哪种语言比Python更方便。
$ u+ D5 C! W0 Q* h3 k- s当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,7 K" d: R* e0 Q% G& {& I* a) u& M3 a+ o- F
计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,
9 m( e+ O- k' y9 u+ F. s& c4 H没有慧根就别吃这碗饭。
4 V! S9 S- B- N- I) }- {  `  D) \
三、网站抓取技术; ^% |3 ~% K; V; [6 y
1、下载某一个网页,提取其内容& y0 N9 Z' b# ]9 y
以前写过一篇,就不重复了。参考:
7 p0 d6 k8 e/ ~* Q3 O! P用一个简单的例子讲讲怎样从网站上扒数据
& j0 a/ U7 b' {' Z# O& j
9 K0 T- Q2 |% a, F  s; `9 G$ M2、寻址问题  Z2 A0 h! c, E$ G5 r$ C$ g/ l: L$ `
下载网页,自然首先要知道网址,也就是东西放在哪儿。
3 Y! C8 F2 k$ ?, j2 ~如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。* h1 |  o) w" @) R7 R
但是大部分在线词典,到底收了多少单词,事先是完全不知道的,6 G2 _7 u% a. J
要把单词弄全,就要想办法得到每个单词的网址。; _- I0 B8 H9 l8 k
总结各主流词典网站,大概可以分为这么几类:
# X( j; `/ p! o0 p/ }: n/ LI. 事先有单词总表) `1 b9 g- {- ~* J+ }
比如http://www.vocabulary.com就是这种类型。+ Z5 F& P  I) V3 C4 K
它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。: m7 B/ M  l  P/ _; ]

% e/ }  O+ m. b0 YII. 网站有索引页面
. a7 F8 J" A/ Y  p% Z如:
7 g, c8 n8 y1 TOALD(http://www.oxfordlearnersdictionaries.com/
2 v% L4 v* q! T; C( I它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/3 y) o/ L7 z1 Y+ a3 {$ |$ Y) C" I
LDOCE(http://global.longmandictionaries.com/, y" A; z0 u5 K1 T
采用框架结构,左侧边栏就是索引页
; s& Q3 q( J, ZMWC(http://www.merriam-webster.com
) Q. D& R0 B* k5 v8 ^6 N索引页在 http://www.merriam-webster.com/browse/dictionary/5 k1 H6 b5 q# C- j" ?- \1 v
等等0 L. g5 M: Q9 j4 L3 w
这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。/ F8 j6 Y* U  W* J' R

  1. ) L$ O; ]2 z* A0 ^9 `' E
  2. urls = []
    . [( g1 b; K& I& r
  3. for someindex in indexs: # 循环所有索引页
    ; V" Z* [$ |) ]# |; U& ]) A
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    - q: c/ ]; i) o2 ?
  5.     browsepage = getpage(browseurl) # 下载索引页面  @, s% b5 Z% D! C! T
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域+ X( I! V9 G1 [6 r1 c
  7.     bs = BeautifulSoup(browsepage, parse_only=target)
    . Q  E( {6 x( `; X& D6 G- O
  8.     if bs:/ j1 u( G( {! A
  9.         for a in bs.find_all('a'):
    - f3 t& O8 j0 j0 i) {% D: h5 Y
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接( g; f$ @" Q# ?% h, u
  11. 然后:
    , k# Q. R/ ]7 @
  12. for url in urls: # 循环所有单词7 i1 s3 k4 C" z- A4 [
  13.     wordpage = getpage(url) # 下载单词页面
    0 X: o1 Z4 k  _
复制代码

* Q7 `7 C' V5 h% b
4 D2 X+ r" A4 S4 X/ W& a" T. rIII. 索引页和单词释义一体型网站4 ~; k! K! v" j3 g8 L3 x3 @( ?2 n
如:Online Etymology(http://www.etymonline.com/$ p$ @1 ^% G: p* Q' I0 c
和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可2 i* l6 T: \! e7 a

  1. 7 d4 s' L8 J0 Y4 o' k8 ^
  2. for someindex in indexs: # 循环所有索引页
    9 _3 R' V, j# ^$ l# m
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    . S$ ^9 w: y$ p& U9 T; n6 O6 }: w6 d$ q
  4.     page = getpage(browseurl) # 下载页面2 `3 L: m; Z, E: ^2 ^- U; S
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域
    3 ]7 L4 M/ P5 ]# _
  6.     bs = BeautifulSoup(page, parse_only=target), p: Q& q0 k: x
  7.     for tag in bs.find_all(target): # 循环抠出单词
    % [3 R9 H  o- H4 f$ W" r
  8.         worddefine = getworddefine(tag)" y& r! i+ X+ q2 @; c/ Z: l5 ]5 c
复制代码
8 [/ [* K& Q' O# U

' ^. H7 H. f) b. BIV. 片断索引型网站
+ I2 x0 S4 p$ H2 `) B如:9 Z; N  B8 D& m" C) y
ODE(http://www.oxforddictionaries.com/: w. a! [: C7 k
每查一个单词,右侧边栏有个Nearby words# R  W$ W+ S$ M$ C
RHD(http://dictionary.reference.com/
4 Q# V3 B; ~$ n4 ~. u" ~右侧边栏有Nearby words
( O6 f! t1 I$ I/ ~# T1 ]! e. x: kCALD(http://dictionary.cambridge.org/+ e$ F4 d3 ]; j2 N
在页面的最下面有个Browse栏,给出前后相邻的单词
! b0 C; T4 u" A6 t5 O这类网站没有总索引,只好利用它的Nearby栏。& D# x2 v1 V/ [1 i, k6 p+ w+ e- Y
思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,1 \* y" y9 X1 F
每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)
8 t8 u2 C% L% N! U& d9 s
  1. : L( ?8 ]5 i5 B6 v0 U6 R
  2. cur = 'a'* K& z* J. K, D+ e; i3 p8 v
  3. end = 'z'- g+ e& P2 F: @/ g7 |* @& m' K, Q
  4. nexturl = ''.join(['http://somewebsite.com/', cur])
    ) ]8 }# N+ U5 }1 p! ?4 Y+ I, _
  5. while cur!=end and nexturl:
    - ^+ u5 U+ s& F8 D) ?" m) E
  6.     page = getpage(nexturl) # 下载单词页面
    4 \5 q% h, I3 N+ ]" B/ W3 S1 ?
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接
    1 @; v& Z/ h7 ]7 O5 u4 g0 z& E
复制代码

) d: j/ @; \( i; h) n' l  I& X; E, m* j
V. 完全没有任何索引,那就没法子了2 }. t* r. j. q& u: \$ B% S
当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理5 m9 F6 C4 s+ J7 C8 k& u+ k; |
理论上也是可以的,就是效率差一点;
) I4 j, Q$ M( g1 S: |4 I" s* P另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。
8 A6 v+ ]$ k/ j+ F% n! C( [! o+ q+ W7 N! X3 k8 q
3、提高下载效率/ E! ~' m, R7 \' q- `1 \5 P, ?8 g
I. 多进程( h# o2 O- I6 ?( k
上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。
: o" K% l9 k% u2 j; i实际抓网站时,这么做效率显然是非常低的。9 |8 g* `3 N& c) s) Z
假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,4 x" d: |( a6 r( E3 P! A
有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。
: r" k$ M# n6 O/ |  t  i" T' B假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?% K) j9 O, {& t+ b/ t0 |
要速战速决,就得开多进程。: S7 G2 Z( l4 K) z$ |
同样十万个单词,分成25个进程下,也就是28/25=1个多小时。% ~1 E1 d* o  L7 K; G
再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。
% V! E: p7 L  s$ v  L5 e6 r) ]! ~% \+ K在Python里开多进程,同样十分简单,
+ z( b0 _0 |8 Q

  1. 5 \; A& m# m' n9 Z# N
  2. from multiprocessing import Pool1 U! T9 ^, Y8 p& R( E- Y2 q
  3. pool = Pool(25) # 开25个进程8 {. `3 H2 W" X* ~7 T  q# e" Y
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数
    8 x' e) T; c- `" W/ u- |
复制代码
% g! B: [0 l. _. }' l
这就搞定了。7 I6 h' ^6 `5 O/ d8 x) z" r
6 f3 S: A1 Z* k. V. p
对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,6 o$ {. k; h4 I) X% m
关于IV.,事先没有单词总表,就只好采用区间的概念,$ }1 r# R* E! |5 L
比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载
" E9 p  N% W2 |
9 n" t! `/ Z6 m$ o; D/ N初学编程的人,一碰到进程、线程,常常有种畏惧感,7 c* P, L* U1 @7 ]  C2 B5 `
看到同步锁、共享内存、信号量什么的顿时觉得头大。! B! c+ w  Y$ c0 s; I# E( I& ^
其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,
! W7 @8 a; O, z( \其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。9 p# c: a$ X! x
0 M4 H/ ]. l( {9 N+ T
II. 断点续传3 C+ y3 \) G7 F) v
事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。
/ v! m7 |9 y" s. W! [* z所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;4 _8 \6 ]9 q" V3 J/ P
即便无法自行恢复,也得容易手工处理,不然可有的烦了。
) I. m* c0 U( |2 D& l8 v这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,
/ q. A  l* e( u1 q6 q直到所有区块下完。
$ d9 k, M% ]2 U% o) L/ a7 \2 I6 z
  1. 6 K  F  R% t( G1 t: w2 B
  2. def fetch_a_word(part, word, url, data): # 下载一个单词
    $ b3 v4 d! e% `$ N/ f6 y
  3.     word_define, failed = get_a_word_from_website(word, url)
    8 s3 b. @- u2 U  {+ z" g
  4.     if failed:
    " U- P8 a; N: `. K
  5.         dump_failed_word(part) # 输出下载失败的单词及网址
    + c& a5 r$ z$ t% ?; ?
  6.         return False% Q6 d1 M# ]* O+ l9 O' M. t8 Z, w
  7.     else:
    5 n* ?2 Z* F! t9 Q0 {; h
  8.         data.append(word_define) # 保存下载成功的单词数据
    8 k, F3 N  z  V5 ~; G
  9.         return True
    4 ?; ^5 e9 E0 Y. y8 {
  10. $ D  W" {5 C* o% R7 C0 s' m
  11. def download(part): # 下载一个区块
    ! i3 I0 Y" J+ E+ R# o
  12.     words = getwordlist(part) # 读取单词总表9 S' x4 g$ J$ v) \. Y: u
  13.     if hasfailed(part):* @6 T# c( j7 o/ K
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址0 |* z3 C1 N2 M  v. y' @1 I1 w
  15.     else:
    # j- I, q/ S- M. B
  16.         word, url = words[0] # 首次从头下载
    - q" u- b4 ?, H9 [5 X
  17.     data = [] # 用来存放单词定义4 |4 o' g- h1 Y( W" G+ j
  18.     while not_end(words): # 循环下载
    & I& v" ^* e: ]
  19.         if not fetch_a_word(part, word, url, data):
    2 Y+ j1 {' E: k2 @/ N
  20.             failed = True1 n: k! V2 C1 t) R/ x
  21.             break  {/ k  Q% Z! `% n' C: B
  22.         else:
    5 C4 H8 W6 J8 \' X
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址" Z/ T5 f& J$ i; q5 f  D: ^# e
  24.     if failed:
    8 M$ g1 Q# w5 j4 ?( r6 Y/ |9 t
  25.         suffix = '.part'
    1 G* P1 R8 a: [  g3 H& Z
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'# T# ?% K6 g4 a4 q- A1 A! w$ m/ @: y# @

  27. 9 P. O6 N4 w- c0 w( v
  28. def isfinished(part) : # 判断某区块是否下载完成: e! T( j9 b* S/ J
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断% S4 H0 S4 C2 f$ Q3 Y
  30.         return True6 H3 q8 P1 ]. x# @9 \) L
  31.     else:4 f! P8 |  }5 y
  32.         return False
    : j8 W2 I- t$ J4 ?2 \
  33. + z* a- Y# o4 x
  34. def downloadloop(): # 循环检测未下完的区块
    $ D0 {9 R/ d' r
  35.     finished = 0' j' Q0 S- u2 Z
  36.     while not finished:% ^& R( l: u6 G; q
  37.         nf = [] # 没下完的区块  z; k! t* @" z! e' ~
  38.         for part in parts:
    0 M0 s  I2 d, E" ~- N
  39.             if not isfinished(part):
    6 O, m( t1 q7 \( _
  40.                 nf.append(part)
    4 u) i& `) @: z# F& C/ a/ T9 R- o( r( L
  41.         finished = not nf
    # i8 v5 [# _" ]$ A3 `, _' _8 ]
  42.         for part in nf:6 G9 i  K# S7 m" ?: h0 x& Q
  43.             download(part)
    0 p4 i- ^0 x8 ~# i
复制代码
$ V0 ~+ f% _) G/ H% \7 t4 ~

. F3 p) I) q2 c8 fIII. 高速下载网页的小技巧) T- |2 @! X. |1 `! }. s9 l
Python里面有三个库都可以用来下载网页:urllib2、urllib3和requests。8 y' ?, t0 Y( [0 p* d" w
其中urllib2是Python原生的,urllib3和requests为第三方库。. L* z/ }2 G1 M7 G, M; H# r$ b
(似乎Python3已经把urllib3收编为正规军了)
( Y; ~- z+ c# A) w& Q3 ~; T这三个库有什么区别呢?
4 o5 i& z2 g0 U. E% p( r形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。# `/ S* }) W# B  _
再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,
# S0 N1 g& S- O. l( q! Y1 ]" g) r, f所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。
+ _' o# `" X' P( X' g但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。
9 E8 R( P5 I! o/ I, z4 @2 ?5 W这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,
1 e0 }7 ^9 d& p% c0 ?- x2 x通吃一切网站。
  f& D6 V0 t4 J所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。( ~* I$ ]# ~, P# h- G+ t9 Q# J8 m
这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:( K5 ^. E; ~6 J1 a# A4 s8 H6 X
http://urllib3.readthedocs.org/en/latest/2 C' F+ j3 a5 O; v/ R
http://docs.python-requests.org/en/latest/" C3 y" P# X$ Y6 F8 {# p0 Q7 W
  1. 1 b' H, o" y; F- k- F" b* i
  2. #urllib2
    6 ?1 Q* C2 i9 e2 \3 Q4 p0 W
  3. import urllib2
    9 \5 Q* E7 u- X! k; _
  4. def getpage(url):
    1 Z- w) T, S% y2 E
  5.     req = urllib2.Request(url)
    3 `4 o+ P' e! s( T/ ?
  6.     response = urllib2.urlopen(req)% n3 `" x2 S; G5 Q6 ?# ^# C
  7.     page = response.read()
    ; }+ f& \& H# i: W
  8. , u, C2 q+ O* M2 e9 q
  9. #urllib3
    ) @& e7 C7 D) g3 v. A
  10. from urllib3 import PoolManager: f; U2 Q+ N" o: Z- {& W6 n( Q
  11. http = PoolManager()' h: ~+ ^: y  A( L/ S& N
  12. def getpage(http, url):( Q! V4 v  f+ o2 Z
  13.     r = http.request('GET', url)# z5 P7 ~% N0 e+ J* q9 X
  14.     if r.status == 200:3 n. k- E2 S: n
  15.         return r.data
    # a' a' X1 v8 h
  16.     else:; I( n% _( Y1 V" l6 l) J
  17.         return None* V, j) \( ~: [, t4 L6 ~  E

  18. " ^9 m: r! a# y7 K# _
  19. #requests2 D- I$ v2 z  {- B
  20. import requests3 z/ T( \1 Q$ x2 v6 U3 {- |- X2 O
  21. session = requests.Session(); G, `' V: S' ^- ]8 P
  22. def getpage(session, url):* ^7 V. V/ B1 ]" J# k* p' _. ?
  23.     r = session.get(url, timeout=10). i& K2 V/ t. N% ^8 o9 z
  24.     if r.status == 200:
    8 I# Q, A& i2 \9 b8 s! x
  25.         return r.content
    + t8 S/ t1 Q/ N- A
  26.     else:
    2 t2 X2 t6 P1 R2 W' w  W
  27.         return None
    ) W& `( l5 o7 }! \5 \5 `
复制代码

/ z8 E. g" b! W$ o) g四、后期制作
( K6 c9 J  ?  b7 j1、文本处理,是个特征识别问题。2 p) V) Z: j" x: D  F4 U' g
本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。
/ o  L6 C6 X& C% b' T5 v- t当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)# \( V4 \, {6 S2 g/ s
都涉及到特征识别问题。5 l" `' V* w% u
相比这些高难度动作,文本处理算是比较简单、基础。
3 [  v2 `' U0 w1 i* Z2 ~0 J7 c; MPython里常用的文本处理技术:正则表达式、BeatifulSoup、lxml0 F3 C" E8 t1 D" N- m! c
正则表达式非常强大,但没法处理递归嵌套的标签型数据2 f4 ]  I7 o* \  S) Y# y& f8 C
(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);
0 h5 j8 {  \1 O% t+ {BeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。
1 `3 ]: K% Q4 y2 l所以常常要结合使用。8 e# q) ^! F! R" d6 H  ^) F
这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。
4 B# t( v6 y5 y* `/ j3 b
  |: z0 X& k! ^6 I- c. Q. H3 ?: c2、排版
) E$ J8 X" h. Z" q2 e! pHTML、CSS的基础知识:
% b) s' I4 P; \http://www.w3school.com.cn/html/index.asp, d4 V; i, ?. i  C2 M; Y
http://www.w3school.com.cn/css/index.asp: [& r9 M3 J6 [% U; E2 O* D
http://www.w3school.com.cn/css3/index.asp% v! @' Y. ]& K1 y
非常系统、非常全面。4 d+ \: v- g! c
排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。' H; Y$ |3 B) _' Q7 U! }& c

- r  y/ w# T5 t% U五、结语" s+ j. `6 F7 o! M" L
花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。$ b1 r$ G1 l# k
所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——; A  w& L% |' s. \+ s) I6 B
大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。
; R" w) d! S/ \/ _  f+ r; H$ g  a- Y$ V) G$ L, |2 y
打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。
! \  D$ I" J, j- f6 H! s
: c) g2 D5 E( K! ]& _+ S. B只是拜托不要打扰别人,真想要就自己动手。; ^. ]4 ^0 [3 z2 d
尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。" L0 G$ n$ B7 Z/ r& b0 n
水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。
) k# l: F+ J4 A6 g' O8 ~虽然每个人都觉得自己至高无上,应当受到别人重视,
* U) O8 `" m; H8 j) E8 c( k: h8 F其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰
' j( m6 r8 ?3 H8 b3 K& h  R9 A! I2 m) p( P7 Z5 z8 k
$ X3 h; i+ Q0 Z5 y7 D$ H* N) m# g$ H. n
========
, T' g3 u/ x1 C5 ^7 s; ?% U' [六、拾遗
2 I0 @( r1 @; C) Y( h' s关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类: H% d8 d5 N: v% O' |6 K7 t) Z
确实如此1 P7 y; P$ [( W' T# D* o
不过这里只是举例而已,不用太较真啦 ' ~" V! o( D; M  a2 ~3 q! Z+ i
实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏( F* n; C, y4 u0 C  K
这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。* B2 h0 M* g" D; _
即,
* Q0 V* Y  q2 T( f. u! w, Z7 P第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)
7 k# R. h* ^4 D* y7 g* R第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)& R( N5 i) W, [
第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作, O) W/ w' @' ~5 @" `3 m! z4 b: G
。。。- D! T. Q5 c( _1 K+ e
直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空)* j0 S; w4 U; V2 b$ X
最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。
( q( B6 V0 ?9 x9 V4 \  j0 b形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。2 R! \4 c6 {: G! w9 c
因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。$ }1 l; m# l) n

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:41( }+ ?: j: A* o! c4 I
感谢楼主分享知识和经验。5 E" |3 @" W- M

" d1 c% R. Y' A6 S" N, e: r每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...

6 c2 e8 Q& R, m; u2 L现有的mdx词典,其实足够绝大多数人用一辈子的了0 ^  O& b1 M# p
" M3 G0 M& X8 M# l  [  I+ U- K! Q
本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。' n+ v0 q3 h0 \) R1 T) }# o

* D2 B* ]3 `! \6 ]! w本人最常用的词典:
; L  a9 L, P# ]' Q, e7 {主力阵容:VOC、ODE、WBD。) v8 r, ~# A& X' F2 I
三本都是中型词典,收词量均在14w上下,以本人目前的阅读面来看,还未遇到这三本里面查不到的单词、未收录的义项。据说史上掌握单词量最大的人是政治家兼散文家丘吉尔,也没超过14w。除非钻故纸堆,恐怕用到W3、SOED的机会不多。
1 J% m9 m  \) d  }% j" j3 o
" c8 m) F* j# B5 |7 `替补阵容:LDOCE、词源、短语8in1、韦小黄&韦小绿、Garner Usage。
  e: J$ P6 a4 DLDOCE用来查常用词的惯用法/搭配、语法信息;; N% [! M4 m( t, T# a
词源用来辅助理解、记忆单词;
9 H; K9 J! z4 N* d短语8in1用来查漏网的惯用搭配、非正规用法;
0 {4 \6 _1 H3 f2 b- @韦小黄/Garner Usage用来辨析/比较同义反义、正误用法;
6 U. ?$ I+ o: H; Q' s8 `1 m韦小绿用来辅助理解、记忆大词。小绿真是本好词典,有人说里面收的单词都是一辈子才能见一次的那种,其实不然。它虽然只收了1400多词,却几乎都是高频的大词。从本人的使用体验看,查得率相当高。比如最近看新闻说一种超大蜘蛛,里面有个词arachnid。别的词典只是干巴巴地说4对脚的生物之类的,只有韦小绿说了它的来源:从前有个女孩叫Arachne,编织技艺了得,把雅典娜女神给比下去了,结果激怒了女神,被她变成蜘蛛,终身织网。这种解释多有意思,看了永远忘不了。) r! r2 I2 ^' v1 \1 f2 }6 o! x

5 g5 s7 u# o" X/ F上述词典,坛子里都有,无非是版本新一点旧一点。比如朗文5和朗文6,有人统计95%以上的内容都是一样的。如果是完美性格,非要用最新版,那就只有自己动手。不会有人在词典出版的第一年就去挑战版权方的。
: H" n- v2 ^% [% \. r) H8 N“对于好学生,任何教育资源都应该是免费的”。虽然本人同意这种说法,也认为现行的版权制度存在重大问题——有人靠垄断知识获利,却完全合法;但是本人从未打算挑衅版权方,更未想过做Aaron Swartz那样的斗士。靠垄断知识获利是有点无耻,但如果没有利润,也就不会有人去做整理资料的事,这确实是个难题。1 r0 e2 Y6 N6 s

! ]% Y" m+ S# P% I. ?3 b. v还有些人没事喜欢收藏词典,收集了一大堆,却从来不用。说到词典收藏癖,想起以前的一位室友,那家伙每天最大的兴趣就是下载影片刻光盘,大概刻了几百张,还在不停地刻。但是从没见他看过,他也不让别人看。
( G5 Z. L2 V( j$ U% u这种癖好大概是来自于原始社会的一种遗传,人们总觉得应该储备点东西,说不定未来某一天就会用到。其实那一天说不定永远也不会到来,不如就把今天当作那一天好了。有多少人买了一书柜的书,到死的那一天都没看完,甚至有些书连封皮都没揭开过。
3 E/ I! c8 L( Y6 T& q* u

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。
* V! Q0 v% ~7 |4 p# L  K' c/ k其实只是你没有发现而已。
( N/ c! |0 ]/ w3 SODE: http://www.oxforddictionaries.com/browse/english/+ ~; h& c/ c5 `* y: w
RHD:http://dictionary.reference.com/list/a/
9 Z" f0 T1 ~% S: q0 ?CALD:http://dictionary.cambridge.org/browse/learner-english/( {4 h5 k# x3 z& D
# x5 S! F+ h9 _% G1 P( D! w4 I& a
如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。
$ a# s& N% o3 d+ O6 e以第二个为例:" H+ R' t* I5 J1 X0 p
inurl:browse | inurl:list site:dictionary.reference.com
2 V/ y# k8 N  E2 t4 _: ^6 A: u0 o  T2 C( _. d2 @3 c4 k" }
PS:最近才发现这里,发现资料很多啊。
4 j/ c% O% _, _+ y, I; s5 T

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧/ _) w* p& f1 Q/ {) Y0 j/ M
9 s- O! |: l+ d, w9 K% L
假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改- S- x0 }( x* k2 h  S$ U# c
或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下8 S: o% G" n' F1 Z
结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。
% T2 U% o- S6 }0 R这里有个比较省时省力的小技巧,可以快速定位到想找的地方
  k1 V; h' Q/ B6 O1 f) Q
: n  y) `- s1 R  k( P+ P( E8 h: ]1、Goldendict里,在想修改的地方点右键,有个“审查元素”:/ v; d1 B/ a( z8 m  ]" I, e

, j+ X' `4 {+ o1 V( _7 P. M% g+ H) ]  Q/ a  L! M/ l- e
2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事
. G2 b3 a+ }& K
$ W! D7 t. f: H* s& [5 X/ }( C
; S& x% I0 p8 {  B3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方
+ l' w0 H7 v- v2 E1 P8 M* _2 G( r/ {( a. ~: `- e) ?6 ^
5 E, n3 \2 p& ^' \
收工

该用户从未签到

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

& t  i# O* V, d  Z4 \. @- U. i  i4 t. |: q

: G; b2 h) F+ k4 \3 e0 D5 Q
9 C$ h7 K/ n' o0 _0 c5 ]4 Q感谢楼主分享知识和经验。
7 k6 \& x& Z4 h  I/ g
% }0 w) M7 G6 p$ {1 W每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。4 s( v/ Q! G1 [& R( r

/ A, @" }3 R5 |私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。/ M* l( t' k4 m6 o; p3 k# G
+ ~% Y/ f6 B5 S# \
但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。+ P9 M: ~1 U! m+ F8 r
/ ~2 F6 S) l6 K7 k/ l
除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。
7 P4 W: u) ~7 S7 {( t
- I: J: ?8 R' k/ T# ]1 B+ n" @" F: y- H2 i, ~
$ Q8 I' ^9 q, q

* L" \( u+ q$ Z0 k" w

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件# J. J8 I+ s9 V" l: t8 ~
  • EmEditor
  • Beyond compare
    3 n7 ?/ Y& S; ~' S

; n, P6 j* j; w, v
6 r2 [7 ]0 B; ~3 _1 K: I前者用于编辑,后者用于差分比较5 X$ c9 D, I, v2 T9 X; |7 X7 j3 W  O
处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

发表于 2016-6-8 07:41:03 | 显示全部楼层
bt4baidu 发表于 2014-10-25 21:01
1 ^: o# n* O: i& ^6 ?现有的mdx词典,其实足够绝大多数人用一辈子的了
9 t/ i( y2 P  b+ M6 V% _6 m' B
- H5 E% j! t0 P/ m* x本人前段时间制作、收集了不少,经过一段时间的比较 ...

9 m% D8 L# ^( T- L肺腑之言。

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考( c# |8 E) _( U! |: q4 j

. f* M+ U4 P  M  [/ B6 g& T网页设计中最常用的字体有哪些?(中文和英文)
' U) o! j* T- z2 [http://www.zhihu.com/question/19680724- a. ~! m. s. r; T+ Q! k  A
6 w  @3 r3 x' a- W
本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode9 c# Z' L  p1 i, K
这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全8 a+ X: E# b! J( |% z5 v  f
另外Open Sans字体也挺漂亮; u  ^% h1 V" c/ q3 M2 {' }* w
  • 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:215 ^' }. v! h/ A
    最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...
    7 L# f" a1 ^- C# o& O
    感觉找到适合自己的问题好少啊
    1 H) k8 ^; N  G3 v! |- R- G这个适合的话感觉是兴趣和难度5 _  N/ \, H0 S3 f* I4 }1 U8 g, Z
    想请教一下楼主是怎么处理这些问题的呢, K, @0 i* Y) x3 s
    还有种不系统的感觉
  • 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 编辑 % ^, t  [6 E4 L& D$ w* {
    " P) Y6 @: D6 `
    写得很好。刚看前几行的时候,的确激动了一下子。虽然没怎么懂,但是第一次能坚持把这样的东西看完,觉得也是对自我的一次超越。谢谢!

    该用户从未签到

    发表于 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 编辑 & v) i! i( b( A& L  ]2 A

    * x+ E& o; _6 ]* }$ ^1 H: Qjava和.net就是个垃圾,我懒得提而已" Y) S! e7 ]$ c/ q6 o$ B3 S& y/ w: N  i
    在Linus这样的大神眼里,连C++都是垃圾:0 Q7 O$ x; _: a0 [8 R  h+ o( D
    http://www.csdn.net/article/a/2010-06-12/218785* A+ d$ o/ X* p
    ( N1 X% ?7 l6 X5 T4 t& U2 w- U' w
    如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。
    0 B0 ?3 M  m5 l8 t
    6 [9 P% c3 D; x% S4 ~不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。
    ; X6 ^8 Y% _1 }% ]# }1 }" ~我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。7 J. F% y/ m  [7 R6 a
    这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。. W' c" B- K' I+ \+ H/ E/ Y0 z" X+ G
    不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。# L! p, O3 z. w: f/ W- n5 _  V& u
    为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?9 D# Q. j+ \; I% C, ~$ i
    因为垃圾代码太多了。: U( }  Q0 x4 R* n& o6 l7 d& h2 v
    1 m0 S& u! ]9 s6 B) L

    4 Y7 t$ Y# |* }( T! }" Y3 T) D

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑 ) ?/ c0 L8 U6 T5 e+ a: }, U/ ^

    % w9 `/ X; q6 b5 L6 l% R, @$ W$ I0 }2 Y9 H6 g) `5 u3 `7 s& W7 I6 ~& u
    算了,道不同不相为交流4 d; `/ n1 I: g, c* m
    想起某个梗$ c9 k4 Z1 o. e' `
    程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!$ z# G& j; Q' V1 X3 {1 b

    4 D$ m# F/ p9 l自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。9 R- f6 E; l6 n  n; u

    ( i/ J0 K& n9 f4 m- 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
    6 V4 j$ k" _5 ~& g0 R) I算了,道不同不相为交流
    & Q: Z% z1 u; A4 \/ w想起某个梗
    2 m- i/ Q, f) @# ^7 ~程序员眼中的编程语言
    3 t( P, ]! M7 z$ s5 E) w
    不同的语言适用于不同的人群:
    6 g* E, B9 e: w. j如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。
    6 u) c, B) n# }9 ?; X6 u9 u如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。+ C) A5 o" x5 D/ M% W9 c( B
    至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。
    / B0 E; j6 }3 a. Z1 R. V' @
    . W5 I6 O- T- t$ T编程语言的口水仗永远也打不完,不争了4 A- \" ^1 u7 W: X: ]

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:359 k: r( D3 e8 W" `: s; B# ]
    不赞成多线程抓网站,但是好贴子要支持!
    8 l8 }" ~/ o2 g- Z6 b& c. u
    # f* s" e( |1 q, U自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...

      S6 `* c# {, A9 v下载软件?推荐一款?
    2 M0 X/ g) X( V最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;) l7 y% h+ G6 A
    现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?7 h3 S( P% y2 s1 M5 y- H
    比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。
    * o, E! e. t/ F( J除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。
    1 |, o0 c' U4 y( w, I目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。$ d$ X7 A" |. ?
    ; Z7 V. o" L' o% [6 `
    至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。
    0 x5 O6 ?# D" C) u对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,
    1 ~4 t0 r6 V4 m* c目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。3 p; @6 u2 D. K

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:. K4 N. ?, t2 b- b1 Y  W
    随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。
    ! y! q7 f0 L. t7 i- J# ~未来会出现一个新的行业:私人计算机管家。
    8 N8 @: B( `! j( V专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。2 k8 S1 B- s( `! j- Z! P
    但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:29) B( P. J* R, i
    下载软件?推荐一款?3 V7 o3 C. O: y- I0 W" |1 \
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    % [( N; C1 y$ R  _1 U现在99.999% ...

    0 }3 j; c" N# ?7 v6 t用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
    ) a4 t" t* f0 h5 X4 j' r! C* k
    十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。+ ?! m3 J% F7 ]$ w9 }! G2 T8 R
    7 j( P( E5 z7 ?
    用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。5 R6 [. T6 {2 z! m' [- V4 d, q
    ' d: [  r1 j+ c- G- V& e& f
    我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
    大熊部落 发表于 2014-10-21 16:18
    7 s9 v+ i2 I. R' E用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...
    8 f8 W3 m9 [+ x1 R; c3 H1 z* E
    我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件7 T- q4 l' K# O6 u1 r8 |8 F
    ) G% Y$ G% v0 `2 ?
    下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。

    $ M- j2 A- e  p7 }2 x1 }. Q推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

    该用户从未签到

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

    . v2 m# _! ]' J5 J$ R4 O1 B. d5 V( t- `) O6 O
    最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差
    8 [, A$ s: R) H2 H4 |计算机是用会的,不是学会的;
    3 V7 ]) `8 B" `( F2 u; R程序是调试出来的,不是写出来的
    ( n# P) @+ A% x) l% W4 F
    9 z3 D; Z: C8 U; p既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。
    " h) ?) y3 b' r# H2 U; O$ h你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

    该用户从未签到

    发表于 2014-10-22 21:25:59 | 显示全部楼层
    bt4baidu 发表于 2014-10-22 20:21
      b' N+ B% _2 E8 a# V7 ]最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...
    - y! ~) e8 D, O4 }; n' G# n
    多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。
    ' _& v' S0 c$ |' i. N3 F* g) ?
    : u# G: n- y, e! y& 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 06:22 , Processed in 0.081194 second(s), 16 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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