掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 69103|回复: 148

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

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑
( K, M' T( p! d0 X2 Y! e" X5 C% v9 c) w( `3 l& D5 g# K" F
这篇文章主要是给计算机小白和初学者扫盲。
. d8 x! c- J) J' d. \$ i; F; U* h本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。
2 `7 ~2 W9 I* F# c2 |8 S只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。6 X; M& R$ g# g0 p$ @/ T4 H
$ Z' d6 }  [! L3 k" u0 w  E
一、计算机的两个终极哲学问题% o8 Q% h. y, H! q/ g  Z* t
1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。+ r% h9 B7 w. E. e; Z
图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:
8 X$ o+ i  k. b0 F. ^设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;
6 x  M# \4 V1 }; U; ~机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。" b1 k8 t1 Y. {5 I
方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。
& f9 B- r$ n1 [! z( x& j“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。
0 [% o! O2 P0 j/ j% x1 W% `- U) l. A8 Q6 N! i* L1 |4 M
那么要写出程序,立即就会发现不得不解决两个问题:
& i$ [1 X! N, H5 `" x1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址。+ @) `1 N3 D  r" d
2、怎么把两种方格区分开?也就是特征识别。' n0 _  {& W/ N( l
这两个问题,就是计算机的终极哲学问题。
0 i  ?' {! v# M& Y3 g/ e# u理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。
) o) E5 _7 l+ N9 Z9 ?0 N0 \下面的讲解也会以这两个问题为核心展开。
# g- `- t! f# V+ }) U% a' y) Q, }1 i( B. g2 z' V, A! O8 O
BTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,
5 G+ T0 J! `8 i8 d& E——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。* S: w3 X5 N0 n2 ]7 I' R
所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。
* C  W) a+ N8 s% D: ^/ D$ i+ t前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,
# V3 u$ z: g# ?+ T2 m6 a而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。
/ b& F( b9 b8 h/ |4 C  Y+ i& L2 U具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。
- P8 S# ?$ Q2 P4 f! [
' b+ @7 M  B) y1 q5 C- E  X不要觉得自己上学时学的不是这个,or文科生,就不行。
/ C& F; }! U! L9 X, @/ I+ V江民杀毒软件大家想必都听说过。
! j. B: x2 Z7 l+ r$ D创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。
, S: p, {, t, p: N1 J# z' U咱不奢望成为专家,写写程序总还是可以的吧?+ M. z1 C8 C1 }  v7 t3 O

) n. @# N; k. V! T二、采用何种编程语言3 r  _+ K/ \4 J( z: v  a% B. g
上面已经说过,存放、读取、组织、区分数据是编程的核心问题。0 g7 s6 L- e) I8 j
显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。: H+ _, a2 e* a/ c1 G* g7 T* @! _
抓网站,恐怕没有哪种语言比Python更方便。& o9 D1 T7 L$ b- w6 q+ R
当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,! p& ]" [/ Y- k1 _* E" k' f
计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,
" k& b% T1 K1 u7 v3 \, U没有慧根就别吃这碗饭。
) g- g( R; J+ W. V9 w
) }: Z6 h, H) T6 D9 L$ b6 j三、网站抓取技术
+ ~' i: w8 b3 i2 E; D! K$ h1、下载某一个网页,提取其内容
8 }; t, R& N# }  ?' d以前写过一篇,就不重复了。参考:" b$ ]8 o+ ]: m% m5 Z* i) e8 G/ p
用一个简单的例子讲讲怎样从网站上扒数据
( i+ U9 Z& W# _! a* Y# S5 m( T! a
2、寻址问题
( O4 L, Y; G8 X# H/ B- a$ y下载网页,自然首先要知道网址,也就是东西放在哪儿。% i" Q: k3 e" F5 m
如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。
, Z# s) g# \5 g5 T, i) d但是大部分在线词典,到底收了多少单词,事先是完全不知道的,1 x7 F+ S  y8 y
要把单词弄全,就要想办法得到每个单词的网址。
( D. N) y# N5 P& p. m7 N总结各主流词典网站,大概可以分为这么几类:9 |+ Y) m9 n3 f& o; E$ P6 ]
I. 事先有单词总表
; o& t4 J1 U8 y) ]比如http://www.vocabulary.com就是这种类型。
* G  ~+ T5 \/ Y它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。
% c& S+ T& W/ e# n
" z4 H, s# Y  T1 ]" WII. 网站有索引页面
! d2 U5 m" Q' f* S如:
. j% R& \6 i/ hOALD(http://www.oxfordlearnersdictionaries.com/)3 ?: a1 [# Y% d7 F( ]
它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/
) B8 @& w8 c' w! R% ?& yLDOCE(http://global.longmandictionaries.com/)
- o' p+ h, W) i9 D采用框架结构,左侧边栏就是索引页6 m" k0 ~8 K! O: e8 E0 u; M
MWC(http://www.merriam-webster.com)! y4 S$ |6 B0 |
索引页在 http://www.merriam-webster.com/browse/dictionary/
) C4 |+ @# d4 @# n$ W3 |: c5 B等等/ l- B5 }- {8 L& |* f+ l# B
这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。3 q) U7 q: E# U, @

  1. 5 }/ n- C; K! Z
  2. urls = []5 }1 _' U! M( w- W7 W: h8 n
  3. for someindex in indexs: # 循环所有索引页: A* a0 F( W' e2 }& Y$ F, Y9 S0 G
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    3 i: u9 v! `1 ?  _6 a% D6 n, \% r
  5.     browsepage = getpage(browseurl) # 下载索引页面1 i7 ^" b4 g7 N8 M9 @% l( T: F5 B
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域2 Z! c  D8 s; s  J
  7.     bs = BeautifulSoup(browsepage, parse_only=target)
    " M* l' ~3 p6 c7 u4 C' |+ Q% s
  8.     if bs:2 D. j  T( w: ~/ t5 B  W. j
  9.         for a in bs.find_all('a'):3 _) E( c2 C% @0 z8 y# ^
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接5 w8 n% n) }+ [6 H- y
  11. 然后:
    ; O* N1 E; }1 Y5 r& ?" N
  12. for url in urls: # 循环所有单词% n' `$ e& H& ~6 O% [
  13.     wordpage = getpage(url) # 下载单词页面9 d- L* Q4 g5 K% w
