掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 50908|回复: 148

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

    [复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑
/ `' F. F/ W- \0 y2 r. R
" [) K5 l- t/ _) t  v% d这篇文章主要是给计算机小白和初学者扫盲。
) _1 [  U! g( Z) o$ Y3 T4 R本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。
( ]' d* }) d7 q. T- o4 }' p  ^" D只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。& D/ N( C3 F# l
: f. J3 X" h; i$ ?" t+ P, m
一、计算机的两个终极哲学问题
" o2 X; a* T+ X1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。
: F; M" ^, Y* u- F. p图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:
( _$ U3 b) l! g9 O设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;
: H% ~" m& |5 n& \7 H9 i机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。
3 R. v3 @2 e9 U8 f方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。1 x  O- c( V, _% \3 _
“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。
" y) [0 U% {1 Y
& [8 `6 _& A" a9 e# }& E那么要写出程序,立即就会发现不得不解决两个问题:$ z# I' x2 V8 P
1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址; M3 p! \. G2 q
2、怎么把两种方格区分开?也就是特征识别
# D* b; H- ]4 d这两个问题,就是计算机的终极哲学问题。
3 k# B1 ^2 H0 x理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。
. N* W: [, X& ?& @0 j/ `下面的讲解也会以这两个问题为核心展开。6 B! Y" p3 s& e4 N

! H7 P, R$ h- H; m: @% CBTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,
; Q/ G. J# @. o5 w/ {——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。
* `) e2 r! ~' p" V' v$ _- \7 a所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。
" d* _9 k* M2 @- Z前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,
5 y7 x$ i, j- p+ E0 B7 Q而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。
/ B2 ^( {$ o: t* d" ~9 r- d! C6 A: [# y具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。
) \5 U3 N/ |, {* l  I' m2 w: V2 {
不要觉得自己上学时学的不是这个,or文科生,就不行。2 H: K& N$ {1 B1 _6 G. D: H! J  ]
江民杀毒软件大家想必都听说过。
9 E$ M" }; I$ S) L. e8 ^创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。
" H: Y; s0 T5 J: ^  `& z咱不奢望成为专家,写写程序总还是可以的吧?# F  b, ^% H5 D1 m! s
# ^' R- |- A, O0 _, |8 B
二、采用何种编程语言
7 r% x: v& Q/ ]* X; y& A上面已经说过,存放、读取、组织、区分数据是编程的核心问题。
+ Q9 x/ Q! l( b/ q( ]  a显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。
7 A' }9 F4 Q; O8 t9 @" _9 @; A抓网站,恐怕没有哪种语言比Python更方便。
# G; e1 `/ d( f; @当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,
4 m+ t& e0 T! F  r+ `计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,; K! ^- G" }5 f% v
没有慧根就别吃这碗饭。) R: j/ N; u. h3 K- @
2 R# s' i6 G8 q, h9 U6 u5 ^2 A
三、网站抓取技术& W; l0 R( @. A8 [. b& j" g
1、下载某一个网页,提取其内容
5 }' ]1 f+ M) g; f$ e以前写过一篇,就不重复了。参考:
3 i! M$ ~6 O: @' f% s用一个简单的例子讲讲怎样从网站上扒数据
6 c. z0 V6 j# C; y2 D$ i0 n# y7 w8 T/ J
2、寻址问题" W) T. c3 g" C# X& l" B' U
下载网页,自然首先要知道网址,也就是东西放在哪儿。
4 H4 u( U. }  b( _3 \+ g! F如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。* k$ s: ]! m, M
但是大部分在线词典,到底收了多少单词,事先是完全不知道的,: @- d$ J, d! g5 ]# m% L8 y$ `) X
要把单词弄全,就要想办法得到每个单词的网址。
' s" J% b( E3 R) g& @8 `总结各主流词典网站,大概可以分为这么几类:3 _* n& v; p% L( D1 B- u; d- e
I. 事先有单词总表5 j* |7 g+ r2 q) i9 k! z
比如http://www.vocabulary.com就是这种类型。
# k( c  {9 d# n0 x$ P) c  g' M它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。
8 |6 ^  M7 E- a6 b
0 l- |) {! m. V$ P6 g8 sII. 网站有索引页面
4 v, w, s6 u) j* t如:: O1 R6 T' i  M) J8 P* {5 ~
OALD(http://www.oxfordlearnersdictionaries.com/& m& l/ d& z5 b
它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/+ ^) {. P! i: k+ h" d8 C/ ^; H9 G
LDOCE(http://global.longmandictionaries.com/2 u& I' d& l( X: X; B! }( M
采用框架结构,左侧边栏就是索引页) ?9 q* o: e* Q' X
MWC(http://www.merriam-webster.com
$ y  c. @; @% Z+ d索引页在 http://www.merriam-webster.com/browse/dictionary/
; \7 Y' v1 z3 u% g, e! `等等( R3 D( N' H5 `+ K6 T/ e- H
这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。
: }9 d/ W4 Q5 d. v4 ?$ {

  1. ' d7 E0 ]' O9 Y( |
  2. urls = []7 Q8 e1 V. h" [8 h8 \8 f
  3. for someindex in indexs: # 循环所有索引页( Q4 W0 `6 h: e( X
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex])
    4 c9 J( c1 v* c
  5.     browsepage = getpage(browseurl) # 下载索引页面; |; A+ t5 y8 {# N- K- ?9 v
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域
    0 w3 n% h: f' G$ O* \8 |1 c! R
  7.     bs = BeautifulSoup(browsepage, parse_only=target)# g6 ^9 l1 r# u  u
  8.     if bs:
    % ^# n9 i: J* h! ^8 f5 v
  9.         for a in bs.find_all('a'):( Q4 n2 W: ~" N1 L6 N# ~
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接
    ; q- B& V1 v8 }5 H
  11. 然后:) D0 }/ F$ u8 @% E6 e- m" I
  12. for url in urls: # 循环所有单词
    2 ^  y2 o$ k& L& z# d: h
  13.     wordpage = getpage(url) # 下载单词页面- p" U+ v9 t5 A% u! I/ K( `
