掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 50876|回复: 148

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

    [复制链接]

该用户从未签到

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

, }9 ]6 ^. U' P2 K9 d/ E, {这篇文章主要是给计算机小白和初学者扫盲。
0 F. ~1 W* O5 R: ^) C* S5 G( X  b" l本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。& \! n7 o. z5 I$ Y$ S1 Y, r. o4 @) D
只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。8 S  S+ j* h( k8 n$ K/ |' F3 X
1 F; D; Y4 q# V3 T& k  [$ M6 `+ t5 h
一、计算机的两个终极哲学问题
( S! _$ \0 ?) m3 Z7 [1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。1 q! a# ~2 t; R& ~+ g
图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:% |, P) N3 `, x: n* {4 ]
设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;( ~; K; U$ q. F, E8 x
机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。+ S8 H4 U8 D2 ?2 T% \$ S2 f  T
方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。
- j9 w) I7 v2 P' S. \, @“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。  @( ]$ E' \) t# i3 [& S

; L/ g$ w/ ~" m( G3 f  y% D! K那么要写出程序,立即就会发现不得不解决两个问题:6 g- \, y8 l/ X2 o/ _/ x; R4 U
1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址1 ]9 ^0 A% t$ i- w. f8 V
2、怎么把两种方格区分开?也就是特征识别7 k; Y! P; f! [0 N  g8 h
这两个问题,就是计算机的终极哲学问题。# `2 E4 X( L8 K+ l; ^
理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。5 u, y$ }( z' m( w/ ]
下面的讲解也会以这两个问题为核心展开。
" C3 i5 e& U0 z8 w, T' ^
3 a. U: X9 ~4 i  z: ~BTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,) M) I0 c* y: g/ P' C
——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。3 E* @" b) o7 e4 s$ q8 V" H/ c
所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。
* B5 p( E7 T  e前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,
; @' m$ F8 I4 W4 o+ _8 ]而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。
2 {: Y, J0 k! U& }. M+ L具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。
  [2 I) ~* M8 Y3 e4 w/ r  Z+ R. k! D6 l. S- i. T: I
不要觉得自己上学时学的不是这个,or文科生,就不行。& ^0 q7 @! n0 }! i# C4 |
江民杀毒软件大家想必都听说过。
, `7 ~+ J4 B: H6 F# ^9 U7 n% P创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。8 F/ d. j1 O' J7 W; J
咱不奢望成为专家,写写程序总还是可以的吧?
( u9 q  E+ j! ~  Q* C% s9 h- @% Z5 i8 F5 d
二、采用何种编程语言
+ Q& X% h, D3 t5 g上面已经说过,存放、读取、组织、区分数据是编程的核心问题。1 s, K5 i7 ^' x7 M% q, s
显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。
2 L2 U! }, F+ C8 @7 Z  Q抓网站,恐怕没有哪种语言比Python更方便。; B- S+ K* N) f, @3 p  a- Y# s
当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,; V4 j' i1 W( R$ B& W$ J
计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,
, z2 S3 L5 y. a: M9 l) N1 \没有慧根就别吃这碗饭。  y: {2 k8 t0 b

7 [1 n% _( l, X/ s; c2 k三、网站抓取技术, }: K3 e2 |3 X( C- b" L; B  H6 R
1、下载某一个网页,提取其内容
9 h' y  k7 W, a) e' S* U; q' L8 m以前写过一篇,就不重复了。参考:" h1 v3 @9 Q0 A* P, Y
用一个简单的例子讲讲怎样从网站上扒数据
% c; m5 L4 {) e0 d; d$ B) `" F9 R
2、寻址问题
0 E9 s: a9 ~3 _7 f/ G8 h/ p; L下载网页,自然首先要知道网址,也就是东西放在哪儿。
# m# w$ K! M+ }3 ^' d( L" i' _如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。
+ S' |, w4 f$ a# ?/ y但是大部分在线词典,到底收了多少单词,事先是完全不知道的,
; ^% H% b' m3 d) j: ~: E- L5 o要把单词弄全,就要想办法得到每个单词的网址。
7 @1 l% [) m" b: W" g* {总结各主流词典网站,大概可以分为这么几类:9 [! g6 [/ d* K6 Z; A, o
I. 事先有单词总表
  [# W  t% w2 {( n8 v6 P$ M1 Y) y% V比如http://www.vocabulary.com就是这种类型。9 I- R" b( k9 X$ [
它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。
1 a+ w2 b7 v/ l1 s. o8 P
0 g& U+ T6 U' bII. 网站有索引页面& C& E* M" V3 W) }0 Q
如:! C1 e* g- h5 |7 M9 q
OALD(http://www.oxfordlearnersdictionaries.com/
* H# a8 G# A& d: x它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/
0 {  k  T. K' a, }! b1 CLDOCE(http://global.longmandictionaries.com/2 Y- Z/ j+ |' [- u
采用框架结构,左侧边栏就是索引页7 q; M* E5 C$ C% @# F
MWC(http://www.merriam-webster.com' B5 Z. V! r( O5 P- Q
索引页在 http://www.merriam-webster.com/browse/dictionary/
, c. Q, O, M: a( s2 f/ E等等
+ h( L: a  [+ c  U这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。% ]! w5 p8 J3 ~* s. U% p
  1. ) O. ?+ \8 o$ A7 ?
  2. urls = []
    ( G" r) C! P* p
  3. for someindex in indexs: # 循环所有索引页2 D" [3 H5 G' k+ N& o# H% ~% C* J; m
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    7 p$ i+ ?. W" t0 [! n
  5.     browsepage = getpage(browseurl) # 下载索引页面
    & h2 D7 A( e3 i9 m+ c, p- s
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域: S$ z! z& r  Q
  7.     bs = BeautifulSoup(browsepage, parse_only=target)
    - s& Q) [" o) p
  8.     if bs:4 j+ V/ X- P. ]  k% [1 M
  9.         for a in bs.find_all('a'):8 }1 _: b/ l9 r; Z. Q5 c
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接
    ' z. h  Y0 i7 ~
  11. 然后:
    6 `4 z5 {3 {) u1 m
  12. for url in urls: # 循环所有单词
    , h& R0 s+ K1 C+ B- ~! z2 O
  13.     wordpage = getpage(url) # 下载单词页面0 [3 U1 I9 t# H- k* E. S2 {* y  w
复制代码

  j, z, ~/ U' Z( J! T+ F' K4 r1 D% z% Y3 \8 d& j. W
III. 索引页和单词释义一体型网站
8 y% i# M4 p* R- `" O如:Online Etymology(http://www.etymonline.com/' {1 d6 _3 U) r. W
和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可1 t# s* b; j; R9 c6 O
  1. $ F; i, }' F- W  w7 a6 d0 F
  2. for someindex in indexs: # 循环所有索引页
    6 d- s/ v3 L/ T9 s; m
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex])4 a6 H3 E4 V* L) m5 R+ c- p1 Y
  4.     page = getpage(browseurl) # 下载页面* M& m7 F, P: J2 x
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域
    & |' ~$ ]7 C, l: S
  6.     bs = BeautifulSoup(page, parse_only=target)0 \2 p% G! U% X/ y6 x
  7.     for tag in bs.find_all(target): # 循环抠出单词, v' a( K9 Z( S  _/ F' x( f
  8.         worddefine = getworddefine(tag)
    % {. h& L& x/ m! v9 a
复制代码
* Z' ?5 D% a- C- g3 H

/ Q, \1 z! C  f( O. P$ kIV. 片断索引型网站
& ~/ ^$ i: v+ B" j如:
5 i- f/ |0 F( P: n2 U' v" eODE(http://www.oxforddictionaries.com/# A6 W$ R) m3 i/ N; q1 _; S' l
每查一个单词,右侧边栏有个Nearby words0 M; k4 z* ]( R3 J
RHD(http://dictionary.reference.com/
% s  T. Q# Y  k. H2 f( ^0 R/ z" _7 t右侧边栏有Nearby words
* w) G* U1 y- @! ]) yCALD(http://dictionary.cambridge.org/
7 d) G0 I( M4 l, A8 @在页面的最下面有个Browse栏,给出前后相邻的单词# l" ^0 l0 `: n: G$ l+ c
这类网站没有总索引,只好利用它的Nearby栏。
/ B3 d; M* w; g4 w+ P& E: y思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,
9 N/ N0 L( H+ W! Z: ?* b每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)1 I% a+ b2 Z4 a" V* ^
  1. 5 U/ m8 f0 S& |0 N$ O0 L
  2. cur = 'a'% e9 E  H0 h5 c- `2 o
  3. end = 'z'
    / }1 u* ]8 j6 L8 q6 S
  4. nexturl = ''.join(['http://somewebsite.com/', cur])! G) K1 p$ E, M$ ]
  5. while cur!=end and nexturl:. e' h% @; P1 t) s, K7 i
  6.     page = getpage(nexturl) # 下载单词页面5 z) W1 C' p8 D2 x( c9 |
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接. H: x/ A- |# C& Z
复制代码
6 d8 K/ i" k7 c. M$ ?$ g" O
7 ^! g) o, I$ U' o' Y7 `1 h6 D5 l
V. 完全没有任何索引,那就没法子了( }8 L6 _/ k/ n7 U
当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理
' H+ S* t7 J* V$ c! u4 \+ e& x理论上也是可以的,就是效率差一点;
/ P7 Q2 y3 i# ]5 K另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。8 L1 t( J, N! K# ~1 A5 o1 D" t
$ y& M7 }7 b- u. B  S
3、提高下载效率" e5 m; g0 A7 X. z2 J* N: h9 h
I. 多进程
3 L8 D7 W) r; z# o上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。: a; c" }9 p' e6 k1 Q- ?0 l! s* r
实际抓网站时,这么做效率显然是非常低的。( |# V3 d; a: n
假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,& q* d1 x# z/ E
有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。) X5 O% ~: [' n
假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?0 C- O6 `- `5 I1 m. r
要速战速决,就得开多进程。# G6 O* [2 |8 A. R( h+ [& E
同样十万个单词,分成25个进程下,也就是28/25=1个多小时。
4 y" t- f$ m0 a- e5 X5 ^% r, Z, i% ~再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。
4 N3 [! ?2 i, p7 o! d在Python里开多进程,同样十分简单,+ t7 G8 M" G0 q1 ]7 ^/ p+ [& A

  1. . y! N/ [: m% G5 x/ U
  2. from multiprocessing import Pool
    - J7 W2 Q( g1 B& m! O) |' ^
  3. pool = Pool(25) # 开25个进程* S! P3 M: K' d& e3 @! ]
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数
    / `7 p( n% ?+ {2 O7 W7 U
复制代码
, {3 K, `6 h. d: f4 c' d
这就搞定了。
& c- r$ N) K% e# @" j2 {# S/ v' P2 ^8 R
对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,
  G' S+ z6 S; ]" w( j: @, c关于IV.,事先没有单词总表,就只好采用区间的概念," L2 L6 O7 A* p5 m! j* ~
比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载& L" u- I+ k4 G+ E: A

; R8 g# G$ M! ]! n初学编程的人,一碰到进程、线程,常常有种畏惧感,
/ t8 c; I. V1 n' I1 w看到同步锁、共享内存、信号量什么的顿时觉得头大。' r6 z2 X- N  |; g
其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,
# b+ W! o, C) `* o其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。
4 Z% T$ E: D" x+ O- _: N( D: M) R' Z( E0 ^3 w) o
II. 断点续传
2 |( S' e+ `0 K: b4 o1 v. ~事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。
4 e% Y- E; H5 l- d所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;
, b* D. J/ h+ o即便无法自行恢复,也得容易手工处理,不然可有的烦了。' I, V1 T8 U% V8 _, F* u8 Y
这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,5 L; @# k5 B( j1 q8 S0 F: _% a
直到所有区块下完。0 w  p% H4 q$ V. w/ W
  1. 3 A7 s, m7 n3 u
  2. def fetch_a_word(part, word, url, data): # 下载一个单词
      t) F1 V  l9 r
  3.     word_define, failed = get_a_word_from_website(word, url)
    * @) i& p7 C; E
  4.     if failed:
    0 \* }( B* h" Q5 t
  5.         dump_failed_word(part) # 输出下载失败的单词及网址1 p  f# f# i7 z! J0 i
  6.         return False) Y$ ?. ^# x/ ~
  7.     else:# K) f! b9 n+ _' A4 }1 D
  8.         data.append(word_define) # 保存下载成功的单词数据
    - ^* C! s! z8 t! m
  9.         return True! M5 v; m: x) n$ {/ G
  10. : ~6 F2 x' `5 }! P, f% t' M7 D
  11. def download(part): # 下载一个区块  C7 t% o' Z) v% x8 H: g$ @
  12.     words = getwordlist(part) # 读取单词总表" X) s0 Z, H+ m6 h; s" J6 @
  13.     if hasfailed(part):
    : W- C+ t/ W2 {$ L! I9 |$ ~3 v
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址
    / ]9 n8 E" A& `7 \! \& q7 p
  15.     else:
    0 b$ X$ c3 U/ v# }( @' `! d# i/ {
  16.         word, url = words[0] # 首次从头下载
      M; P) w$ x6 s# ?
  17.     data = [] # 用来存放单词定义
    / O* h6 |/ N8 P# W+ c
  18.     while not_end(words): # 循环下载
    - f4 o$ i2 k% w  m% N4 Z
  19.         if not fetch_a_word(part, word, url, data):1 k( w: V8 L. T
  20.             failed = True
    + q5 b' A3 C- l: i1 H
  21.             break) J/ t( J5 z/ r& c+ P# S/ E
  22.         else:
    : a; B; c! w  N; F+ b' S
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址+ S8 t% p; C( t" O
  24.     if failed:
    - v3 i2 h6 R3 e5 Q
  25.         suffix = '.part'6 z, `- _5 {) V' j2 U  p8 O
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'
    7 a9 W3 X/ W! `7 A/ q
  27.   a8 N1 P$ B# @' a( T1 [+ K
  28. def isfinished(part) : # 判断某区块是否下载完成
    / r1 C6 h1 y4 D$ s" D
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断
    9 Z3 e* R8 C9 R. D3 V
  30.         return True
    ; _( [% x, [+ l6 p! j% C& c: j
  31.     else:
    . R3 S$ h. ^$ J2 T( P* \
  32.         return False; F' ]6 p% {+ a- v' O

  33. ; P0 h' P0 `" }& [2 m
  34. def downloadloop(): # 循环检测未下完的区块# y/ P. w' |* D
  35.     finished = 03 D9 v- y; s0 t# n3 h
  36.     while not finished:
    5 k5 b3 f3 E/ F% K( E+ M5 M7 o
  37.         nf = [] # 没下完的区块
    , O+ A* d1 G/ [; Y
  38.         for part in parts:  |& l. X# W7 U6 q1 p" D8 Y, y  Y
  39.             if not isfinished(part):
    & m  W* t0 x- x  F% r
  40.                 nf.append(part)
    " ?: l# |. g7 V6 e
  41.         finished = not nf
    : t# w, k" ~) _5 u- n
  42.         for part in nf:
    ( g3 l1 ]& g9 R/ U1 s
  43.             download(part)  X: ]" P! w$ V
复制代码

+ ]* i% s1 |, ~. }+ b' [; \( h
III. 高速下载网页的小技巧( P$ N% v% l2 D* v( e& r  z/ p" X
Python里面有三个库都可以用来下载网页:urllib2、urllib3和requests。7 ?3 f; z  m% o2 U* }0 }* \* O
其中urllib2是Python原生的,urllib3和requests为第三方库。- j5 Z0 H' Z) V
(似乎Python3已经把urllib3收编为正规军了)' q. J2 T; v& I- |& x# Z: p; H
这三个库有什么区别呢?
( Q8 A% g# P3 Y( T/ S( \形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。  A4 I' C% \% \' z% F4 _
再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,
3 y# M) O: [: j6 ~* _& x& y所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。
2 t$ d. `9 U& J' q  H% R* K但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。1 m% V2 U$ B9 X' n6 A
这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,
# G9 C4 X  m) I( ^' c通吃一切网站。' I$ [, b9 D: S1 V
所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。# t1 x# q" M8 S* l' @7 N! X
这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:
8 h2 K9 Y4 S3 @" jhttp://urllib3.readthedocs.org/en/latest/
1 v- F; ~2 F6 |7 \http://docs.python-requests.org/en/latest/) ~9 P2 D. ]! b$ [6 Q

  1. ; [$ N5 i" |3 F, K
  2. #urllib2/ S: \: ]3 d5 N# i+ Q: ~" r4 `3 I
  3. import urllib2
    , x* s0 J" x! q  s' V+ A
  4. def getpage(url):' j3 l$ U% y4 U9 x$ ]  q! |
  5.     req = urllib2.Request(url)
    - K! ^( z+ ]' u% x, k: u
  6.     response = urllib2.urlopen(req)* E6 X$ @3 L1 h) D4 |. A/ ]
  7.     page = response.read()" _9 G6 `# P( T

  8. - ~5 F; v9 l, T* M2 H
  9. #urllib3
    $ u0 k$ [5 H; L( B) U$ _, I
  10. from urllib3 import PoolManager' T) G- t" |4 m. J$ c" r# _
  11. http = PoolManager(). V4 n" P0 ^" c' s, W
  12. def getpage(http, url):
    0 A- ]) R& y' J4 X3 d
  13.     r = http.request('GET', url)
    1 }/ c8 `! C. l3 x3 ?& H" G
  14.     if r.status == 200:
    " G  b* ~, e& o1 a' Z
  15.         return r.data
      a* g9 t7 x+ z8 Q
  16.     else:: A; ?3 D- o$ U: U: A
  17.         return None
    , ]) |0 I1 n5 V/ d2 R4 w: k
  18. 6 L. Q/ f2 i2 k/ ~- s
  19. #requests9 R* a8 n8 t1 @# Q/ \- [/ |
  20. import requests4 Q3 U) }4 L2 w) T
  21. session = requests.Session()/ s( [' c% w6 U) F1 x
  22. def getpage(session, url):
    - j  B% g7 O3 K! m0 r" T! J, ?; {. Z
  23.     r = session.get(url, timeout=10)
    ' |. H! o. e. e- y
  24.     if r.status == 200:
    : A. w: m9 z& K# N1 T$ S  t
  25.         return r.content
    " U+ s0 N, q6 m" d3 _, I7 a) Q+ y* k
  26.     else:: V+ R! q, D% M- r. [) n: T- Q& M# t5 i
  27.         return None
      q3 S* x7 W+ H8 v( t
复制代码

, L* g2 J  f4 {$ a5 [% G& B& ~* b四、后期制作( b' N$ z- Y/ f
1、文本处理,是个特征识别问题。
' Y, V! o5 s$ b: a; N; \" X本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。
: M! ?* @5 \* @5 L2 c& Z! y当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)
+ t$ Z5 J8 Q! `4 I0 m都涉及到特征识别问题。) G. r1 L+ G$ j/ {
相比这些高难度动作,文本处理算是比较简单、基础。9 y3 L3 ^0 F8 N/ q- q* u# T5 m
Python里常用的文本处理技术:正则表达式、BeatifulSoup、lxml
6 e) ~' \  G0 b. j: D1 n2 Y正则表达式非常强大,但没法处理递归嵌套的标签型数据
4 l' n( x0 {- W" Y) b0 g  _(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);
9 y  Y( X; f& [2 EBeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。
) ~/ o: {$ s! E所以常常要结合使用。
% M$ t- u& y( D这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。
2 ?0 {. r2 q, W, [  T- h) A- `. p1 ]4 o! b$ _' X* n- q" w) \0 ?
2、排版+ r! H4 H" f( w2 N3 U6 n
HTML、CSS的基础知识:- ]8 m$ u/ k+ |/ t2 r+ F( q; k. T
http://www.w3school.com.cn/html/index.asp
$ Q  i6 v+ Q( x5 ~( x+ M( Whttp://www.w3school.com.cn/css/index.asp
4 Z) l9 G  _! x" @- Lhttp://www.w3school.com.cn/css3/index.asp0 G/ h" `' {9 D, b
非常系统、非常全面。
% |  r0 c8 @7 Z1 J9 B/ Q排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。
8 Q; [& w1 S6 J* U8 I& k# m" v+ |. d$ e7 y) f7 v5 V
五、结语8 b4 P) y& b& k2 Q; w' _6 t
花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。+ W. {5 |$ [0 W8 b$ I: h! \3 L
所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——3 u( T$ C, V) ?' G5 i8 S+ z
大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。& Y# [6 Z; P; \
9 }' y& V1 _4 X" v2 y  z5 M6 y6 H
打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。
: s0 n; A4 x7 O! j: l4 G0 }2 J0 M$ n# k' F! H
只是拜托不要打扰别人,真想要就自己动手。
5 q: |: ^$ K; k( `0 I+ ^尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。
3 g/ [3 M( v, C9 o( H水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。
( o9 A8 S' ~" E: w) h虽然每个人都觉得自己至高无上,应当受到别人重视,
8 x4 t: T* E  F  C, Z( s0 U" y, B其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰2 T) e# Q2 W+ J* f2 ~  X. U3 L) A
5 j, o( |! W/ }$ l9 U  B

1 G2 L8 G0 {! J% x# C) }========$ m/ H" Z6 S) Q* t9 u3 v6 {
六、拾遗( U0 a5 m- K) m) A! T. f
关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类
0 X. d( o0 k! r* ]确实如此
# F- c8 j' H6 N, \( \/ l不过这里只是举例而已,不用太较真啦 3 [0 Z+ u5 B! _) q5 }
实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏# ~0 X  M5 X, z) \. c( @: w! V
这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。5 `& g: U. e& I4 r5 L; B
即,
" `8 E* U% o" p& j第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)
3 N+ b; n6 N) c+ L第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)% M( s; e( j) E: F, x4 m2 f8 N, O& X
第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作
6 `: R1 Z* M" {( k7 N/ i。。。
9 w6 L- ?7 U6 k2 P# Q! e: d直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空)/ r: [9 f# ?9 Y# k! `
最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。8 g3 P1 Q) }' D# a# o
形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。3 S6 D7 L1 _5 N1 C
因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。. B: v! R( V2 D' Y' z2 F6 f

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:41" A# o- K8 P8 L4 \; e' F; j
感谢楼主分享知识和经验。9 U9 f) k! C- ~; }4 M

* }; F* G. A2 [) F* w+ S每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...

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

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。# T- K1 _) Q2 S! B4 l* X
其实只是你没有发现而已。
0 e/ N* A4 n" `ODE: http://www.oxforddictionaries.com/browse/english/" r; V% B9 C8 M1 D1 u, [: q" T
RHD:http://dictionary.reference.com/list/a/
% V0 ?4 }$ A% U8 |+ K' JCALD:http://dictionary.cambridge.org/browse/learner-english/! K6 G8 f4 Z; B  ?$ F5 {& z+ g
& y& h. ?; N8 I0 B+ Q
如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。& x7 k* s( e" b, w, K3 R2 f
以第二个为例:
1 U# O4 s0 [  Y0 r3 Einurl:browse | inurl:list site:dictionary.reference.com" L: Z; c; ]3 a9 O

& I6 Q' `  f  ^: m) g6 n% gPS:最近才发现这里,发现资料很多啊。
2 g; L' o3 ?+ g, }: z2 ~% l3 b! M6 b

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧: W! j! m8 B0 o
. S8 |8 B9 N% t0 f
假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改. I; P+ ^1 C$ J3 ^
或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下) m4 P- k( ^$ ?/ n
结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。) g# d3 e# v9 G' P
这里有个比较省时省力的小技巧,可以快速定位到想找的地方8 s8 Q, b. l6 s! \. i6 L
/ t) t8 P. ]; w
1、Goldendict里,在想修改的地方点右键,有个“审查元素”:
. c$ K! T9 M/ x! X1 h+ |  Y+ C' {- q0 v6 H6 `# A' ]8 J/ ^. R

  A4 u% _$ A. [7 l& }$ @2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事
1 Y5 H1 K6 O% J! ]- v! S+ g" A4 Z9 f/ z+ o/ V. Z
1 T: O! f! P) _3 X- c: J
3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方
' k; R2 b5 I3 T; b4 {( s# \" p5 u; ]7 ~! p# v/ s4 D6 E) v

% z2 g0 b4 K7 B& J1 O' P* s收工

该用户从未签到

发表于 2014-10-24 18:41:00 | 显示全部楼层
& C4 C5 ?' S% e9 @  D
$ m/ u) I; u3 J- y0 Y
% Q+ Z) K1 U" D

