掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 51083|回复: 148

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

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑
( M" H9 F: p# J6 Y6 Z- Z8 `$ d5 r
: p) ?# N7 D7 r这篇文章主要是给计算机小白和初学者扫盲。3 i9 `. W( S0 G
本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。9 O% S2 h& N" Y* }! q8 m/ s  x. \
只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。' T* h% t' N2 }8 y; W

9 u6 s" ~2 k0 s5 V' V) Y! J1 d4 H一、计算机的两个终极哲学问题$ i* @+ H& d& I7 b3 `" z
1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。9 g; c; x: R/ ?. p0 s
图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:
3 x. N. p+ e- ~设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;
" v. a  t; \; ^* n机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。
9 z4 {1 S9 Y' e% A2 q方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。4 l3 c( b" p  y# q- y
“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。# d- j# z/ n& m& R9 C
. j) k+ n5 p, r2 K+ ~5 i  D5 V
那么要写出程序,立即就会发现不得不解决两个问题:
5 b: E, d$ @; B: t7 B1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址) f" p% V* v) q) \9 u0 u# k0 o6 O4 w
2、怎么把两种方格区分开?也就是特征识别
/ R4 M# ~) b2 A0 p* }这两个问题,就是计算机的终极哲学问题。+ S- ]0 r4 Y8 N
理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。1 J5 t' G9 Q! n  ~
下面的讲解也会以这两个问题为核心展开。" t  F' _- p8 x
6 q2 q7 c0 o6 C5 _; E8 B7 q
BTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,
4 \) s& ?; ]! F% `——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。
/ M& b: ?2 }0 G4 b# v% s所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。
, e" g5 E* U1 u0 q& Q2 x前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,0 _" ~9 w/ ^3 s
而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。
; o. c  q# W2 B% J! [' h具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。
: z4 R6 [/ L5 y/ r* p4 F0 n% [$ g7 x$ Y1 Z! _7 K) F
不要觉得自己上学时学的不是这个,or文科生,就不行。$ K/ ^7 a- T' `% E' M# v
江民杀毒软件大家想必都听说过。
* r% p& ?" ]. W' O创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。
1 o; m  M8 O5 X2 L, Z, |+ b% q6 m咱不奢望成为专家,写写程序总还是可以的吧?# n7 G: f! J' P- h" r7 K0 H6 X: j$ D
1 n( }, k. X+ c5 A  G3 Y/ Q  v
二、采用何种编程语言. f' `2 F* ~# |% w( u) h% |) b1 d
上面已经说过,存放、读取、组织、区分数据是编程的核心问题。
% r( J! g, x9 A/ t7 b! l显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。
, g9 P5 L! b4 p% o% I# {$ }) C抓网站,恐怕没有哪种语言比Python更方便。
- n: F" T4 L9 P当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,
" A+ Z: X0 k& o& ]0 ]计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,( ~4 t$ f" P0 W/ L- K+ }  J
没有慧根就别吃这碗饭。) O) T' b: r* r: i4 X

  l& K* h3 Q0 @* A: Q( w- l* x三、网站抓取技术. O8 p6 `0 z* k- U; y% ]9 o
1、下载某一个网页,提取其内容
: ]- h/ J# o6 k+ j. l* ~以前写过一篇,就不重复了。参考:% B3 j3 B/ \" ?+ g
用一个简单的例子讲讲怎样从网站上扒数据
& r& Q1 Q- e" q$ C1 E4 J/ E2 x! x. m% g- A
2、寻址问题
; g& ?$ P. H2 p: l! ?- x* o1 X( l下载网页,自然首先要知道网址,也就是东西放在哪儿。$ Q8 b7 ^. x2 `2 f+ F! Z
如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。
; f& q' M& y: S# v# U. c但是大部分在线词典,到底收了多少单词,事先是完全不知道的,5 o. ^8 Z: I/ V. B  Q- T
要把单词弄全,就要想办法得到每个单词的网址。
  f7 L. j$ i, k& I: N总结各主流词典网站,大概可以分为这么几类:
/ Z) h& Z0 i. z: b4 T' r# C' [2 U3 \/ wI. 事先有单词总表
- h7 p1 p# I3 A6 D, D8 _1 Z比如http://www.vocabulary.com就是这种类型。. {+ R' D! h( h' C3 R; z- l* ]3 V+ z$ Z
它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。
, _$ a5 ^! F$ l$ {: F& V* @2 V
+ r2 O- N: n& P) uII. 网站有索引页面
4 x- N1 V/ i3 q$ L1 X如:" `: R* _+ L+ G$ T( S
OALD(http://www.oxfordlearnersdictionaries.com/
. o; X( K' g2 G它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/; p& n( i& O+ J* A$ E  r0 x6 e
LDOCE(http://global.longmandictionaries.com/
! ]) E# |9 w! G7 X$ @. d9 G$ t采用框架结构,左侧边栏就是索引页2 Z9 n# K# ~1 e! s8 @. q. n
MWC(http://www.merriam-webster.com# S8 z" d; F; C1 O& S4 u) C$ J
索引页在 http://www.merriam-webster.com/browse/dictionary/
* {$ l" k4 n& X: d) n& `' N等等; U! h% M6 j1 }6 [6 Z
这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。
- {+ y2 I5 w, i) l

  1. - p. G& y% Y* Q4 [8 e2 b( J
  2. urls = []
    " z/ `6 ], b0 {# r& R
  3. for someindex in indexs: # 循环所有索引页; a0 [3 ^5 p3 M' \4 e' z! \5 f7 j
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex])) x, E1 }# d- i4 C3 G1 Q
  5.     browsepage = getpage(browseurl) # 下载索引页面
    3 s, e! I* t8 D8 J* {
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域" t1 j4 p  Q9 K
  7.     bs = BeautifulSoup(browsepage, parse_only=target)
    % p2 z  K/ Q; A( q7 d8 G5 w. D2 |3 x
  8.     if bs:. \- Q; U8 @7 I
  9.         for a in bs.find_all('a'):
    ( ~4 c& R6 p( w7 b8 f
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接' a( h3 }7 B# [9 I* x! P5 b, U
  11. 然后:
    * ~* c1 i! g5 u) h' U+ V% J
  12. for url in urls: # 循环所有单词
    " t+ {$ l6 n9 B- b* k
  13.     wordpage = getpage(url) # 下载单词页面
    ' F0 L6 j5 ?/ ]- `( i
复制代码
! C4 n# x# a& @* v/ O1 d

* p9 T/ P6 `( q+ S2 l6 n" WIII. 索引页和单词释义一体型网站
  r' \- ~! \, v9 Z如:Online Etymology(http://www.etymonline.com/
. _7 @& D& q: P和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可: d8 D* o7 x' u+ Y. @

  1. 1 \6 D6 _7 i7 a# J3 E9 [
  2. for someindex in indexs: # 循环所有索引页# ^4 B+ b3 J2 v2 L" Q
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex]), f& [+ G. z+ R+ Y0 y8 J
  4.     page = getpage(browseurl) # 下载页面6 N9 i; z1 a! G" U* |
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域, y! J. Q8 b+ ]  H3 D8 `1 l# d
  6.     bs = BeautifulSoup(page, parse_only=target)
    # I# i5 @  ]$ V8 V  w/ m! T4 c
  7.     for tag in bs.find_all(target): # 循环抠出单词
    ' j) k/ ~8 z8 c& e. F* k# @% |
  8.         worddefine = getworddefine(tag)
    1 a5 b9 o2 a/ Z
复制代码

9 k2 M: x; m3 l9 J8 Q1 q1 Z" C, I, w! x7 M; i- {8 r7 M5 p( m
IV. 片断索引型网站
: c- A% K  o8 F+ r: x4 C) L如:
( Y: N0 s/ }' f- o9 a) |ODE(http://www.oxforddictionaries.com/  e. W- k3 E  N2 A+ J% f
每查一个单词,右侧边栏有个Nearby words7 B9 p- e' i7 U2 f9 p' r( [: F/ @" H
RHD(http://dictionary.reference.com/* U0 j3 n; }- B4 g
右侧边栏有Nearby words
6 P! E* k" @1 {CALD(http://dictionary.cambridge.org/
* a/ M+ }) R5 T7 p& B; |在页面的最下面有个Browse栏,给出前后相邻的单词
7 v& s' I: _5 m0 G6 |3 Y# F这类网站没有总索引,只好利用它的Nearby栏。
' r* o: @8 P8 K" E9 y思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,# z  S- y: h- F4 R
每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)- v# v/ J, R& J( [% I) J

  1. 6 i7 j* @" F+ G- k. z
  2. cur = 'a', r$ n7 U" Z4 `
  3. end = 'z'
    , ^6 X  v" k+ J: @  `
  4. nexturl = ''.join(['http://somewebsite.com/', cur])
    / j+ Z+ ]4 g% T: O1 h
  5. while cur!=end and nexturl:
    ! U! @2 g' @9 \1 j& f
  6.     page = getpage(nexturl) # 下载单词页面; @2 K) i4 D3 S" f" X
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接
    % h3 R+ |. r  {8 O
复制代码

% {7 \, W# k# @( Q" f
. F! D0 s3 F, w4 X- ]V. 完全没有任何索引,那就没法子了1 l6 Z% J9 S9 ^6 }6 L0 Y
当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理
" o* E7 E% E( V% d理论上也是可以的,就是效率差一点;
2 g+ i" x2 u' y* r  G3 v  c另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。
$ m3 y" t1 T" i2 {3 y! f; P4 w* G+ j0 t; b& ?2 _, _, z
3、提高下载效率. \, J9 ?- \0 L( ?
I. 多进程
0 N' e) u) n) {上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。( Y' `- ?* t; _: _2 h9 l$ B0 r
实际抓网站时,这么做效率显然是非常低的。
, i( s4 z" a3 D3 B# W) e4 B假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,
' L# q- [+ z8 ~* T有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。" c1 y+ g5 K, m3 P2 U& I: `
假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?
9 h% @# r2 L% M9 v( y2 _要速战速决,就得开多进程。
. g2 [* @: M1 |: Q; Z3 _- K! X( r同样十万个单词,分成25个进程下,也就是28/25=1个多小时。  \5 `3 d. i# e( d+ K# m
再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。
5 P1 |2 o" J- ?% k在Python里开多进程,同样十分简单,
, M  f  j( Y5 u) H6 l5 ?2 m

  1. $ p9 N& k' g1 o; q. M
  2. from multiprocessing import Pool
    7 Y4 b/ ^1 O/ D& \) w) W$ e; E/ {) k
  3. pool = Pool(25) # 开25个进程
    # |1 n; J* K. y- }: I
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数
    ( k( }0 a, t: V
复制代码
, p8 w, ~/ v( S3 C9 O
这就搞定了。: X# e1 M/ ^6 @

8 |4 ]2 ^  L/ E, |- b+ E  l* @% F对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,/ z" S; t% t3 E/ u+ z* {* v
关于IV.,事先没有单词总表,就只好采用区间的概念,' ]8 U; Y  Z, f/ {1 b
比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载
# A6 q7 i: v3 v' `+ s6 \. w+ P* k5 I7 E" m# M: F- J6 `
初学编程的人,一碰到进程、线程,常常有种畏惧感,9 n6 D1 R6 V# w7 t
看到同步锁、共享内存、信号量什么的顿时觉得头大。. V, a( M4 L$ y# Q, y
其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,9 x8 Q4 D6 w1 m/ s+ a
其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。5 f# P1 h% A. M
1 y; S. X4 j) T6 i/ \' T' c' A
II. 断点续传+ \) O5 M, }2 H* d
事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。+ o' }9 J/ ^  f& S
所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;5 D0 o  f2 a) @  W) L% N6 d1 y/ O
即便无法自行恢复,也得容易手工处理,不然可有的烦了。
9 P, o9 s$ D; f) `  i这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,
2 T- e5 P+ e, q) ~# [* w& t直到所有区块下完。
+ J5 b  v, r% F

  1. 4 U. ]2 M7 f# x6 S) h7 F3 l3 W
  2. def fetch_a_word(part, word, url, data): # 下载一个单词
    . K8 o1 B+ h% ~: @  r' O
  3.     word_define, failed = get_a_word_from_website(word, url)2 k. ?& d/ N1 y. Z
  4.     if failed:
    1 c' c. W  S, B/ q* h
  5.         dump_failed_word(part) # 输出下载失败的单词及网址
      W- a) p2 d" d8 [8 A. A
  6.         return False
    " F. v5 D. b0 X6 f% w3 I
  7.     else:
    , P  X" l4 D* D% M5 g# p, @# {8 {
  8.         data.append(word_define) # 保存下载成功的单词数据
    / J& r5 A4 t+ S6 D2 G
  9.         return True
    / W# Z, {! F, P% m7 }# C; k

  10. 2 z& H, b  a% s
  11. def download(part): # 下载一个区块
    - L: K, `4 m. j
  12.     words = getwordlist(part) # 读取单词总表
    9 _& Q) a* R- P6 C3 S  u
  13.     if hasfailed(part):& g& B/ _" e% g1 o5 X8 p$ C/ V
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址! S: R: `2 y- |5 M2 s3 g) f2 i! L0 _$ L
  15.     else:/ V" `$ N/ G  ]% x
  16.         word, url = words[0] # 首次从头下载
    3 q! b+ K7 x: P; R
  17.     data = [] # 用来存放单词定义
    ; f5 y1 Q$ A+ `5 V/ Q
  18.     while not_end(words): # 循环下载
    8 @4 @) `/ T" _* g
  19.         if not fetch_a_word(part, word, url, data):
    % m; A) E+ c& x5 E* P) |% [
  20.             failed = True
      `3 F2 T5 G& q$ s, c: r
  21.             break! X) \4 h# B* \2 p2 ^2 R+ [
  22.         else:, ^% @# c) D" n9 y! \5 g6 f
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址. M5 R0 e# C9 `3 y4 ^1 R- f
  24.     if failed:
    7 `, N+ {1 L4 w- ^
  25.         suffix = '.part'
    + V4 \9 `3 \8 i2 F0 Y
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'
    . R9 P: ?; u3 \; J( ^

  27. 7 t- [5 D2 f8 S7 W7 j) K
  28. def isfinished(part) : # 判断某区块是否下载完成
    . K' q. M0 s( M6 f5 k  T' c* \4 _
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断, p0 o* J7 d6 G6 o. p# t0 p
  30.         return True
    & Y, G4 O9 Z& c# Y
  31.     else:3 t. E' `$ t5 F+ P8 X
  32.         return False
    ) y! v4 |$ U) O& h& n
  33. 2 f6 [5 H1 T6 O
  34. def downloadloop(): # 循环检测未下完的区块
    8 B) i! e0 u( ^0 y5 {/ S- W
  35.     finished = 06 j. n& ~1 C" L% E3 E( y' c
  36.     while not finished:
    / ?$ J/ P7 O$ z; ?9 ~' X
  37.         nf = [] # 没下完的区块5 L) t) n+ `# E6 Y. k* {) ^; y
  38.         for part in parts:
    ; c/ h$ S7 {$ j# c. G: B
  39.             if not isfinished(part):
    : k! Z, }8 H- ^9 V* E- ~, Z! k
  40.                 nf.append(part)9 g; f* g+ N  N# t7 B9 R
  41.         finished = not nf
    4 h  B8 h6 f, @2 ^7 u% `2 _5 f
  42.         for part in nf:5 i% [1 {1 [+ U' o7 i0 G
  43.             download(part)
    3 Z" g; v/ E* [- o) ?2 w3 A
复制代码

) B7 a( k( O/ M( n1 f. n2 E7 Z- j4 N0 J' W. f5 M! F4 h( U
III. 高速下载网页的小技巧  H. F: L' u5 h* s% F  T
Python里面有三个库都可以用来下载网页:urllib2、urllib3和requests。
0 a6 M8 h. v2 _# l1 ^- O其中urllib2是Python原生的,urllib3和requests为第三方库。
& s2 ?7 I' S; I7 k: X* Q(似乎Python3已经把urllib3收编为正规军了)
1 H& M' R+ e. D0 W7 C& k这三个库有什么区别呢?, f4 w: D6 L$ m% h* `/ d# p
形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。# {3 \) |: M/ l
再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,/ _& K' i6 ^: p! P" u$ z9 D$ s
所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。
  _! x" F( j) Y但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。
1 Q3 l- @  V5 ?! [: ]: Q/ K: Q3 L这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,, v; N5 A# w! L
通吃一切网站。0 \" _  T" e& n* v+ m" D1 G
所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。
- e, C- r; J: J这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:
8 |2 ^8 c5 h( y4 Z0 M- B9 khttp://urllib3.readthedocs.org/en/latest/( z; K! G% \* D8 B. U$ |
http://docs.python-requests.org/en/latest/; l' s( f& M/ W4 ^6 |2 e# j1 i

  1. ) O) A: I' J: f- o4 ]* ?; e6 {# M
  2. #urllib2
    % V2 \" B) o; d  m) j- H8 }7 V
  3. import urllib2
    9 b, G$ v! C% ]2 j2 g  B5 `
  4. def getpage(url):
    7 ]* ?: ^. }6 i* ^
  5.     req = urllib2.Request(url)
    3 f! K6 a9 U  G0 Z# b' |
  6.     response = urllib2.urlopen(req)
    1 Y# K9 |' M/ C& X/ H* |. S( M
  7.     page = response.read()
    6 ?" s# }; J& v% u( i
  8. ; }8 g. o3 ?9 b1 w5 l. d( R& n
  9. #urllib3
    - [. y- a7 @0 T+ i& L3 g$ p: k
  10. from urllib3 import PoolManager
    + p2 y6 `$ N$ R1 U/ S
  11. http = PoolManager()& M; p8 _+ T- D1 X$ v
  12. def getpage(http, url):8 s) ^" u$ W9 k! E2 F  Q2 g
  13.     r = http.request('GET', url)
    6 C: c  b3 C7 S7 ^
  14.     if r.status == 200:
    $ r$ l2 k( \( d% I4 D4 M
  15.         return r.data; Y- Z8 g% B0 ]6 A8 a) f/ i0 e5 l
  16.     else:' z) l% Z- V5 O* i. W) y  C4 \
  17.         return None
    # f! o. Q* y) }/ `7 c- N
  18.   u% Z  A# e7 o5 N. l# I* Z3 y2 [
  19. #requests
    % v9 B) }) U/ U  s7 P0 ~
  20. import requests
    $ L( u4 b% H. M6 o* K
  21. session = requests.Session()
    ; z' Z2 f, N0 \# Q$ d" c
  22. def getpage(session, url):
    : q2 u8 t1 Q( N- x5 [) {0 _
  23.     r = session.get(url, timeout=10)
    : l# o4 i" L/ ?9 y. S
  24.     if r.status == 200:
    2 B! v/ c5 x  ~# D
  25.         return r.content  L. Q" j( h. ^! W
  26.     else:: I  O! U" M- P: U. e" [
  27.         return None/ ^1 p$ p! |0 ?5 G
复制代码
1 F% ]5 ]* ~1 N7 Q
四、后期制作
3 W# j- l# A( }5 a& t! L6 X1、文本处理,是个特征识别问题。
- {# J) T/ u8 |8 O( L; X& M本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。
4 i0 j! Z9 \! s当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)5 j, I( b: o( R) C2 b! N* c' p
都涉及到特征识别问题。' c$ G( b& x4 u5 e
相比这些高难度动作,文本处理算是比较简单、基础。4 f/ \0 O: _( t( e, Q
Python里常用的文本处理技术:正则表达式、BeatifulSoup、lxml
! }* ^0 n  E8 T6 f! D正则表达式非常强大,但没法处理递归嵌套的标签型数据
% n2 Y& p+ w$ [(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);
* X# O. L, w4 n. l6 A0 y- c7 tBeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。) z# V, v0 U/ c* w, D. E- a. `: }7 s- J
所以常常要结合使用。
% [: @! I- W: [" e8 u" U  G这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。
* b3 w2 w3 [' r8 X  r$ Z3 ?5 E$ d4 C: i+ m% c
2、排版
, ]* v9 }9 G, u( w" VHTML、CSS的基础知识:
3 \# }! T5 Y- k5 r) M4 }http://www.w3school.com.cn/html/index.asp& z! T2 J, U' w3 K1 d& ~% J% ]
http://www.w3school.com.cn/css/index.asp
) n# l& H% T' v0 a% zhttp://www.w3school.com.cn/css3/index.asp
8 v! C' _$ V$ d( t非常系统、非常全面。
1 X; W+ `. D' W* {% k排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。
# b4 D2 O& E2 A) `
* m! e. {- y5 x/ v7 h. x& K五、结语+ ^' {0 T0 B0 [& f6 m+ m% s
花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。$ x; \; L9 a: J9 z  w# w/ H. E4 J
所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——
. ^: m! u- G3 |% F% x大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。
9 l2 x: s4 `& E2 G5 |+ m& n
/ g  q7 r+ N$ b2 Y. g) `% F打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。6 u# l7 q! P, E  {; I

/ j" [6 O4 V* g/ a只是拜托不要打扰别人,真想要就自己动手。
8 }+ d5 ]* n: m5 {* L  f尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。
( E, `% I5 x0 E% W1 S6 t8 Y水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。
! g5 O" a. K6 h: d7 u9 a虽然每个人都觉得自己至高无上,应当受到别人重视,: R/ t8 f) w! \
其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰
& q, O0 L8 H" n& a9 h- \% |& X  m) G$ n# O2 T+ V

& w: L: u5 P( f/ J- `  C========
3 Q+ p7 A2 s, s0 r8 C六、拾遗6 s0 v/ ?0 c0 g2 {! T* D7 ~. }1 D5 N
关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类
: H+ g! p+ ~7 t6 c& w确实如此# d( N' w  u7 V0 F9 N
不过这里只是举例而已,不用太较真啦 6 G! R- o7 k" Q' Z% P2 f+ I: s
实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏# w2 g6 f! G; H& a
这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。
7 O6 b, U& U/ W即,
! ?. z1 _8 q  e第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)
, c4 Z7 d! B1 J9 V+ n3 ^; i2 z: t第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)& n( s8 l% @% Y: v$ W6 B
第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作/ i* n. x' g7 r, K
。。。: `$ A+ ^/ m3 ?7 i5 h$ b
直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空)
. ?7 _* ^: w$ ^+ S: _! j最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。" F0 o* Z. N+ j4 y
形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。
6 c. X4 X# K1 o1 n因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。
- [$ o3 N. R' @( h5 r

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:41( k( x3 F1 r; u  v4 M3 Q
感谢楼主分享知识和经验。) B! s( m/ t& t, s- Y* }" X- o2 g4 F
& ~1 X9 N. W! A
每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...
( ~; {6 r& e: i3 W" v! h
现有的mdx词典,其实足够绝大多数人用一辈子的了3 T8 c/ @1 L/ J6 `) A$ U8 u
* m' e* t7 d" }2 U
本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。2 V2 A7 A& W& Y8 f8 K
0 o4 ]/ j$ A3 _# b% f3 T3 a% O
本人最常用的词典:
4 M5 Q/ t8 S' r" @& n: B3 z/ X* @主力阵容:VOC、ODE、WBD。
& Q4 T  @; x7 N( t' u三本都是中型词典,收词量均在14w上下,以本人目前的阅读面来看,还未遇到这三本里面查不到的单词、未收录的义项。据说史上掌握单词量最大的人是政治家兼散文家丘吉尔,也没超过14w。除非钻故纸堆,恐怕用到W3、SOED的机会不多。, y: O( W" j4 T; e& T

9 ^- U+ d$ a; s: J4 c0 k3 ?替补阵容:LDOCE、词源、短语8in1、韦小黄&韦小绿、Garner Usage。  H" w; d- K; ~6 U. c9 z
LDOCE用来查常用词的惯用法/搭配、语法信息;
3 q# r- B. [5 t8 [$ z2 A( d4 U词源用来辅助理解、记忆单词;0 |3 E6 H% s8 H
短语8in1用来查漏网的惯用搭配、非正规用法;
9 d0 b; I. x8 c1 G3 c% c韦小黄/Garner Usage用来辨析/比较同义反义、正误用法;
# r5 D  K5 R+ Q: B6 l韦小绿用来辅助理解、记忆大词。小绿真是本好词典,有人说里面收的单词都是一辈子才能见一次的那种,其实不然。它虽然只收了1400多词,却几乎都是高频的大词。从本人的使用体验看,查得率相当高。比如最近看新闻说一种超大蜘蛛,里面有个词arachnid。别的词典只是干巴巴地说4对脚的生物之类的,只有韦小绿说了它的来源:从前有个女孩叫Arachne,编织技艺了得,把雅典娜女神给比下去了,结果激怒了女神,被她变成蜘蛛,终身织网。这种解释多有意思,看了永远忘不了。: R4 k4 _4 d5 ]  k+ i6 L, G  a& f

5 p  |: q4 g: V0 x上述词典,坛子里都有,无非是版本新一点旧一点。比如朗文5和朗文6,有人统计95%以上的内容都是一样的。如果是完美性格,非要用最新版,那就只有自己动手。不会有人在词典出版的第一年就去挑战版权方的。6 r8 J8 z. p7 m5 T9 r
“对于好学生,任何教育资源都应该是免费的”。虽然本人同意这种说法,也认为现行的版权制度存在重大问题——有人靠垄断知识获利,却完全合法;但是本人从未打算挑衅版权方,更未想过做Aaron Swartz那样的斗士。靠垄断知识获利是有点无耻,但如果没有利润,也就不会有人去做整理资料的事,这确实是个难题。
8 c/ A0 [, P- }/ w$ A
( g* |+ U* s7 n9 I还有些人没事喜欢收藏词典,收集了一大堆,却从来不用。说到词典收藏癖,想起以前的一位室友,那家伙每天最大的兴趣就是下载影片刻光盘,大概刻了几百张,还在不停地刻。但是从没见他看过,他也不让别人看。
# r* B& M$ b' a这种癖好大概是来自于原始社会的一种遗传,人们总觉得应该储备点东西,说不定未来某一天就会用到。其实那一天说不定永远也不会到来,不如就把今天当作那一天好了。有多少人买了一书柜的书,到死的那一天都没看完,甚至有些书连封皮都没揭开过。5 S6 Q5 }6 M# _$ s" k' \  w

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。
, ~+ z2 j/ c/ [) _其实只是你没有发现而已。  g! N! G" X$ _, n7 J
ODE: http://www.oxforddictionaries.com/browse/english/2 R: `7 t* r: v+ O( G
RHD:http://dictionary.reference.com/list/a/+ P6 Z5 y" V8 l9 p$ T% n, O6 Y
CALD:http://dictionary.cambridge.org/browse/learner-english/
4 f4 }/ g+ p* c6 {/ S
1 ?4 B0 A4 g: F8 i! I( S# D如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。. S+ J; B- ^9 B0 t8 ?7 n
以第二个为例:
% c& P; L9 v. o; ninurl:browse | inurl:list site:dictionary.reference.com- f* I' G' O% Z9 v5 y
: ~( v; a" s0 W" s$ v+ S' k
PS:最近才发现这里,发现资料很多啊。1 P. a. e) B& T& J# m( L1 u+ r

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧
! v4 ]. d0 \8 m; R4 X
% R9 f: }# Z' c; z, ~; w* z假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改) k) c  w' `3 C/ K: \9 r: A3 U* N
或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下6 K4 {, g- A0 u/ H/ e
结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。3 W. K' ?5 c1 s6 Y$ z! V8 c% G) h
这里有个比较省时省力的小技巧,可以快速定位到想找的地方
% q+ ?5 c, p6 y8 `4 e
7 F$ M4 f8 ~+ a( H2 l# U3 J1、Goldendict里,在想修改的地方点右键,有个“审查元素”:
/ v6 e, q3 |" s) X, \& i0 m0 e. V: [/ e0 ^. T, h6 d

, S9 }( }. M5 P$ ^& a9 E2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事7 V2 d, K( e5 E; \

5 Q+ j. l, o5 h6 d9 O1 a" @$ Z* U: A
3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方
+ X+ A8 q* R0 q3 G' K3 L6 s6 U- r- V9 p! K
6 z& |) ^) T$ o! w% q
收工

该用户从未签到

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

" P6 f$ @2 z+ }( A1 m8 ?7 B% c! z+ B1 W6 T; a) T- i; p
8 d  d  x4 J" [

! z2 [5 M- F6 Z6 Y- J感谢楼主分享知识和经验。
, c5 K4 v  \3 i! g0 v2 Y( h
; d/ h' ~0 \$ |+ p每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。3 m0 f0 n+ z, f( w3 v# M

! v& l. s& i2 y私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。
+ [& R2 T: R4 |* ^" U* u3 ?- [: Z+ _4 L6 q0 P
但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。
' [! }; Z: m! q3 ?) ]+ B; R" H+ V$ q3 a* U, P$ z7 w% a$ k! {& X
除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。
; H1 H4 W" c4 B/ z. Q3 @$ F  n
/ x7 r  t+ m/ K, A' Q4 g
7 {+ |, F  Q# y& [4 R$ ~5 t
: ]7 f( w3 v4 ~6 D4 E, ~8 X  H4 P; c

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件1 S3 x* }+ a# C  R- Y  H% J) Z4 u
  • EmEditor
  • Beyond compare
    / s+ a1 `: F) O4 A
' U, [2 S- n( t# w$ W2 c$ e3 r
, X4 ~" c. b+ Z4 Q0 s/ F/ M
前者用于编辑,后者用于差分比较
: T' u# |, f' h2 v$ y" p处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

发表于 2016-6-8 07:41:03 | 显示全部楼层
bt4baidu 发表于 2014-10-25 21:017 U, d7 r4 ~8 d
现有的mdx词典,其实足够绝大多数人用一辈子的了- A- u0 N/ T! P

' u9 v* E: \* W" x本人前段时间制作、收集了不少,经过一段时间的比较 ...
0 A1 g' l1 ^6 U8 o( p8 Y
肺腑之言。

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考5 A% r/ H% n$ Y; I; z

, z; ]5 a! s4 m/ j7 U网页设计中最常用的字体有哪些?(中文和英文)! ^6 p) p2 J" h& Q4 h4 {2 _
http://www.zhihu.com/question/19680724
: F! U/ ~& z' G# n2 k7 u
8 J6 s6 Q7 I/ b; R" |; y, x. ^本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode# N! W) Z3 P$ p: S% l) k
这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全
+ U9 m0 H' z8 e, K另外Open Sans字体也挺漂亮
- M3 O( R, g, j! d
  • 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 N% n/ `1 g8 F: K2 U- `最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...
    6 m! E- f" m$ [2 B* p! l
    感觉找到适合自己的问题好少啊, J& \+ y" ]3 F. N
    这个适合的话感觉是兴趣和难度( n; ?2 ^$ ]0 k! n4 ?1 p) W
    想请教一下楼主是怎么处理这些问题的呢: b- i# l" C% S  j# u6 h# U% |
    还有种不系统的感觉
  • 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 编辑 0 j' r3 e  y+ V4 H) S( I
    1 `/ u, v$ q9 m3 Q. t2 W1 w
    写得很好。刚看前几行的时候,的确激动了一下子。虽然没怎么懂,但是第一次能坚持把这样的东西看完,觉得也是对自我的一次超越。谢谢!

    该用户从未签到

    发表于 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 编辑
    3 ?3 w: J  X( A3 H3 l8 C
    7 Y' c. l- D% s: qjava和.net就是个垃圾,我懒得提而已: p" `# ~7 \- \$ t$ i
    在Linus这样的大神眼里,连C++都是垃圾:% a0 p7 m. C3 X. k1 c8 w, k, Y' w0 C
    http://www.csdn.net/article/a/2010-06-12/2187854 \! s- b0 b8 R0 k

    4 P5 j5 e& M, h; |/ B6 d如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。
    # Q" `/ j% x' h! |, O, o$ z* V& N" R" D/ |+ g* G
    不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。  z% r+ W2 u+ d, o# E4 M) |
    我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。$ H2 m6 F0 K9 D
    这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。0 L" M9 U2 i( `! q
    不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。' l; D6 B3 {; O! D1 I
    为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?
    8 I# d* m3 j8 K7 G7 o0 c6 Y' ^% M, |因为垃圾代码太多了。
    9 n# J6 N$ s  L1 e8 @( h9 o( x
    2 u& L, H+ F/ t# u5 K% I
    " @2 m; Q6 E: H- A6 K

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑 ( P( [: w/ c1 }+ o6 ~4 J  C

    7 ^$ P1 a) X! q* R; S: ~6 Q7 P
    + C/ r& z+ e$ ]% w6 K算了,道不同不相为交流
    / A5 a: i/ m# f想起某个梗; u* u, e, b* m. Q, H( Q
    程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!
    ) ~8 V' q( e5 {' z- D1 {9 p' P/ w. [
    5 L; V) ~' q$ B% |) L自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。6 j- T8 ^" h( ^
    9 x" c4 ]; S: o3 B' x4 n/ a
    另外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
    ' c: Q# y* p5 u6 g算了,道不同不相为交流+ K* F. |/ I8 t2 u4 b8 @$ n/ K
    想起某个梗( x) g0 N6 |2 L4 r- W  K
    程序员眼中的编程语言

    ( M9 @6 ^. s; I" l! s不同的语言适用于不同的人群:
    9 i0 `; Z# L8 G* D0 @如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。& h8 K/ _' G* A. {+ e  S; p
    如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。7 c  d' A& \4 K
    至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。
      Q0 h/ \' V* _
    * ]; U+ s5 R/ f) I& I编程语言的口水仗永远也打不完,不争了1 F  W: _8 d+ u  m& B

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:35+ R7 `8 S/ R1 X& D+ h% l# e: b; t
    不赞成多线程抓网站,但是好贴子要支持!
    " I0 \" R7 [+ c/ ]
    ; j5 {9 }# W; P自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...

    6 h5 Q) ?( @& ^# @: G% r下载软件?推荐一款?
    0 |$ z, n0 y- T最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    8 ?( D/ U! o& D现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?- t  S9 l4 |2 P  c/ p
    比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。
    5 J! N! o5 K! W0 D除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。
    . p- I. @$ u  @- B+ `* R$ t目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。
    & u  [% {! `' Z' t* o
    2 t+ Z4 H0 d2 W& \5 c4 L6 q# A' a至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。
    ! k9 K( P  v. P* k% z1 z+ S对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,
    " [$ Z# v3 v  T6 V( R3 D' T目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。
    1 w' X/ |1 K. c8 l+ T3 a

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:
    . `, x4 k( s+ v随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。
    " {% X# b5 D/ u5 H) A! g; ?未来会出现一个新的行业:私人计算机管家。9 w5 G9 U) j+ {/ S# _! X3 b
    专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。+ v% h/ |+ j! Q) k- I5 ^
    但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:29, G8 g/ v" h+ F! |% W" o: V
    下载软件?推荐一款?+ E& J) G. X4 \2 f! {
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    6 V. i; ?9 r' w2 f% m现在99.999% ...
    2 [. R/ r- p- ^* ]' p2 b& W9 ?
    用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
    ; {% Y, `! N" ?+ n9 c# e- j( W
    8 g/ X) D* E' `& M7 E3 Z# O十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。. z! @8 }0 l/ x* b1 @3 k
    ) M- l0 ?& O% H7 W8 V( o# {4 N9 j3 W
    用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。
    " l% d$ U2 \" h1 y: P! S5 z% B
    2 b- w) J$ {( C  n/ h& m! u我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
    大熊部落 发表于 2014-10-21 16:18
    % `/ b& b9 D/ p3 B7 ~2 U用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...
    ( e+ _6 Y! V" [9 t2 B- u) F
    我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件8 h) ], [9 D; Q& x
    4 T5 W; q  O3 W/ V- d: [* \
    下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
    + A" `4 l6 [( V3 l
    推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

    该用户从未签到

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

    9 @: x9 B! C9 R  ]! `5 m2 [* g: y' a2 C
    最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差: i3 F! j4 b$ t' f3 ~- [
    计算机是用会的,不是学会的;
    0 P: f1 j5 z% i8 s  i程序是调试出来的,不是写出来的
    / I2 ]6 R! i& E, Y. x0 K5 t9 A2 z
    既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。, M8 D3 S* P+ M( L2 L
    你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

    该用户从未签到

    发表于 2014-10-22 21:25:59 | 显示全部楼层
    bt4baidu 发表于 2014-10-22 20:21
    + O5 J9 H2 ^, ]: E最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...

    ! w- q& k0 F- }4 ?多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。; d6 z7 U9 h: I# w$ C1 v% M
    - ]5 O; q, L8 [  N; d* F4 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-5-4 12:28 , Processed in 0.091343 second(s), 12 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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