复制代码

9 O9 d4 @9 \4 s3 g3 Z1 g7 v) N6 H% s9 L* X
III. 索引页和单词释义一体型网站
. W$ t- o" N* `7 C; i如:Online Etymology(http://www.etymonline.com/)
5 P& y- H! [+ Z" ~7 t和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可! u/ a/ o. a) f7 ?
  1. * z- h2 @5 N! r& X0 L/ J
  2. for someindex in indexs: # 循环所有索引页; U& S+ v' P' h  D" a$ d
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex])  h4 z8 V0 C, U$ R3 i8 p" [% w8 ^' U
  4.     page = getpage(browseurl) # 下载页面
    0 A0 L# h  v( B- U' B
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域
    , ?8 K8 Z& B7 F) f7 P  T
  6.     bs = BeautifulSoup(page, parse_only=target). B8 N4 E9 H. y
  7.     for tag in bs.find_all(target): # 循环抠出单词
    ) ]0 S  v2 ], v# T9 D. I" U4 Z
  8.         worddefine = getworddefine(tag)
      q- B5 w4 s! l. h  q
复制代码

, B# ^; s- ?$ T$ Y1 G* L* [) H  F$ W# C8 R
IV. 片断索引型网站0 o3 i: m; k. Q+ Q. s5 o* K
如:
  G9 P1 u% E: g& sODE(http://www.oxforddictionaries.com/)
+ \* z2 J* ~( Q/ f每查一个单词,右侧边栏有个Nearby words
4 |+ H( b: x8 M( g6 v/ @8 A# |RHD(http://dictionary.reference.com/)
: H# [- J* _# X( T$ I右侧边栏有Nearby words
9 S7 u0 f4 E" ?9 w. BCALD(http://dictionary.cambridge.org/)9 M8 w6 j' R* W) ~4 k8 q" r
在页面的最下面有个Browse栏,给出前后相邻的单词6 S1 @+ m: z% q: Y' c
这类网站没有总索引,只好利用它的Nearby栏。
0 v+ o  N7 M3 ?7 b: c& F思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,* f! ^2 ~* e, i8 ^
每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)
) B9 v& ~. Q& ^+ F* O
  1.   {0 r' M, ~2 g, B$ m
  2. cur = 'a'
    ) d: R5 N: T* R4 c- z
  3. end = 'z'
    5 b& N" j- l/ l  ^- F$ ]! ~
  4. nexturl = ''.join(['http://somewebsite.com/', cur])1 R& y, }: j; z/ n0 h$ S/ x
  5. while cur!=end and nexturl:) @% t- k  c; N# z, \5 T0 n$ E3 v% |
  6.     page = getpage(nexturl) # 下载单词页面$ _) c# W/ {7 m0 o1 g& j9 B4 S
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接
    / C: r1 I+ \8 m& D' ^9 R' o