; K% K4 y" E& j1 h# P# D. F感谢楼主分享知识和经验。- o5 k/ x6 @8 |  W

6 m& |/ p6 U" ~2 H每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。# ~+ m% k: w+ X
, F/ l. q6 z& N4 h& o# m! C
私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。
/ N! Z  r3 Y) |& p
5 Y4 e$ ]3 I4 w& i0 ]但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。
* i% U3 n* `3 M; Q% d4 w2 I: \6 e+ q1 N5 A
除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。% z" E+ @4 \  g" g

) Y! Y' p% F& Q! g1 E2 q* _" t! i# C' }) a- p' a; k
# G& E& r7 Y! S7 J
! P- ~( G& V9 V3 p) s

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件) D, I( R' F# B7 g! y
  • EmEditor
  • Beyond compare& _, Q) H* p  Y8 ]  \) m2 I

( a4 ]" H( U6 m6 l4 t3 a1 a% M; z, N- f" x  g6 T
前者用于编辑,后者用于差分比较+ e/ v! Q0 V; o9 ^: E& h4 M
处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

发表于 2016-6-8 07:41:03 | 显示全部楼层
bt4baidu 发表于 2014-10-25 21:01
# C5 p5 e& k* G1 e) q5 d现有的mdx词典,其实足够绝大多数人用一辈子的了
: M3 {, ?, L# e: J) o) O( o2 w9 c5 m) S# T2 G5 g  h
本人前段时间制作、收集了不少,经过一段时间的比较 ...

2 Y3 v/ x3 ~* Y( ~3 J2 |8 O$ g肺腑之言。

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考; o. t" a$ r% \4 c
" x; P& \/ Z: @* Q
网页设计中最常用的字体有哪些?(中文和英文)& {( z! \+ l2 J9 }% ?5 Q) r
http://www.zhihu.com/question/19680724
( M2 L$ ~& F% x6 Y2 }7 k
# V) V. y) K- W/ P6 ^; R# G9 @! o7 ]本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode
* d) ?% f( d3 I/ e' N9 I- ]这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全
7 [: S: Q) V% G' |$ O6 m6 J' n1 }& _) m( J另外Open Sans字体也挺漂亮
# U* \0 K; p$ Z. B
  • 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
    8 w& N- T3 _+ K, @0 m* M最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...
      j3 ?8 j* C/ m9 u
    感觉找到适合自己的问题好少啊2 X# N( {$ i& M1 u4 o1 Q( v2 B
    这个适合的话感觉是兴趣和难度5 n0 X, V7 c! Q' X
    想请教一下楼主是怎么处理这些问题的呢
    2 {. S  i# ~- M+ Y2 z5 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 编辑 . f- e& I! w! D4 J
    7 t1 Q$ M5 ^6 h7 h) L
    写得很好。刚看前几行的时候,的确激动了一下子。虽然没怎么懂,但是第一次能坚持把这样的东西看完,觉得也是对自我的一次超越。谢谢!

    该用户从未签到

    发表于 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 编辑
    1 }* S1 k& W& k0 j4 c
    % K7 {8 U- z! l( E5 z0 R7 o2 xjava和.net就是个垃圾,我懒得提而已
    . c4 a  W" s  m" }  o- H6 u在Linus这样的大神眼里,连C++都是垃圾:
    + m: X8 f( U! s* S" L0 _$ d& B8 ^http://www.csdn.net/article/a/2010-06-12/218785
    - ^  v! ~! {1 U& R6 H  _4 g1 f
    ( `8 D% n/ n8 a2 g如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。- q9 P5 O& k& g2 G
    + V0 x8 v5 c; v+ @
    不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。' A5 T' g9 @( h4 i" ^9 h: `
    我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。
    " k7 H. E# ^1 k这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。2 n7 x: R# s2 g) W
    不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。
    8 ^7 c/ s5 a9 O" n为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?
    ! |  K) w. F) i) Z6 v因为垃圾代码太多了。$ q, P$ s, U7 p) H

    - Z& H' J( f6 ?+ G, M% ^/ M9 L
    % F9 P2 x. ]2 `, {# @( i( }- V* X

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑
    4 L! c- I( Q) B5 W3 s) Z  w
    - M; H4 F2 o; F. E( b4 }5 Q/ |
    " z/ |/ o& h& c! {( [算了,道不同不相为交流
    ! L3 c' S6 O. L- I% _% L想起某个梗
    0 o6 j) n, }5 G: c/ }2 O. i6 ]程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!
    1 ^  i3 J% |7 f' H) [* Q+ ~5 \. w7 U- J! A7 R/ \4 W
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。
    ! @, G. a# {' r% K$ q
    . X7 F6 _+ z& v# T  I另外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:076 v: p. @! Q; Y3 A3 B! H7 z( J
    算了,道不同不相为交流  }+ l$ v" f' \7 ^+ D- ~' {
    想起某个梗
    3 j5 L4 l4 X+ K2 ?. {. ]. J8 `/ K程序员眼中的编程语言
    6 e5 r7 m, V3 S3 g* w6 r: k2 V
    不同的语言适用于不同的人群:9 A# V+ @3 S4 n4 E9 k7 a
    如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。* E$ X) @# E9 `. [5 O
    如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。3 d7 g$ [# @4 q( a0 L
    至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。
    " D8 O* p& L) e! |& I9 f3 l/ y5 q* C' l( s. S# g1 S& b
    编程语言的口水仗永远也打不完,不争了, |- ]' a1 [  X0 x/ _- D" J

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:351 o! c' Z4 l! Z3 y. m
    不赞成多线程抓网站,但是好贴子要支持!
    - c# w4 @$ H! C/ e! H6 w7 ?: [
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...

    ( D1 z: `+ v  y/ o) y4 Q8 l8 N下载软件?推荐一款?. p2 k8 ~2 g+ g0 G
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;; ~1 e" N/ c8 D7 P5 j. G
    现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?
    ' J6 C$ |* _. ~7 |比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。
    & L8 O4 Y( ~1 Q" Q: M) T* C+ ~除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。
    / w0 d' S( S) j6 I6 g& Y目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。8 |1 {3 S+ a6 y8 O* u5 ~
    . `, A+ y: _! ~# n9 P4 Z. |4 e
    至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。- @, q" c# E% |6 m. \
    对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,/ T0 {3 Y/ p+ i1 w( u! w
    目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。5 W7 k! I% s& u( I# c6 ?4 f

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:$ w% b" _; Q' ]6 N; N, s6 Q3 A. ]
    随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。
    2 z' Y: f- }/ w: k4 H6 D未来会出现一个新的行业:私人计算机管家。
    ) V/ {$ \' W/ t; k. O专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。, \4 [+ }1 s0 m( _5 m
    但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:29
    9 K& T( x- G# m  N+ A/ M下载软件?推荐一款?
    4 C- L# k5 k' w( S+ E9 i最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    3 ]3 R* F; e# E! q现在99.999% ...

    - f6 q  w7 x/ |4 I用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。, N+ @' Y; V/ B6 d

    ' D: o5 p$ K# o# e十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。. y" [! Z9 K- I4 a/ P( L! p
    4 G# M4 ~7 s. J% r  H
    用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。
    : F" f% b, v* B; q2 A# J+ g6 c) J6 I
    我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
    大熊部落 发表于 2014-10-21 16:18
      Q4 {" `+ y( I. V用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...

    ' A0 e5 w5 ?# l" K8 B5 @我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件
    7 N$ ^) O1 C7 M: n. C' G8 l! B2 P. v! h  B0 d
    下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。

    2 F/ z; i% y/ x, n+ J' r推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

    该用户从未签到

     楼主| 发表于 2014-10-22 20:21:14 | 显示全部楼层
    平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。
    ! H. {0 c, i+ j3 [* O3 l+ H
    ' R. ?9 l! n. I  H8 H. d- k! W
    最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差
    1 L- O6 {2 v7 g2 R2 _" e/ h计算机是用会的,不是学会的;/ ~' `8 z, G0 F. l$ E
    程序是调试出来的,不是写出来的( H7 B5 f3 _3 b" C* l+ b$ ]) g8 r. y9 i

    " B3 h. u2 j+ u* [/ z3 r既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。
    & Z) h6 V3 `- u4 Q你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

    该用户从未签到

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

    7 a& E1 t. u4 K4 p* c  |4 @多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。4 p( v. Z: T  Y" Y
    5 N6 t9 N3 A+ l. h  f# N( v1 P
    我的一点网络小技术是很久以前在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-24 22:10 , Processed in 0.089247 second(s), 12 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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