复制代码

9 H& E) C* E& J* V- ~. J# b/ j4 p  w) [/ o, m& N4 o! R
III. 索引页和单词释义一体型网站
, f' x: R& e$ `- X" Q& P8 C如:Online Etymology(http://www.etymonline.com/
$ f) A: t0 ?2 ^7 c/ \* J和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可
4 ~  E3 N  I7 j3 d( {5 r% `) R

  1. . F9 _. z$ G1 L' z
  2. for someindex in indexs: # 循环所有索引页. o7 ^; ^! ^" C* Q
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex]). d2 q/ L; ]2 R, Z
  4.     page = getpage(browseurl) # 下载页面
    + P# Q& l3 L  _) d& r: U& K5 H+ C
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域
    ( j' P4 z/ {( d2 n! q
  6.     bs = BeautifulSoup(page, parse_only=target)
    & O! X0 d! g# m- Y* m: Z; b+ V2 I
  7.     for tag in bs.find_all(target): # 循环抠出单词
    % t1 U; S/ R  \
  8.         worddefine = getworddefine(tag)
    * v/ w* J0 k7 U: u
复制代码
# x' S, P. g) e8 M) s
) U# U0 \3 D" x3 @$ [0 s& R
IV. 片断索引型网站
* z- D  C# k8 E  h3 Z1 P/ E. ]如:
! O3 Q* ~" y: e9 r! iODE(http://www.oxforddictionaries.com/
6 U( Q! e# U+ f/ ?每查一个单词,右侧边栏有个Nearby words4 x& |. Z' g* t5 p. I8 k
RHD(http://dictionary.reference.com/' h  Z8 t& n  b' K- g, U8 m6 I" X9 E
右侧边栏有Nearby words
* c$ Q  O" \1 ~& |; [CALD(http://dictionary.cambridge.org/
* a5 M9 E* f( r; _0 t/ a/ d在页面的最下面有个Browse栏,给出前后相邻的单词  m( g: Y, Y8 L& X4 W& u3 [
这类网站没有总索引,只好利用它的Nearby栏。
9 I& h$ S' r8 |* U5 l思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,
5 u/ Q8 i' M0 L+ Y每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)
2 Y5 b9 l- a' o, |6 ~) d

  1. , z' O$ v4 ~7 F4 E; R
  2. cur = 'a'
      J+ {, h/ ~% S0 h: Q/ `
  3. end = 'z'
    % Z# Z% Q4 Z3 O3 J# H) h
  4. nexturl = ''.join(['http://somewebsite.com/', cur])
    - M1 Q5 @1 ]: T3 s' @9 V3 s
  5. while cur!=end and nexturl:+ G3 }; n5 Q$ p) D6 U2 G; _8 a
  6.     page = getpage(nexturl) # 下载单词页面5 U( s9 [9 p9 J8 g
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接
      p+ ]6 n# x( b2 i; m