复制代码

1 @0 M9 e3 j/ G1 t0 L: J3 I0 @4 {$ W$ U5 h% k
V. 完全没有任何索引,那就没法子了9 q: }2 I: T9 P" z
当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理
% V- Y  J- ~& D; |理论上也是可以的,就是效率差一点;  ^. X4 ^* m7 o" X3 W
另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。
8 t9 f% {2 Z: f9 ?: D
8 R: V9 s- z1 ]! G! n5 _+ d0 i3、提高下载效率
% m9 u3 g+ L4 ]% TI. 多进程3 u5 @7 o. U! y8 e
上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。
! _, |6 Y1 L; d# n实际抓网站时,这么做效率显然是非常低的。$ B0 Q' K; Q9 |$ T, S( [
假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,
& c- V* t- Z  B有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。
) n/ l$ X& H' ^: A; M3 B. F6 P假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?; p/ \# L* i7 h' f
要速战速决,就得开多进程。" _' v+ c  X# z. S# I8 C4 J
同样十万个单词,分成25个进程下,也就是28/25=1个多小时。' y+ k1 H, g5 ]: ]. [/ R/ W6 d
再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。# P& m2 H1 w4 q! c8 Z
在Python里开多进程,同样十分简单,
& ?2 _, |; O4 T' N% ^6 _# l7 x  T

  1. + w+ K% y3 t5 l
  2. from multiprocessing import Pool
    - ]  ]& `& ]7 `8 b; l: u0 U
  3. pool = Pool(25) # 开25个进程
    5 S! y- f, F$ |8 e7 L" e5 U
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数
    9 F" @- o7 T! T
复制代码