复制代码
! U* i( _0 ^, h1 U" W+ U- u7 L
& \+ F3 a, L( X1 T$ X% M$ Y
V. 完全没有任何索引,那就没法子了
( l# r8 D" D0 J+ \3 H; C当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理9 W, e: }  U3 m6 |8 x' j. d
理论上也是可以的,就是效率差一点;
" A, k- r7 j6 |( A+ a* Q另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。: M( R" n1 i" t$ j/ e1 _  v# ?* o

, }+ s  V0 u4 S- n3、提高下载效率9 a, l/ o# ?0 t/ r; O) i* N# `
I. 多进程
8 l4 ]1 R6 w" S$ b& L上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。
8 H: N2 U1 ?6 D5 W6 q, K  _) v2 g实际抓网站时,这么做效率显然是非常低的。' |  r! d, C2 X* y6 C8 Z( u
假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,
1 O4 b+ v& [  ]2 Q8 ?9 Q有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。
8 d1 W- J: ?2 r& h+ f( V假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?, L% l  g' H) b" U9 O* W
要速战速决,就得开多进程。# r' I! I" R2 L5 Y) m5 E
同样十万个单词,分成25个进程下,也就是28/25=1个多小时。, k. x( {6 r. S# R, v
再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。
, I/ r$ z% G- F' o在Python里开多进程,同样十分简单,8 N# C9 Z  W! }9 ]# k

  1. 7 p" S0 O: @) X) T
  2. from multiprocessing import Pool
    1 w. A6 I- I, b# C
  3. pool = Pool(25) # 开25个进程6 q0 A% f1 h5 c" j: y
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数
    ' Z" O9 y+ [8 |& g& G
复制代码
0 Y! F8 |8 V3 X! B& |2 g* _9 G
这就搞定了。
  f, Q# \  x: c8 u8 D4 p; `- R% J) u/ w% G
对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,' e, g# m- F8 c/ z
关于IV.,事先没有单词总表,就只好采用区间的概念,5 N1 C0 P9 h" J& J3 O. E
比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载
4 a5 F7 M2 A! t: T
. \" b3 e0 w2 ]  M" j1 J初学编程的人,一碰到进程、线程,常常有种畏惧感,! o1 v6 K1 o; o
看到同步锁、共享内存、信号量什么的顿时觉得头大。# e9 A0 i2 [, r" O3 H, E
其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,0 K5 h" F  s$ ]: z
其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。
2 l3 t1 u* y. x, N  X
- t/ M" w( o* I8 V8 T0 D) }II. 断点续传
3 s) k: C6 k* D6 W3 {  x事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。5 a4 f# ~" Y- t% `; Q: Q
所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;
7 r- r8 |& S% {6 \1 E# n$ Q; d6 @即便无法自行恢复,也得容易手工处理,不然可有的烦了。6 y& J- Z# _  S, u3 m1 w# f. {& d
这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,
7 b- W2 q: H8 M+ g+ H5 B6 a9 E" q直到所有区块下完。. E! E6 M2 s4 J" g/ L5 V$ M

  1. ; `7 M) S- y* l7 Z5 d& q) a
  2. def fetch_a_word(part, word, url, data): # 下载一个单词
    $ M( a! G" u0 |8 s* `: R
  3.     word_define, failed = get_a_word_from_website(word, url)5 C/ P* n: w- k$ N
  4.     if failed:  ^& C% b1 b% I6 ]' u3 U3 K9 X
  5.         dump_failed_word(part) # 输出下载失败的单词及网址
    # K6 i* D8 m# [  P0 y8 M
  6.         return False
    * n" G; n& |) P2 ?1 g
  7.     else:1 p( i4 |* O# L
  8.         data.append(word_define) # 保存下载成功的单词数据
    1 ?5 n- T8 J# v% U( h4 `" K
  9.         return True) X' `  x% P7 Z! R9 ?9 b

  10. ; z: x, d$ F4 p1 b. {
  11. def download(part): # 下载一个区块
    ; X, W6 \  h1 S. V
  12.     words = getwordlist(part) # 读取单词总表3 d* l0 q) f1 m
  13.     if hasfailed(part):4 `& C2 [5 U! ~# J5 ?! t0 u5 |
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址
    2 e' d1 h/ i4 y1 p7 o7 Y) d+ b
  15.     else:$ p$ L6 d9 s/ T3 j$ ]1 T
  16.         word, url = words[0] # 首次从头下载! C( M2 i# W+ K4 m# J
  17.     data = [] # 用来存放单词定义
    7 E" z$ _( x" F) U) G
  18.     while not_end(words): # 循环下载6 [5 |9 l" C' f  \: Q* @
  19.         if not fetch_a_word(part, word, url, data):
    8 W! N. U4 D4 X1 `. \
  20.             failed = True
    & C  [- Q/ l- ~$ ~$ a
  21.             break$ j( i* ^" A: h: P: U3 ~
  22.         else:3 a/ h: d: s$ Y% M( g
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址
    , c# |- f; N$ _7 E1 q! Q  @
  24.     if failed:
    7 o0 ~" q3 J/ f* @0 M
  25.         suffix = '.part': S* {2 D& ~; ]4 w
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'
    , w; a  p4 d# j5 n. U# v
  27. 1 a& l0 i* p& \; U1 ]) Q3 o
  28. def isfinished(part) : # 判断某区块是否下载完成
    # O- j" J  i5 Q! O1 n2 n: V8 @0 b
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断+ D3 k! Y9 n' p* }8 r) w% K
  30.         return True4 e; H# U! U3 s/ m5 q
  31.     else:0 B9 |7 P* i) W7 h9 ^% i8 `
  32.         return False
    9 {7 J) U0 D/ f' [1 G+ K/ A
  33. ( ?0 l& f2 M1 J$ B
  34. def downloadloop(): # 循环检测未下完的区块# j% x, t3 Z; a0 @
  35.     finished = 0# f% ~3 _# x! e  P
  36.     while not finished:8 |$ G# ?" q  l
  37.         nf = [] # 没下完的区块
    - F! ~, j6 F1 ~* Z9 [( n% B0 w  K. z
  38.         for part in parts:
    4 O/ [6 A6 x! J/ l- D* n( o
  39.             if not isfinished(part):8 x% E4 D7 A. O9 G  Q
  40.                 nf.append(part): j1 c- z# ^. C7 v( Y
  41.         finished = not nf$ Y4 l5 O  \. E0 F  E! q
  42.         for part in nf:. m0 Q) t# E" x' v% j6 [4 k2 `
  43.             download(part), Z$ F8 M3 u8 v9 Z( Y2 ~- {. B# z2 ~
复制代码
' `  y3 ]8 m! Y
: |6 e. ~9 t% j9 x
III. 高速下载网页的小技巧" p0 V( H5 Y" D. @8 e; I
Python里面有三个库都可以用来下载网页:urllib2、urllib3和requests。7 w& H. O; k4 ]$ E7 S5 s4 _
其中urllib2是Python原生的,urllib3和requests为第三方库。' `, q# w( }; C
(似乎Python3已经把urllib3收编为正规军了)7 {$ j  c% l: w4 p. V8 G4 }
这三个库有什么区别呢?
4 T: A) c: x) j5 R形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。
( J$ \+ \1 y0 r' o( @再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,
$ B8 I0 ?* J, R" S/ }9 c" Z" Z- \" z所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。
! T) R( K& S1 L; {& a  v1 K但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。$ c( o3 O( @2 s3 Y: j
这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,
& L7 V4 r  R0 ^" c! o通吃一切网站。
6 \) l( P; e# y所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。+ W- c3 e  M1 W$ X1 e/ g# S
这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:( s0 I4 L& I2 {9 S
http://urllib3.readthedocs.org/en/latest/
3 I8 D5 z, ~; Uhttp://docs.python-requests.org/en/latest/
: R4 }6 ^8 }1 a  a7 N" K

  1. - K9 S" {' h* T& ]6 R
  2. #urllib2
    9 Q+ T) G, N7 E! B' i
  3. import urllib20 B6 Q# p# X1 b3 A3 b
  4. def getpage(url):
    4 C6 ^+ x" F0 p3 ]3 J) S1 a; f+ N
  5.     req = urllib2.Request(url)
    . F  J1 @7 I! ~5 D5 n1 |. v
  6.     response = urllib2.urlopen(req); m0 u5 q/ j& b% B& d0 @- [
  7.     page = response.read()- g6 H6 w0 @9 L1 O6 n
  8. " C; t! l, b8 j+ l  s
  9. #urllib36 s1 @& B! Y4 U" w# h- n6 j
  10. from urllib3 import PoolManager; i) M1 P6 W0 D/ [* A( |1 i
  11. http = PoolManager()( _; a' D1 v/ V/ o  s. L
  12. def getpage(http, url):
    6 L0 `! Q7 [* n* N) X
  13.     r = http.request('GET', url)
    : `7 `* z3 h/ a) `/ k
  14.     if r.status == 200:
    2 X/ ^# ~4 n" D$ y( n8 U
  15.         return r.data
    + S4 \5 {+ K& v3 u: e1 b# z7 V
  16.     else:# |3 J8 y- ]6 y1 z
  17.         return None
    ( U. d+ h. {7 M. V
  18. ; ?- h' e. S! k, n- v
  19. #requests
    0 ?0 l" a; A3 d0 m0 G: Q
  20. import requests
    1 y' j- w6 H) v* J; f6 X7 o
  21. session = requests.Session()$ |! H" ^6 S( e2 F
  22. def getpage(session, url):# B: c7 }: F$ i! s6 N( |# F
  23.     r = session.get(url, timeout=10)7 X% p% @% z% o- o* f
  24.     if r.status == 200:; O7 h* @% M# O9 h
  25.         return r.content
    ) K5 S* ~: i8 [1 @* u
  26.     else:/ f$ u* I7 _+ J% R" K( E
  27.         return None- n1 o$ T, t7 L% {! T& Y
复制代码
8 D5 M3 t- t/ n
四、后期制作* ~0 [% b; |1 Q$ z- L- I
1、文本处理,是个特征识别问题。
9 G9 m: A, Q% P% g# I6 V% z3 e本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。
- Q0 Q+ x4 P! g当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)
4 J) d1 F3 W6 H4 x$ T% k都涉及到特征识别问题。
) I4 X& i: t' v( K: N( k相比这些高难度动作,文本处理算是比较简单、基础。
5 @4 ?1 w9 L! U! iPython里常用的文本处理技术:正则表达式、BeatifulSoup、lxml7 X: u6 k  G# Z2 w. F
正则表达式非常强大,但没法处理递归嵌套的标签型数据
& K: |5 q+ Z  U+ F- e. |3 A(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);
5 F7 F3 ?3 K& @/ {) U! S5 W2 oBeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。3 R0 Q7 a1 {0 ^$ A" f- t
所以常常要结合使用。, z# w5 d$ P/ ^9 `4 c! ], U8 ~
这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。! l& g/ n- t& m+ n: R: Y$ {
4 H9 R8 d& o" y
2、排版6 e' d3 R: Y1 k7 A, z5 t
HTML、CSS的基础知识:
" F$ g$ |8 Z- Y( h& Ghttp://www.w3school.com.cn/html/index.asp7 i: ^9 T/ w" d" |, q
http://www.w3school.com.cn/css/index.asp' A5 j1 A, |+ e6 ^4 r5 L4 X
http://www.w3school.com.cn/css3/index.asp1 z6 @& A5 h3 @$ g/ r* [2 P
非常系统、非常全面。
/ a; g8 S" f6 r+ k排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。# V3 \0 |  g% M* h) C, A

& `; C8 x! G# j# i9 c五、结语
, L3 t, Z0 v; D' a# _  t8 }6 j花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。
6 J1 K4 q: E) x: v- Y$ M所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——) c$ \1 Q: s5 p8 d5 E( i5 |
大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。
1 H0 L  V& [. p' N; g
% W: A5 K! ^( p打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。
3 o( a4 O* _8 r5 M0 o
5 \, _( C" `" I8 `1 v0 e只是拜托不要打扰别人,真想要就自己动手。3 I+ I; f  p& h( B1 D# G0 ~& n
尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。1 t2 T- O0 m, |3 _$ y5 A
水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。/ p* Y: ~1 w- k0 r4 e
虽然每个人都觉得自己至高无上,应当受到别人重视,
1 M$ X9 o0 s* ~2 Z# Q2 n% h( Q其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰
/ J' I  I( W( f( A5 i8 O0 }6 \( g1 l$ Z

( B, `0 V( f5 s; u========7 o' c2 Q; g/ ^% D' E
六、拾遗
4 D% f# z; u# t( L7 I关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类/ e! o. F1 L3 |. R& m
确实如此
8 h7 E, j" {5 b4 o1 i- `不过这里只是举例而已,不用太较真啦
+ D3 ?) _" d" o2 Y' a实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏/ J3 e( t2 X5 ]4 R. b
这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。
- B' B2 [( }4 n$ b( F2 h% ^即,
, Z0 z# B# J4 H3 G/ Q第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)
  Y. o8 E4 s# c- W/ e第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)
* @2 Z# k* N6 y3 h+ c+ r第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作) Z5 Z8 t% [8 R' O
。。。
8 n. g+ s8 ?7 k: Z; S* l直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空)
1 H; k  g* d) [4 V" `. ~0 O最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。' @$ Y" }2 ]0 U7 H
形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。
; ]) M) Y4 u5 C因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。0 h: g, \" m# n$ r* i# r

评分

4

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:41
* X* S  N4 K5 K; z0 ~8 ?感谢楼主分享知识和经验。
- t4 {5 P; ?6 K  ^6 \
  N+ T8 w7 B, H& Q8 u% k; Y9 Y每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...

- ~9 g4 p/ P0 C9 Y3 k5 t1 \现有的mdx词典,其实足够绝大多数人用一辈子的了/ N9 F8 d9 k7 I2 V
: H9 m/ ^8 n( ]1 V
本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。! I) k4 k2 u% H8 l
0 r/ Y/ w3 V1 F' m4 X
本人最常用的词典:; Q) g$ o6 _, y  A: o8 L, {" s
主力阵容:VOC、ODE、WBD。# Y+ X- x' T# _- X
三本都是中型词典,收词量均在14w上下,以本人目前的阅读面来看,还未遇到这三本里面查不到的单词、未收录的义项。据说史上掌握单词量最大的人是政治家兼散文家丘吉尔,也没超过14w。除非钻故纸堆,恐怕用到W3、SOED的机会不多。1 O9 }  {5 K5 Y( C/ r* r- ]

/ Y& L" n% n0 c& I1 x替补阵容:LDOCE、词源、短语8in1、韦小黄&韦小绿、Garner Usage。
5 d6 ?( C& `. t# k0 o  SLDOCE用来查常用词的惯用法/搭配、语法信息;
0 ?( E6 ?; S1 F9 o词源用来辅助理解、记忆单词;
& D+ L6 `) {' H, Q+ O2 s3 G7 l, D4 P2 \' o短语8in1用来查漏网的惯用搭配、非正规用法;
7 B+ J! r& ?/ c+ K. n韦小黄/Garner Usage用来辨析/比较同义反义、正误用法;
/ K8 ]# c! Z, E( ~8 a! p$ o+ |  v韦小绿用来辅助理解、记忆大词。小绿真是本好词典,有人说里面收的单词都是一辈子才能见一次的那种,其实不然。它虽然只收了1400多词,却几乎都是高频的大词。从本人的使用体验看,查得率相当高。比如最近看新闻说一种超大蜘蛛,里面有个词arachnid。别的词典只是干巴巴地说4对脚的生物之类的,只有韦小绿说了它的来源:从前有个女孩叫Arachne,编织技艺了得,把雅典娜女神给比下去了,结果激怒了女神,被她变成蜘蛛,终身织网。这种解释多有意思,看了永远忘不了。
- O2 _/ R) U3 q0 u% ]' J/ {
8 C( _% l0 z6 }4 ~& b; G上述词典,坛子里都有,无非是版本新一点旧一点。比如朗文5和朗文6,有人统计95%以上的内容都是一样的。如果是完美性格,非要用最新版,那就只有自己动手。不会有人在词典出版的第一年就去挑战版权方的。+ P4 C1 H1 A0 o# }
“对于好学生,任何教育资源都应该是免费的”。虽然本人同意这种说法,也认为现行的版权制度存在重大问题——有人靠垄断知识获利,却完全合法;但是本人从未打算挑衅版权方,更未想过做Aaron Swartz那样的斗士。靠垄断知识获利是有点无耻,但如果没有利润,也就不会有人去做整理资料的事,这确实是个难题。5 b! R- s3 u) Q

. C+ B9 P6 R- E' \还有些人没事喜欢收藏词典,收集了一大堆,却从来不用。说到词典收藏癖,想起以前的一位室友,那家伙每天最大的兴趣就是下载影片刻光盘,大概刻了几百张,还在不停地刻。但是从没见他看过,他也不让别人看。5 n! I! o! [4 j9 ~
这种癖好大概是来自于原始社会的一种遗传,人们总觉得应该储备点东西,说不定未来某一天就会用到。其实那一天说不定永远也不会到来,不如就把今天当作那一天好了。有多少人买了一书柜的书,到死的那一天都没看完,甚至有些书连封皮都没揭开过。
! X* C0 x( s- H& G* n

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。& u+ l) V$ o+ d7 O- j9 `$ J
其实只是你没有发现而已。
0 H8 l2 A5 J& @5 Z! D4 ~5 h7 iODE: http://www.oxforddictionaries.com/browse/english/' d' I$ D, n" s0 l/ a
RHD:http://dictionary.reference.com/list/a/. x$ P, u* K, v. w9 g
CALD:http://dictionary.cambridge.org/browse/learner-english/
1 [- T/ \0 z2 J2 Z
& N3 ^( B. b5 V+ `/ p4 d. B如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。
' ]; o5 _, |- V( e- h以第二个为例:4 t! }4 C. s' ]9 }
inurl:browse | inurl:list site:dictionary.reference.com* R/ j% L2 D1 y# U1 Z5 R

: ^5 Y/ t4 o/ W8 I# O) H4 i6 pPS:最近才发现这里,发现资料很多啊。
; O& |! s3 d" R

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧
: Q. {6 C0 }2 h, v( h* ?
8 H$ R, b( T; N* L假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改
2 [1 u5 D+ c9 \3 V; }或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下
' X: v/ f- ^$ r; J6 z结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。; Y  v$ A; \1 i4 c/ c" I
这里有个比较省时省力的小技巧,可以快速定位到想找的地方
; b' C8 g& l/ u. {
+ @, I* [! [7 C- l" L, ^1、Goldendict里,在想修改的地方点右键,有个“审查元素”:, k7 b% J; P6 _" }# W
5 F) t( h6 I; o5 t% _# Z

" ], x- Q; \- l( x2 S8 y. l! l2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事
3 O* v1 `  Y$ k6 r. H
7 A3 q6 [# @9 J+ n0 Q; H" M$ D: {8 ?  q# [& p
3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方
) T1 _8 D- ~- }/ V8 y0 M5 E! M; _/ ^, k
6 u$ v* R) f0 M  i
收工

该用户从未签到

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

/ ]9 @, b' k0 l5 o5 D4 T/ [, |, P
: _, z, F+ k0 \3 o% k% c 9 u) u( N+ E2 {/ b( U

. t7 U8 a& U. @; {6 s感谢楼主分享知识和经验。) c/ Q" ?- I5 z. O. I) n3 o9 S

# V$ ?+ g1 A) o2 H; i3 L8 C每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。
8 Z& e) X# I% f- c) S- |
, K; _5 C' S2 Q, Q2 m私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。; t; U3 G7 n+ \( M* D

& K' W# E$ ?9 w* K: A& l但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。
0 x7 c- x9 S" Q3 M6 z. S5 x! s) v
除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。
1 s5 l( E8 `. y" ?% r6 ~
' `8 \% N7 O; |4 {8 }0 c3 z* B% W+ P
3 G$ e4 }  Q1 i1 Q
7 R5 Y, u& J5 c3 K) k7 y" Q$ A
. H  ~8 e- d& ^0 y( x( y: f% E' I

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件
' ^/ N( F% x) @6 t8 f0 k3 J! \
  • EmEditor
  • Beyond compare( i0 I9 U8 p7 [: K
; J- F* o+ |" A( ]3 I$ o1 d
$ N7 o, T+ n5 O+ }
前者用于编辑,后者用于差分比较- V' |2 _0 ^8 f2 A, Q2 ~
处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

发表于 2016-6-8 07:41:03 | 显示全部楼层
bt4baidu 发表于 2014-10-25 21:01
& f3 Y0 v3 q( c现有的mdx词典,其实足够绝大多数人用一辈子的了. h* _; H; f& O! [

6 I7 M+ v4 q; m  `本人前段时间制作、收集了不少,经过一段时间的比较 ...

7 D. ~' O, V& z. L1 e1 l5 f肺腑之言。

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考
! H$ r, v8 _( e' _* G/ ?, H* R3 f2 C3 E- W5 J
网页设计中最常用的字体有哪些?(中文和英文)
$ a" x. h) }+ k% vhttp://www.zhihu.com/question/19680724
  ?6 ~$ a" l* M8 f& ]( l3 @. }: A7 ?3 g; `$ }$ ]5 A
本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode% a2 E: \+ N) w$ k) b
这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全2 L9 z/ C% }1 H& M. U
另外Open Sans字体也挺漂亮
3 g# ?1 T, {! U& z
  • 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
    4 v& b0 J2 o0 ^2 g) ?最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...

    ; _! t4 P1 A$ a2 ^感觉找到适合自己的问题好少啊. ~! N6 {: ^3 y( @; N
    这个适合的话感觉是兴趣和难度
    , u" U4 E; n( L1 p1 _. O想请教一下楼主是怎么处理这些问题的呢8 o  y$ Y' L7 ?& g: 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 编辑 , c4 T7 p  g. o" V+ B' D9 ^/ b
    ' e. I+ x' t* x
    写得很好。刚看前几行的时候,的确激动了一下子。虽然没怎么懂,但是第一次能坚持把这样的东西看完,觉得也是对自我的一次超越。谢谢!

    该用户从未签到

    发表于 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 编辑
    4 @+ o+ D& x6 b2 [3 [  N& e6 J/ }" G( n2 K1 m
    java和.net就是个垃圾,我懒得提而已
    ) t# _# t' \2 ~, ]9 ~/ I. K. |2 j9 U在Linus这样的大神眼里,连C++都是垃圾:8 u0 c, W! ?& `) m* ^8 e
    http://www.csdn.net/article/a/2010-06-12/218785
    + d) p& |) e9 j, w3 i' R# ~0 n* }. N$ b5 n, C+ g+ o, ?! v0 T
    如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。
    - x5 v* W; L. d3 U& x6 s* j4 `7 P! `, Q# G1 Y2 l* f' x8 W) G7 A2 {( d
    不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。- \5 O* V* |. D* B  ~0 J) v
    我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。. U0 K# r  ^8 |( {; j' M
    这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。
    7 Y* h% r, E! r) m3 B" L不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。
    ) k; R$ t1 J" A: b8 W为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?
    ) ]8 y% y# z* K" c8 \! m因为垃圾代码太多了。) i4 x) I7 ^6 g) W3 b
    : G+ `4 |3 G& F4 c, d

    - N1 D1 Z  v' r. L

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑 ' e+ t3 @7 p$ b
    ( P' q! }& t/ M! \
    2 R/ X4 @/ B( H  k' d% ]
    算了,道不同不相为交流
    5 w6 }# R$ U. u/ F% _$ `" ~想起某个梗
    , g7 y; k  y3 @  z7 q+ f& [9 J' d程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!( x8 r, S& Z3 _- Q; [1 E! i
    $ X7 s. c8 G! o: B2 y+ `4 h/ d
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。! i7 X$ f, v; V+ C' b+ A
    " u9 ~6 l3 z+ T' u; a) p- r& v8 K
    另外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
    % j6 q; k4 j( P! a! K2 ^算了,道不同不相为交流
    ) H$ b& p! L& w; G( [0 k% Q; g想起某个梗+ {6 {0 @: H4 Y/ {2 F0 \
    程序员眼中的编程语言
    / Q7 b5 P' x! |2 N  m& B
    不同的语言适用于不同的人群:
    8 D9 @  j+ }' P: L如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。; h$ @. r! v6 p
    如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。
    ( n( O/ j+ v% c& R9 y至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。
    : n1 G2 C3 M% H+ p/ }: a& [9 m$ R8 C
    编程语言的口水仗永远也打不完,不争了
    0 H  y# ^3 t, d+ r3 A8 W2 r# h

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:35
    " }# f% q+ G3 e6 N- [' L, b/ Q& c不赞成多线程抓网站,但是好贴子要支持!
    3 I. P" i" E' [% X% S
    6 L, X; g$ L  h3 w/ _* _自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...

    ) s) m2 j% O: C7 E8 v下载软件?推荐一款?& b2 {- b. i3 I1 W
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;* p& Z6 L! G9 v  `8 V
    现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?
    / Z7 I( d& P  e, |) p0 B' j比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。; s3 M1 p' j) O% n( I
    除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。
    / K; g: K& C% X: {/ G目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。  J* Y! _7 L! a* T) I( c; v

    $ t; O$ |* B6 m2 Z1 f/ N; l2 E至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。* [+ D" D- O' K2 N
    对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,! X' G, D5 R  r8 w
    目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。
    $ {( l8 l' F4 O0 X% U' ~3 }* T6 R

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:
    ; E0 e% M9 s0 r随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。# B5 ^! t6 p- N
    未来会出现一个新的行业:私人计算机管家。
    2 M% Z7 m( |3 z专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。
    * ^, {# Z( l# V; [' w但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:29
    / f. @3 {, M+ {' }; S' O下载软件?推荐一款?
    3 \; V& L3 e2 w8 t1 L8 N  b9 B最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    ) O6 A, f8 V. [5 y现在99.999% ...
    ) B* U! F0 ]; C, h4 c+ _
    用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。! w4 |8 W! V3 @9 J$ j
    # I  I+ E# m& \, r/ l8 o
    十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。/ w6 G1 |* y6 \- R# ~+ o' R: g! e7 [
    & F3 }, S0 H  X+ [/ V
    用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。2 E- `" b1 D( f; M- F, Y9 g
    ( o  g: b$ \. s
    我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
    大熊部落 发表于 2014-10-21 16:18
    # |* j8 o7 e( Z8 d7 Y用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...
    ( P" F. _/ |( U/ ~
    我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件4 v2 ]7 B$ D, X6 K9 H! m# ?# ?# |
    ( \2 F6 r7 g  l( _, _2 i- z
    下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。

    6 R! R# m8 O, j推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

    该用户从未签到

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

    5 V) f0 `* C* i: n
    1 W" o- Y( q* u  H7 W- h# i! {8 k最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差
    # i3 P# X/ [& b: ], Q计算机是用会的,不是学会的;
    ( s0 w, Y+ g% u0 ^$ e. ~* [程序是调试出来的,不是写出来的
      I' C1 V) y2 Y5 v& t9 @  {* R3 x0 ?" n7 i. P+ e
    既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。
    / s6 m$ x, }/ Y; q你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

    该用户从未签到

    发表于 2014-10-22 21:25:59 | 显示全部楼层
    bt4baidu 发表于 2014-10-22 20:21! q: M9 j3 |' G
    最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...
    7 a/ n- l0 Z: A$ a
    多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。* V( P8 v9 D4 Z" y" u( g% P+ n8 q

    % z# E/ V7 v6 _/ y我的一点网络小技术是很久以前在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-25 15:58 , Processed in 0.099040 second(s), 12 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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