! X& c' _; I  {这就搞定了。
9 W- @" T$ J) K4 C% ?8 m8 l, k% \/ s; ^
对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,
: d0 {0 ?# y0 s7 E- }' }/ D! U关于IV.,事先没有单词总表,就只好采用区间的概念,+ G# V) o7 z1 e( Q" l
比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载
2 {9 x9 n4 e# N7 ~7 n, Q' q8 m: i: R6 \) w
初学编程的人,一碰到进程、线程,常常有种畏惧感,1 s# R* v7 s/ F0 }8 f* t
看到同步锁、共享内存、信号量什么的顿时觉得头大。/ P1 X1 w5 b9 F4 R3 j$ x6 D# I
其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,
, ?# Q8 m- w1 P: h其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。
8 s. p, b! }; P8 w8 ]: ^2 P; E( s: F( H; n% Y) B. G1 D4 {
II. 断点续传. W7 [7 [9 o+ t  C. h
事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。
0 ~) v  W- v6 V9 f" X8 n所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;
- x- F1 \4 D8 E* B5 a+ i- y即便无法自行恢复,也得容易手工处理,不然可有的烦了。
& M0 b" T, G% a' ^这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,
$ m" M2 Q8 E( A* S7 ?) k! x4 ^直到所有区块下完。4 }' ]8 X5 |9 w# v0 F

  1. + U0 g1 ?8 @6 g( l/ R8 O5 G
  2. def fetch_a_word(part, word, url, data): # 下载一个单词. R7 J( E9 [: q* T1 ~
  3.     word_define, failed = get_a_word_from_website(word, url)' D! U0 @. @. X/ \) S4 ]" o) G5 {; K
  4.     if failed:3 b% ]! M+ ?( P. G  x
  5.         dump_failed_word(part) # 输出下载失败的单词及网址
    ( Y, L8 R: a# Y" X
  6.         return False
    # Z& o9 g& u1 @. @
  7.     else:8 ?; q3 C' |9 T( c1 w
  8.         data.append(word_define) # 保存下载成功的单词数据6 ]" b: b/ }9 j/ b9 o" M" ~6 e. A2 |
  9.         return True5 I; a' x( C, u: D" x- u3 @  @  s: R' N
  10.   ~! D) S& S) u* `
  11. def download(part): # 下载一个区块
    / |7 ?& q# |) k  S: J# v
  12.     words = getwordlist(part) # 读取单词总表
    ) o: F0 T  \7 Q" |% u6 m
  13.     if hasfailed(part):
    ; ?( ?9 s( r3 H, c/ w8 T
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址
    2 ?9 B  H' I4 W& Y9 W, m/ q( Q
  15.     else:
    2 c5 u$ \$ l5 U# F) E% h2 s+ H/ I% S
  16.         word, url = words[0] # 首次从头下载
      f! I* F6 V9 S7 ?5 d
  17.     data = [] # 用来存放单词定义
    ; t8 X! P2 d$ ^
  18.     while not_end(words): # 循环下载; {) K+ j7 h/ _! d
  19.         if not fetch_a_word(part, word, url, data):
    $ n" ]7 [+ Y4 s, k% Q  w5 U
  20.             failed = True2 L9 e. m: P: P+ }
  21.             break8 M4 ^! z; ^; _
  22.         else:6 g: F" U3 H7 `: g
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址* g0 u' m! l* r. o* Y6 f8 C" r
  24.     if failed:
    % n. e* E- M% p
  25.         suffix = '.part'
    0 f, C" Q+ Y* Y, g/ v
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'
    ( i* |" ]  h/ ?' q  c' ]5 S$ q

  27. 4 H" V$ M; i% e2 s- _
  28. def isfinished(part) : # 判断某区块是否下载完成. \9 W$ P/ S$ F+ z* Z
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断: R! t8 Z0 d! x: y
  30.         return True
    2 ^/ h5 T* X' `* y$ T
  31.     else:+ C0 M# |$ m* v9 l5 P/ W# d
  32.         return False; C& h6 _+ [; s. q* |1 a

  33. ! Z7 x  R1 g1 m$ y  N
  34. def downloadloop(): # 循环检测未下完的区块1 {4 i' [/ B. M4 Y4 s6 x
  35.     finished = 0
    1 k4 s  t/ ~' i6 B# r9 H
  36.     while not finished:! w0 {% ~! }2 ?& \0 P# o6 S3 X
  37.         nf = [] # 没下完的区块
    3 Z5 I0 T( H' V9 ]% [7 a
  38.         for part in parts:
    . T! k; X& H; D2 y' Q! x
  39.             if not isfinished(part):
    8 q- \& h# s# ~! _
  40.                 nf.append(part)1 n0 G, g' g1 T* q% N
  41.         finished = not nf6 S  i; j# f+ J, q+ p9 p
  42.         for part in nf:
    , M6 N/ q+ X" K3 X7 C( C' C4 W
  43.             download(part)
    ! V5 E$ s7 z  H( t- J& \- Z" t
复制代码

  A) u7 j4 Y! C. i( C! l! T2 c& a
* P1 e- `" P4 V7 Q) c, q. FIII. 高速下载网页的小技巧
6 V" e* T4 ?, z# D+ [Python里面有三个库都可以用来下载网页:urllib2、urllib3和requests。
; a/ l8 V. j6 i6 C6 W. A8 n4 k其中urllib2是Python原生的,urllib3和requests为第三方库。& v0 J0 p& j+ h( H1 B
(似乎Python3已经把urllib3收编为正规军了)
3 E( a: U/ a' C& e3 Y7 `这三个库有什么区别呢?( d7 N9 i- d: C. \. n9 @6 a
形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。, q/ N1 E- P0 f4 r* j
再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,
+ Q+ }9 i1 V9 Z& N+ R" W所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。
( h% t4 ?: p6 M$ f但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。
3 Z# \5 \9 ?7 @0 [& E' e6 L! R; D' Q这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,0 W1 n# Y/ J+ \8 y4 g, v
通吃一切网站。
5 u* J# ~$ g* Q5 u7 |所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。2 K( p2 s7 B6 E0 |! ^/ f
这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:
9 Z0 x/ L7 |! J9 t6 K! qhttp://urllib3.readthedocs.org/en/latest/2 e0 U" |$ {* h2 V* }( z) g, {
http://docs.python-requests.org/en/latest/:% ^* ~' N4 V- R: P: D1 X8 j1 @
  1. / W5 w3 ~3 P! r& }+ |0 n
  2. #urllib2$ F5 W! p' m- p. Z/ t- ]) A
  3. import urllib2% J- J! s$ g! v& Z, D0 t0 t/ U
  4. def getpage(url):: t5 Y$ g, @) n3 Q, O9 U7 T  S
  5.     req = urllib2.Request(url)% h6 h# G! a' F. U; |# {
  6.     response = urllib2.urlopen(req)
    : U! l" Z4 H5 r; V' p
  7.     page = response.read()  Z8 X7 |+ \; |8 P; e6 i9 z4 o. o
  8. ; r8 P5 _! `6 N2 x5 Q
  9. #urllib3
    " k3 z5 |$ s7 ~+ u5 D* V4 W8 m
  10. from urllib3 import PoolManager, B8 E5 J0 b' c! U6 d. G" f
  11. http = PoolManager()
    ; a8 d9 t' G7 B
  12. def getpage(http, url):
    - ?0 ]; ]. e5 E8 _( L& [
  13.     r = http.request('GET', url)" ^7 b2 q& B; g4 g
  14.     if r.status == 200:
    : I6 V- a; b5 u! ^' ^/ w
  15.         return r.data2 v" E8 s$ Z! J
  16.     else:2 l8 p* U; q( Z9 l  D. l9 H
  17.         return None
    0 u+ J: ]7 y. a. s- J8 P
  18. . N" O2 `' \3 _% o$ b8 ?
  19. #requests6 ~; I( m3 H" h4 @) D" z# g) X+ U
  20. import requests
    ! L) k0 H  y9 `
  21. session = requests.Session(), N" d* e% v: ^  O
  22. def getpage(session, url):- g  J. ~9 m( H
  23.     r = session.get(url, timeout=10)8 o5 W  d" C- _9 Q% b4 Q9 }
  24.     if r.status == 200:
    + B: e% X/ O. ^- Y, N
  25.         return r.content0 U0 E/ j! P# m+ r% L  H$ Q; J& i, q
  26.     else:& L6 N: {0 g* J3 d
  27.         return None
    ) G' `# ~9 H! i8 J
复制代码
1 U8 H& ^9 p& {* w* B1 }5 r
四、后期制作7 j% q+ E6 k2 T% T, P1 O& Y
1、文本处理,是个特征识别问题。+ F( ?( g& ^3 ^* r& i: K
本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。  T2 i- w/ \, k0 }% V; d5 s
当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)
& t7 y4 e6 c- R) V% O6 g% {- x/ h都涉及到特征识别问题。3 B1 R8 J+ V, I: F" b# x9 F% p
相比这些高难度动作,文本处理算是比较简单、基础。; Y. n: W0 ]. Z9 j/ B1 N
Python里常用的文本处理技术:正则表达式、BeatifulSoup、lxml" b' q" v. J; f5 O1 s4 f1 W  D. ^
正则表达式非常强大,但没法处理递归嵌套的标签型数据& E; [5 C) q: n) [, \+ s# Q( j
(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);9 j" r4 }, C0 i3 }
BeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。4 x4 z# a4 ]4 d) s' N9 w. |  d3 a
所以常常要结合使用。
6 |( x2 B& }9 M- v, F8 v这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。6 b8 h% B% f9 C, ~/ `
6 A% d9 ?% Y/ L
2、排版0 C# w& s9 V- |( b% ~' S. O
HTML、CSS的基础知识:6 E6 i1 {# N! }
http://www.w3school.com.cn/html/index.asp
/ o% q/ Y) z; t  {% _: ~" ]4 _http://www.w3school.com.cn/css/index.asp
# |3 r$ W( X0 P$ w  Z8 qhttp://www.w3school.com.cn/css3/index.asp
' Z' @: s# k4 p* {非常系统、非常全面。
6 t6 |& v- E' c$ R排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。# L$ C5 W3 m# d3 n6 l
2 ~! W2 z3 n5 n7 i
五、结语
" W( |$ f9 S0 x花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。, {5 w, d+ n& \# S5 T% T. f1 [* l6 b
所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——, Q! }6 `+ x% ]$ g; E
大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。
+ I3 F) V: R! \6 V& T, i. f$ I" f, g
打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。* R3 n8 b" x$ A4 I

% w8 Y  l9 O2 ]: B% p只是拜托不要打扰别人,真想要就自己动手。: @$ _6 w+ t8 q& ]4 L1 Y
尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。
7 j1 T) y/ L7 M  {水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。
6 \. i) e6 K! H' E虽然每个人都觉得自己至高无上,应当受到别人重视,
, l* Q' ]% O2 w2 w% ~其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰
. Q  q  _. X/ P! |: o* ~
9 j! A, F# ?& ?. U5 I2 _' f3 I% _& ]" c' G, n" o
========8 b. P' s0 t3 t3 e- G1 q
六、拾遗
+ E; K, P% \+ @3 U* T! v$ Q关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类
' C( [! s+ n# l  H6 g4 V! X确实如此9 t6 k) h3 a' P1 C
不过这里只是举例而已,不用太较真啦 , G3 z4 \' @) U4 h2 b, w* x
实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏+ H( g, m6 {0 O
这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。! ~# {0 L" f5 h1 W" x* l" k
即,
; C8 a! S( z$ V第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)$ v# s9 N2 c/ Q5 ]
第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D), V; p% @/ i4 a
第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作  x2 }8 Z  t; ~
。。。
* C: x, r* F" P! U. a4 w直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空): y  \' Q" T" Z+ m- u( Y% P, \. T
最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。
- [. i9 ]2 `, U: R, f( d* r9 \- T形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。
' ]4 ~. \# [$ l' W因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。
1 W" ]; H3 T4 R$ o$ T, {$ f; ]6 d

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:41
6 l2 N2 U, ^' J* Y8 }感谢楼主分享知识和经验。7 B& r) i- c0 H. ?( t6 ^
$ f2 E& @0 A& Z9 a" M3 s
每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...

( i6 x$ O3 ?( g" y: b现有的mdx词典,其实足够绝大多数人用一辈子的了
/ }+ z7 p7 ?" O3 c% X2 n
# O. O8 H% O0 `! O5 J本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。, I" n. v3 I* x& V1 v: G; Z& G) h

7 o2 b6 L* \, W. i8 Q4 D本人最常用的词典:" d% ~! d$ ]/ c2 R
主力阵容:VOC、ODE、WBD。
2 d3 r$ g& v( D* a% X' O三本都是中型词典,收词量均在14w上下,以本人目前的阅读面来看,还未遇到这三本里面查不到的单词、未收录的义项。据说史上掌握单词量最大的人是政治家兼散文家丘吉尔,也没超过14w。除非钻故纸堆,恐怕用到W3、SOED的机会不多。$ }" l  |' e" v2 f- c% l7 H& T

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

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。
) i6 B6 f0 j5 `- A$ I其实只是你没有发现而已。0 o& c9 A' c( o# e4 h
ODE: http://www.oxforddictionaries.com/browse/english/. c4 N* ?$ A* @' a+ Z
RHD:http://dictionary.reference.com/list/a/# [" i* k) e1 b' F$ J
CALD:http://dictionary.cambridge.org/browse/learner-english/
6 R/ ?% x$ o2 _/ [! G( {; Z7 ~, ^4 }4 A! R0 h1 @
如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。
' i) V$ W+ c9 U( b) V4 n以第二个为例:6 r# {1 S* U% H
inurl:browse | inurl:list site:dictionary.reference.com
2 ~& k0 m4 J2 b% \9 o6 r/ b: W/ a3 ?9 B4 i% v
PS:最近才发现这里,发现资料很多啊。
( ~% J9 L% r4 Y+ o4 g

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧
, C" C. r5 S2 e! {
6 @5 T1 y/ S0 C7 o" S" `. N% h4 i假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改  j0 G! I5 L5 W/ j# T
或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下1 g0 K; [. ?8 u) e1 w
结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。6 a9 i% s0 v& C7 U" X0 Q7 R
这里有个比较省时省力的小技巧,可以快速定位到想找的地方6 b- j( Q. k/ Y2 l/ R* k9 l

1 B# P4 q. r# ]  M/ N. z1 P1、Goldendict里,在想修改的地方点右键,有个“审查元素”:
/ V+ X  {! d8 A! K  x* B. \; R( Q" C: c$ Y0 z

/ _5 f. K5 @$ V( E6 X- V2 r2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事! g, v# N. x) F4 l

) r& @1 k1 A* E5 ~5 ^
6 [5 b$ u5 C  }7 O; q3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方: T+ V; h% [8 q

7 w; i3 w% e( F
* [7 @: ]8 W; `收工

该用户从未签到

发表于 2014-10-24 18:41:00 | 显示全部楼层
* @- U. o; \3 J( K* c. v% Y

0 O; Y8 l2 `. ]0 j$ H# k : u4 L3 \- q2 h' i

. C- p. `( F9 w7 C. h9 b感谢楼主分享知识和经验。
% T6 N% O/ c; O4 |- Z" T2 x2 b# q
( |4 L& q3 }2 }2 ?- @每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。
1 @% n$ A7 B  q9 o& g- `; C2 K4 |  g3 m: V4 ^/ _3 C4 d
私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。+ u8 D. P7 O4 r+ D6 s
; w0 @; x8 R4 A6 |( \
但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。
( O9 I  M# Q, n$ ~$ X7 w2 k+ N' ]5 _( K* Q: U! J. |3 i% `" G3 d0 G
除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。
; x$ D8 Z! Z  i* {: O6 d  a
# k* F  L) T- E3 H' m1 w( V
' F0 h7 L' v1 Y6 ]- t
8 k$ Q8 ]  b' O. Z7 W
0 O  ]( W0 Y3 \3 j# g& n  D% R: k

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件:: }1 L; V8 W& M
  • EmEditor
  • Beyond compare, C4 _+ O& a4 Q( Y' f7 ~1 t

* k' I6 J% o; S" \9 @- x1 Y5 d* i$ X2 [' k0 |
前者用于编辑,后者用于差分比较6 g" _& d# ^8 {1 @1 f
处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

发表于 2016-6-8 07:41:03 | 显示全部楼层
bt4baidu 发表于 2014-10-25 21:01
" V) Q2 ]& p# B" C7 n现有的mdx词典,其实足够绝大多数人用一辈子的了( ]5 C6 D1 L# S4 j. R7 t

/ ?& p0 \( i/ c* K本人前段时间制作、收集了不少,经过一段时间的比较 ...
! n3 P) i- l2 ?
肺腑之言。

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考' N& c3 Y% b+ X

. t" x5 O+ M/ K! b) m. l网页设计中最常用的字体有哪些?(中文和英文)) I# |; m! s4 y) Z- m6 P9 ^1 w/ t* z
http://www.zhihu.com/question/19680724
/ P9 `2 S5 g5 r4 q7 e5 W  n6 S& M- Q) D' P/ F: v: \
本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode
0 ~# S8 W, L3 ]这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全( F! P. d- ?0 |% L$ z% L
另外Open Sans字体也挺漂亮
! }$ ~+ m% t- ~2 t; ~' |! _
  • 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:217 k8 w0 W' F1 Y) P8 W, E
    最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...
    # D' j: [) K& A' Q$ o
    感觉找到适合自己的问题好少啊
    ( \# F, H* ?- k' C这个适合的话感觉是兴趣和难度! H& U  I9 n1 m! I7 L  g- b
    想请教一下楼主是怎么处理这些问题的呢" y& V( b* `7 P, w  B0 O( 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 编辑
    . U" y. B: e2 T/ L7 |( _/ m9 y6 L) W2 m$ k  M
    写得很好。刚看前几行的时候,的确激动了一下子。虽然没怎么懂,但是第一次能坚持把这样的东西看完,觉得也是对自我的一次超越。谢谢!

    该用户从未签到

    发表于 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 编辑 0 V$ T% Y# P1 _5 F- p2 m

    $ S4 M1 G. B" K. C: y& S: ?: N, E- ajava和.net就是个垃圾,我懒得提而已" d" W* I! ^" O( X1 b4 x+ t- A
    在Linus这样的大神眼里,连C++都是垃圾:, r2 e: t0 J/ {4 l. a1 b* ~
    http://www.csdn.net/article/a/2010-06-12/218785
    6 {  q& J; B! a8 a# R% F
    1 ^( P& j/ H, H3 [如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。$ N( o' d, u* b' Q
    # r) y$ l4 Y2 U4 |
    不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。$ S2 n# d; X& n/ f$ b3 b3 ]
    我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。
    2 x5 d2 ?/ q# u这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。6 _# }" T! G$ V  o1 C4 L5 N: E2 _
    不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。! d/ x: Y$ B# c8 M$ X6 L7 W& ~: n
    为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?
    ) E$ i4 O0 v- f7 W因为垃圾代码太多了。
    ! J1 T, I& g# Q* Q% g, o3 z9 _6 R& F" b7 h; s( M! @3 E- s% b- a

    & ^- s$ Y3 s, k7 r. |0 s+ z

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑 $ S: p6 p9 z9 V: a
    3 Z' \0 v( t0 i* P! x0 i
    % f' u1 a, Y% F: D' j" _
    算了,道不同不相为交流7 p! a4 H1 V* r0 w
    想起某个梗
    : v& {# P8 ~/ h. e& t程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!# {6 `4 A- L5 g1 H8 j4 Z

    9 A$ t2 W8 ]! F自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。
    1 u" G# {9 Z( }1 y$ h! Y
    & A& H7 d( C8 U: s5 `* j4 g另外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
    2 J$ Z5 `) t$ y算了,道不同不相为交流
    ( a1 y. _! P5 Z  H% [$ {* U想起某个梗
    : W; X. v( W8 ^程序员眼中的编程语言

    & q. x; s+ S5 E, K$ E不同的语言适用于不同的人群:( T& O3 K" u  I4 e1 ?1 U
    如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。
    # \. ^( X4 \  {# t" o% c如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。
    " Z- D$ J  x2 H% S" L4 m# H至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。
    5 |& i8 x  }0 Q
    - r! |; m8 w% {* F" Q& T+ E编程语言的口水仗永远也打不完,不争了
    # S7 k9 S, }3 Z  P0 B9 B1 n

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:35' x! }) P/ c8 j! x  Z
    不赞成多线程抓网站,但是好贴子要支持!
      n# x! f% h  r
    % C  b! H& P2 q- O; W. Z自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...
    # K& k; ~7 }4 A- o. G* T
    下载软件?推荐一款?4 h* N. P, ]+ a# o# n
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    0 K$ e  z6 t. p" ?现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?
    $ F8 R  E# o5 ~比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。
    5 _0 K8 ]' c' r2 C9 @* }: s& U0 p2 j除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。
    : x  ]4 z% q0 \, a# F$ C目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。
    0 H$ P. K7 Y& E+ Y  i/ R) a: o+ k1 Q! {0 V5 b
    至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。
    0 w7 V7 c3 |+ M" m! Z  R8 n对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,: T6 V: I4 f: t" p
    目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。
    , h- e/ U2 j0 U. J; W

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:0 e3 ?& s$ B3 {' C2 }
    随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。; h6 Q0 |7 L: F$ o
    未来会出现一个新的行业:私人计算机管家。
    5 w! h6 |' ]+ F* |4 k专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。
    ( B4 |: L6 |% Q# T7 g' a, V但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:291 k: Z/ j3 n" g- T9 a
    下载软件?推荐一款?" A3 b; r+ t8 s2 S5 m: S
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;) Z( U( i7 \" f
    现在99.999% ...
    & K+ |! Y/ P6 K2 }
    用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
    / \# }& n) @! f- k: |
    : l% V1 y  }$ s# f0 t2 ]# J十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。
    ( ]! @  n* v  \4 U, w& u
    , b6 \; r7 g) N0 K# ]4 R- u: f用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。) g) |/ z* I7 j9 l' b" t1 j; r

    9 v9 H/ S' n0 ~3 ^: [- ~5 S我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
    大熊部落 发表于 2014-10-21 16:18+ ?, x) Q* O/ V) r
    用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...
      [' ~  o8 @5 ?5 f
    我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件
    ; j' z2 M5 P* H  F- _1 w8 u, \! F3 {, B3 L8 B, W& X1 E. E; }, }
    下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
    : s, ~7 _, t- J6 g
    推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

    该用户从未签到

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

    0 n0 @. |- m, t6 H$ Y1 F
    9 L- u+ u1 S9 {4 q) j2 n; Q4 _8 t最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差$ Q$ ?3 x9 F7 {9 H! I
    计算机是用会的,不是学会的;' N* h1 X% g4 ~2 }
    程序是调试出来的,不是写出来的* s% G: x( h7 }& ~; O) [0 V/ z4 I
    0 p& q0 q% p% |/ ~# t7 F
    既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。
    1 q) t3 ]  \: K) s你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

    该用户从未签到

    发表于 2014-10-22 21:25:59 | 显示全部楼层
    bt4baidu 发表于 2014-10-22 20:21
    4 f$ b& l+ @+ Q& W最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...
    ' |0 F6 f% f) x, Z
    多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。: k/ @6 l. R9 V  u1 z: K8 G' _
    ) l* I/ ~& t# k8 g! t+ `
    我的一点网络小技术是很久以前在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, 2026-10-15 08:09 , Processed in 0.035839 second(s), 27 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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