掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 32262|回复: 139

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

[复制链接]

该用户从未签到

发表于 2014-10-19 15:25:55 | 显示全部楼层 |阅读模式
本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑 9 V. ?" p1 {; {$ R2 a* C) q

4 [) A9 ^1 l9 r* K这篇文章主要是给计算机小白和初学者扫盲。
$ x1 |* j8 c( Z$ q: A本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。5 v# w: e9 W; Z+ l
只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。
' I; J% M1 ~6 b: X4 w$ M
' ?3 E" I  _& h: |! E! E一、计算机的两个终极哲学问题: x9 c0 H/ L! Y$ F# _
1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。
! w- `+ {. d1 i! w9 K7 C0 T图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:
) t: v: e  u' e( M设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;
) u5 o* H3 e0 e: k. }# a机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。
: I9 _/ J+ s9 h& `  y3 R( N方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。( q  K& Z2 U9 O) B- |( u: q
“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。) }* ^4 `9 i* k9 e# e

  b0 t6 O  N+ B. g那么要写出程序,立即就会发现不得不解决两个问题:
! d; m1 |; {3 m4 g1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址: X: h+ E& Y" t: F7 i
2、怎么把两种方格区分开?也就是特征识别
% X+ M: r) P% w& y3 s7 N: m这两个问题,就是计算机的终极哲学问题。0 I! f/ s4 V- L! G/ H, k9 G
理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。% K' s  r$ g3 D- j
下面的讲解也会以这两个问题为核心展开。! T1 i9 x. i, }8 p, U5 |& E

( l+ x5 }  b) [! N+ fBTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,
( u4 S0 Y% _$ A$ L——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。
- D1 m/ `( L1 a0 n: g" A所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。7 q! C7 \- D4 Y* s0 S2 s; P% [
前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,
# |1 W4 ^  A8 R3 |+ ]- F* t而优秀的程序员则会担心数据结构和它们之间的关系。”
——Linus曰。  F2 M6 Y8 b/ p( ^" P; w: j$ \
具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。  B- _8 N+ o: K- c

3 ~4 f  Z. n  v  z: T. s不要觉得自己上学时学的不是这个,or文科生,就不行。
5 p5 V" {3 M) Z* \0 @( f江民杀毒软件大家想必都听说过。
6 c$ Z$ T  U' w2 R; a9 k创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。1 i% i+ O' A& s3 J+ y7 ^; R3 Z7 ]
咱不奢望成为专家,写写程序总还是可以的吧?3 M" `) _0 v% g
9 s& G2 ~% V/ s5 V5 L
二、采用何种编程语言( L" p0 j& F( T$ a. B4 U, c6 b$ ~
上面已经说过,存放、读取、组织、区分数据是编程的核心问题。' o* w, s7 Z0 n; }) y5 o
显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。
5 `, z/ F" `% t$ O% o8 K抓网站,恐怕没有哪种语言比Python更方便。& z- n3 K/ n0 |: v1 ~- L! @0 T
当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,
% h; J  `$ v5 V! n  Y9 }计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,) A, S" n9 C, c! X; l; ^1 _/ U
没有慧根就别吃这碗饭。$ S4 q2 P, F+ p) V

& p  p" l8 S$ u+ W+ w三、网站抓取技术" R. `; g$ t- B5 Q
1、下载某一个网页,提取其内容9 n' y9 c$ n- e7 n* r9 _& p
以前写过一篇,就不重复了。参考:
. _7 U% T2 G0 B  e1 u, E2 r用一个简单的例子讲讲怎样从网站上扒数据$ z9 X& [4 w( F# r2 p( R0 l

. y1 V6 e2 Q: D8 z& J: v; G% O% U2、寻址问题
7 T! T+ K1 {( Y2 _下载网页,自然首先要知道网址,也就是东西放在哪儿。5 Q' g6 \+ z: U: B# t! v- }
如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。6 Z8 `* D' C% l9 `8 Z
但是大部分在线词典,到底收了多少单词,事先是完全不知道的,7 g2 z! y, d! Q/ x: x3 Z9 Y
要把单词弄全,就要想办法得到每个单词的网址。: n% N2 X/ D# h. f( n' X" p
总结各主流词典网站,大概可以分为这么几类:
3 E0 L7 b/ {9 C; B, e. M5 JI. 事先有单词总表
0 w4 F( v# _3 v5 L比如http://www.vocabulary.com就是这种类型。" \1 a0 F+ ^' Y6 ~6 F& C1 \4 ?5 n2 {) ^
它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。  }$ N, e! Q1 w6 E$ r
! i/ `" a* M/ I" t0 I
II. 网站有索引页面
: u" Q  X) X3 i" C5 ]2 [6 ~: J6 @5 t如:  `5 {, F* V% o$ e; Q" p/ O& P
OALD(http://www.oxfordlearnersdictionaries.com/- A0 P  Y! P8 A, I9 V& ?
它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/- P# y2 s6 i) N' m) E3 _; q
LDOCE(http://global.longmandictionaries.com/
8 D) _' [4 M% y4 d% q采用框架结构,左侧边栏就是索引页( S, C* r1 x8 E4 p) r9 H
MWC(http://www.merriam-webster.com
# T, {" i% b0 E. v/ J% y% I! O' y索引页在 http://www.merriam-webster.com/browse/dictionary/
0 t) a* D2 n" b3 t$ k! d0 k/ j等等- @( ^9 x3 p5 w/ p2 E  i* x  J
这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。  J  ?" @$ S8 e( L

  1. - M9 r: n7 `& g; q
  2. urls = []) F- z. {/ p; _# |* B3 e
  3. for someindex in indexs: # 循环所有索引页
    . u# }. n7 \, R# L
  4.     browseurl = ''.join(['http://somewebsite.com/', someindex])
      S6 L7 x% P4 _! s3 G) q* l
  5.     browsepage = getpage(browseurl) # 下载索引页面
    ) J; j) B* I# L0 B- {- D
  6.     target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域
    - k; Q, k# `3 w: I2 M; T. U2 R$ Q
  7.     bs = BeautifulSoup(browsepage, parse_only=target)( [- w  S% C. ^
  8.     if bs:4 ^# b/ n% ]; h7 r. y' P7 C
  9.         for a in bs.find_all('a'):
    ) X; }6 \* D- ^
  10.             urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接1 O. T2 Z+ i6 m4 _% r+ X; y% R
  11. 然后:
    4 n$ \& x) P$ G" k0 x% P
  12. for url in urls: # 循环所有单词
    % C# t9 x/ |( V1 u, {
  13.     wordpage = getpage(url) # 下载单词页面3 M+ y$ e) r1 l1 H5 u
复制代码
3 o  X# ?+ x, V

( I7 b( u  s( q* F- t6 L6 sIII. 索引页和单词释义一体型网站
$ x, \" ]( ?( f) C) m# s如:Online Etymology(http://www.etymonline.com/
' P% p0 t7 H: ^+ m7 C和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可6 U9 k# F; Q+ n4 R$ z
  1. + r" z8 @3 }" l1 `; S" R
  2. for someindex in indexs: # 循环所有索引页
    , b# Y# J( a$ }0 g" @
  3.     browseurl = ''.join(['http://somewebsite.com/', someindex])7 C" n2 b/ q1 {2 m
  4.     page = getpage(browseurl) # 下载页面
    # F: P' t6 X2 U. K7 L
  5.     target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域
    ! E5 {& H( i, O4 Q8 O: X, x* _  `9 e( h
  6.     bs = BeautifulSoup(page, parse_only=target)2 P# L( b/ c! T# ~% y2 d
  7.     for tag in bs.find_all(target): # 循环抠出单词* S0 s" O4 a' N  t/ Y+ E" h8 J
  8.         worddefine = getworddefine(tag)0 z) N% n# p* A0 v' l/ F) `, c
复制代码

; [6 d" `4 Z7 J$ c1 k- O! V$ h7 I
IV. 片断索引型网站
5 l! K0 |/ S/ x; V$ G& U: ^如:
& S6 E) D; J1 u2 @- {ODE(http://www.oxforddictionaries.com/5 a6 X# Y; m) f# U; E& k; ]
每查一个单词,右侧边栏有个Nearby words
9 K' Q9 E3 U5 h8 l, u" I! }RHD(http://dictionary.reference.com/
, W* N+ X' k% D" T4 T右侧边栏有Nearby words1 ]( v( w( m: x0 D, l
CALD(http://dictionary.cambridge.org/
4 W3 W/ t; A" \! E在页面的最下面有个Browse栏,给出前后相邻的单词' N$ W2 r. n3 h/ B4 R2 F5 y
这类网站没有总索引,只好利用它的Nearby栏。
: j# O( o& [5 W0 }; ~思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,5 }2 A+ }( ]! @+ h# O
每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)
0 ?9 S2 I$ B: {. ^& s  _

  1. - U0 D0 j( f: }. t
  2. cur = 'a'! T0 z. |6 [/ N0 {
  3. end = 'z'8 Y; E8 u; _7 b4 l+ f
  4. nexturl = ''.join(['http://somewebsite.com/', cur])
    0 y" _$ h& K, o, h- d
  5. while cur!=end and nexturl:
    0 W( D9 {# @0 z, O& `
  6.     page = getpage(nexturl) # 下载单词页面
    8 t# I# T4 F! p* z# C/ L
  7.     worddefine, cur, nexturl = getword(page)  # 得到本单词释义、下一个单词及其链接- ~2 l/ |! [, @- F* u& |$ o& R0 @
复制代码
" A1 l$ l  z: {6 T2 a! H
3 z2 o: k! R) N1 c# a
V. 完全没有任何索引,那就没法子了
6 o6 t+ E0 s3 M3 N" x) t当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理& _# e8 N$ g: l. m/ Z# q
理论上也是可以的,就是效率差一点;: {/ y' k/ ]6 y$ l2 G
另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。5 ~4 [. W3 k2 L, q5 Z, q
0 \6 v, ?+ r5 B7 e
3、提高下载效率
3 }+ H; g0 t) K3 P" AI. 多进程
: f/ X. N, n+ v1 u* ~0 R上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。
* [; Q$ A  h  o$ t实际抓网站时,这么做效率显然是非常低的。
) A; s: s7 ]& `假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,
* Y' ]" t. z- a/ e9 L有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。
; |/ F6 x$ Q* c* O9 X1 N, b  S9 l, i假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?5 j5 Y  c# f$ g* t$ k
要速战速决,就得开多进程。
5 T8 ~8 D, m5 }0 X( ~同样十万个单词,分成25个进程下,也就是28/25=1个多小时。" L8 H+ t" M  y8 ?( j
再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。
% `: m# l. c: D% ~在Python里开多进程,同样十分简单,5 D& E2 p8 q6 O. V3 Y& E
  1. " s5 Z0 h4 N% }4 G" C1 r: g8 N
  2. from multiprocessing import Pool" c  ?0 v' F& X* q
  3. pool = Pool(25) # 开25个进程
    . P% b+ N& M: V6 L) V
  4. pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数
    3 c0 l2 W& W; h+ m
复制代码

7 F0 `) N/ Y5 a) t; K( ?这就搞定了。( ^2 t- M  C: Q$ L" `

9 [) {! P  F3 ]4 `, t对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,; E  x5 u& v* P) X' C+ \* b
关于IV.,事先没有单词总表,就只好采用区间的概念,
9 t' S; ^( x! Q+ @比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载( Y* j* K* W. ~8 {7 O
$ X- i6 f, Y! x0 X0 r$ V$ M
初学编程的人,一碰到进程、线程,常常有种畏惧感,$ \' E0 e1 ~8 a) O# K4 b9 q
看到同步锁、共享内存、信号量什么的顿时觉得头大。
( H1 @4 A/ h( C, Q, l其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,
, A" a+ U- w2 d  N4 s其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。7 b- U9 y, d4 t2 ~

, c+ f( a; e( z7 R3 C) ]4 {- H  {( XII. 断点续传
( s7 c! p& {9 S5 P& x% c5 G事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。9 ^9 _7 n2 O$ a) u/ u! o( |
所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;* G- K9 e" ^4 y5 Z( J
即便无法自行恢复,也得容易手工处理,不然可有的烦了。
9 F$ P! W8 f7 ?$ v这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,! p. N) c" T; J6 A# b3 w7 S* D/ U
直到所有区块下完。
, {% O- t; ]) j2 U

  1.   ~$ F! i4 M$ \. h  N- q4 S
  2. def fetch_a_word(part, word, url, data): # 下载一个单词0 |* ~2 R  o) ~
  3.     word_define, failed = get_a_word_from_website(word, url)+ M* k3 Y$ D- |# y# W7 I6 s% R9 z
  4.     if failed:4 C7 r4 }0 `# ]: p) E# e0 L
  5.         dump_failed_word(part) # 输出下载失败的单词及网址
    + k- A  n; ?: a
  6.         return False
    % C" G* H  B; h; M0 A/ M' t* |
  7.     else:+ a3 m# q" R, F3 a
  8.         data.append(word_define) # 保存下载成功的单词数据1 q& N7 b; k# v, D
  9.         return True
    ' Y" s5 H) W2 F" o
  10. : b4 m1 v5 ?  j8 N9 X" O8 ^
  11. def download(part): # 下载一个区块2 m) P* m' c/ B: x  o' l+ ~3 b
  12.     words = getwordlist(part) # 读取单词总表
    5 g% R! P4 y- V4 O$ t
  13.     if hasfailed(part):9 q# R2 u* N6 i% K1 ^+ h
  14.         word, url = read_failed_word(part) # 读取前次下载失败的单词及网址9 Y) ]  n8 C( X8 E; R: J
  15.     else:
    $ Q& K& U  g- A) ^- ]0 [, ?
  16.         word, url = words[0] # 首次从头下载, z/ F' X3 X. ?5 o# t* [
  17.     data = [] # 用来存放单词定义
    & s. r: F! Q% M
  18.     while not_end(words): # 循环下载
    % Q7 Q8 Q7 h: r- C- O# p
  19.         if not fetch_a_word(part, word, url, data):
    8 U: D" B, `6 E; y0 K
  20.             failed = True9 Z- f; u  x; H! e4 W$ f
  21.             break. j  E$ |% P+ k
  22.         else:! l0 {# z4 j0 P( A/ t6 C
  23.             word, url = get_next_word(words) # 准备下一个单词及其网址
    8 |: y# @7 o9 S  w+ |
  24.     if failed:3 t8 g* \: g5 ?3 R
  25.         suffix = '.part'
    - K; w' ^/ N2 `. h+ k( C  @
  26.     dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'2 \8 i# U3 D8 b9 b' ^

  27. 2 L  _" \4 J, A: O6 M
  28. def isfinished(part) : # 判断某区块是否下载完成6 U0 V5 A2 h& t0 P5 D
  29.     if is_data_file_exists(''.join([path, part])): # 通过检查数据文件有没有生成来判断1 A8 e7 ?( L# z6 I7 W
  30.         return True& W0 p" v" B9 j! o
  31.     else:- i8 m' J1 l. V3 v: k) d" ]+ {  q
  32.         return False4 b( ^1 ?$ p7 w4 _- l

  33. . `9 B: n  u& c. j
  34. def downloadloop(): # 循环检测未下完的区块7 O- e" h5 h; L: ^! A+ A# _8 t, P
  35.     finished = 0  |' G5 }0 r7 J! k
  36.     while not finished:4 u+ |! ^3 K) Q( M5 t' [
  37.         nf = [] # 没下完的区块+ N  t; C: O. j# R( i
  38.         for part in parts:. ^3 i/ Z2 s1 r# }5 ^
  39.             if not isfinished(part):& h0 m* }9 y: m* J; e
  40.                 nf.append(part)
    ( t! D+ U+ ~/ Y  O; @( r; F5 Y0 u
  41.         finished = not nf* X( ?' ^; B, \# t
  42.         for part in nf:
    4 G5 w9 Q* @+ t: m# m
  43.             download(part)
    % y! D) S+ [" i+ n- [
复制代码
# D; u" M% C6 W9 `3 Z1 ?
6 t. t( O. Z1 S. v3 o
III. 高速下载网页的小技巧
% Q8 D& |# k8 j( u6 i0 HPython里面有三个库都可以用来下载网页:urllib2、urllib3和requests。
+ u" d5 G9 q! z5 e其中urllib2是Python原生的,urllib3和requests为第三方库。3 Q& d( P. L$ p
(似乎Python3已经把urllib3收编为正规军了)+ y1 u* C, V. f: B- p
这三个库有什么区别呢?) W0 o/ r7 [7 K4 \
形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。
- O$ E; o- i6 c/ w5 K再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,' e% y  u+ y  D8 X8 @
所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。7 l& T* ?0 Q, R/ `; O
但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。- @$ ^! z1 m1 A+ {  P
这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,- I/ Z6 k8 B% n) f- O$ R- A% O
通吃一切网站。1 T( n9 X, V2 R' n
所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。
  L: t$ W/ C. s& y* Y" k$ K这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:
1 h) o! z$ b& t6 C: Qhttp://urllib3.readthedocs.org/en/latest/
. ~; w; V2 _$ r, T* {. Y% rhttp://docs.python-requests.org/en/latest/
+ P7 K2 Z  d2 J2 g
  1. 6 O% z1 R# f& O1 F  _
  2. #urllib2& Z8 n- \" q8 \: h1 z
  3. import urllib2' f3 s) a. H+ ^8 j' R
  4. def getpage(url):8 |8 S5 a9 X+ |6 P4 N9 @
  5.     req = urllib2.Request(url)
    2 h6 {, E$ r# m1 G' |+ X5 s! ~9 H
  6.     response = urllib2.urlopen(req)- D9 o( I$ a5 W% w: w3 s
  7.     page = response.read()4 U% A. K* e* \: B4 E& M
  8. " h5 w) Q1 @% g5 K$ ~# V
  9. #urllib3/ r/ H" W& x: C6 z
  10. from urllib3 import PoolManager
    5 f3 W/ P( n' x" s& T
  11. http = PoolManager()( c6 e' }$ A8 h" K% P
  12. def getpage(http, url):4 V  `4 j3 t; y
  13.     r = http.request('GET', url)* _9 j( G; M; q1 x
  14.     if r.status == 200:
    $ H- F& h* v2 V$ a! r& m% R
  15.         return r.data# L$ F. }' ]  Q* t
  16.     else:
    # I* [6 z4 g+ O3 g
  17.         return None% w' \' Y2 S* P1 K6 Y2 W# p! e& h
  18. * |# e3 ~1 t- b- o# w
  19. #requests
    " ^* U( T& f  W9 C
  20. import requests) L1 i, I6 u% w' @/ b# B  d9 d# F9 M
  21. session = requests.Session()2 d) T; }" m/ @2 R9 \! C  a# C
  22. def getpage(session, url):
    ' d8 p- Q5 J; J0 b' t+ p$ Q3 m
  23.     r = session.get(url, timeout=10)
      Y" t7 ]1 P1 x4 w; G! M$ M! w
  24.     if r.status == 200:
    0 f' v! f, E& w& b
  25.         return r.content" n3 j: U5 g( W# b- _, Q/ E' w
  26.     else:( O, Q) M' Q9 Y, E1 G( J
  27.         return None
    9 U  C( z. V% `/ _" \
复制代码

9 N8 Z# d7 Z; z* v四、后期制作9 u# d! \# `% Y4 A3 h
1、文本处理,是个特征识别问题。) @: U! Y+ L7 |6 _& y+ q
本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。
  ?& A2 x8 h; q当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)
6 E4 ~, F! w9 T1 b都涉及到特征识别问题。% }2 j7 u; \  l) F1 P
相比这些高难度动作,文本处理算是比较简单、基础。8 z/ N8 f4 W( _6 ?! ]; t
Python里常用的文本处理技术:正则表达式、BeatifulSoup、lxml
3 |( R9 _4 Y4 `& s& I2 b! ?( P3 J正则表达式非常强大,但没法处理递归嵌套的标签型数据& Y# _3 ]% n4 i; s5 k" j" T. ?; ~
(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);/ U5 J# J: I0 _6 ]
BeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。$ P3 U5 [9 ?, U3 I
所以常常要结合使用。! a5 G/ Z( n$ u1 E/ N# t1 Y% A
这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。# I' x$ |$ F9 H- k/ `

" P* k& D/ [3 r4 O2、排版
7 [- {8 z( Y8 dHTML、CSS的基础知识:9 P; E& B: d" t8 p; l2 a) S
http://www.w3school.com.cn/html/index.asp: H  M# \( G8 y# v. {7 X2 i
http://www.w3school.com.cn/css/index.asp
5 L: Q3 m* i. ?# T3 [+ i$ fhttp://www.w3school.com.cn/css3/index.asp4 l* l% q; _5 R/ ^
非常系统、非常全面。
+ R* a  c' `! H1 a  Y# E排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。: K: \; Q* j' }$ e, v. @
5 E/ A# v9 S4 n! i" [  n
五、结语! b1 p% r9 D1 j) {: D% ?' \7 o
花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。
# E5 O  E- i) V- V9 ~所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——; O8 t; [* G5 d* {$ F  S7 h
大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。
2 b+ a  K. y& \1 \/ [9 b* I- S7 b9 @1 x4 o- O4 p, T! f
打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。2 o8 G. g% b$ h' M* m
0 L& D. q( B; y8 w% O& V
只是拜托不要打扰别人,真想要就自己动手。
; t  J& k4 e; Z) o  l6 d尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。
7 `) e9 A- k, u( v( |水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。
5 v3 [  J  g5 S虽然每个人都觉得自己至高无上,应当受到别人重视,9 N4 G1 e( Q: @, F; a
其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰
+ [6 z9 I, @: }
1 M& `2 [* j7 E/ ?2 g/ P1 `2 @/ a2 |: b7 I
========
2 _4 P% C& Q6 ?" I六、拾遗
, |) d0 W( a$ a关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类
! X$ i, [5 [. Z+ e8 Q0 N0 R. z9 E% @确实如此" Z) x7 m8 v  c
不过这里只是举例而已,不用太较真啦 ' U( o5 l) B9 p; Z
实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏
0 _7 y9 a# _# Z6 R* R6 R3 \, E这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。
( k; l5 q) A$ s0 w7 m即,
  D- L: e! y& X# d. k: w6 k) J第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)" Z. c* _, a: K! ]! s
第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)
+ r# H8 a3 o8 X: ?第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作
$ x: X/ j0 k+ j, X  G4 s。。。5 T$ e: l1 x2 q5 Q+ U" T1 C
直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空)
5 D  b( P) H! ?最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。
% K) u! R! n! R形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。1 |/ ?6 x1 T5 ~/ B- P
因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。" @& Y9 h* B6 j& }' ^+ N

评分

3

查看全部评分

本帖被以下淘专辑推荐:

该用户从未签到

 楼主| 发表于 2014-10-25 21:01:02 | 显示全部楼层
Oeasy 发表于 2014-10-24 18:413 P# n) W# H3 ]) l' D2 G' l
感谢楼主分享知识和经验。
( i8 G8 `- o6 ~8 P: }9 p6 F1 q
: Q8 v  }  R0 f3 S' c9 i. P7 C. m每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...
; Z) @; |" U( y: C9 d* A
现有的mdx词典,其实足够绝大多数人用一辈子的了
. r0 v$ f# ?1 d* k8 f% K
& c2 s7 b' W! {7 I' f本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。
* n& J9 n. Z/ I  N4 v  f- o( |4 C3 S! {
6 e. l1 Z+ B4 r: u" Q4 I# }本人最常用的词典:: G, g' q2 S1 m* z0 f$ V
主力阵容:VOC、ODE、WBD。) r, y2 U: o5 n/ E
三本都是中型词典,收词量均在14w上下,以本人目前的阅读面来看,还未遇到这三本里面查不到的单词、未收录的义项。据说史上掌握单词量最大的人是政治家兼散文家丘吉尔,也没超过14w。除非钻故纸堆,恐怕用到W3、SOED的机会不多。+ w. j! `4 M% o% c% U3 p4 R

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

该用户从未签到

发表于 2015-7-2 11:33:21 | 显示全部楼层
针对
IV. 片断索引型网站
说一下。
6 v& T9 s" Y  N7 Q# ]; d! e5 u, e; `其实只是你没有发现而已。
" M  E' N9 w! d7 n, W  xODE: http://www.oxforddictionaries.com/browse/english/( w* r8 t5 A0 d. P6 F+ b
RHD:http://dictionary.reference.com/list/a/3 B$ L% a' {3 t  `4 v. ~
CALD:http://dictionary.cambridge.org/browse/learner-english/
9 x+ f" x  C: P" a5 v- V0 Q# l' f" m( d* }2 _
如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。) _4 a8 C) E4 k, `% X# i+ t3 B7 f
以第二个为例:( [" Y( C( @5 N" A& m
inurl:browse | inurl:list site:dictionary.reference.com/ B, H) R  ]8 Z/ e& _
- j! \5 f: S7 N5 Q) j' \
PS:最近才发现这里,发现资料很多啊。/ B  e2 J$ Y1 l" m

该用户从未签到

 楼主| 发表于 2015-9-12 12:17:54 | 显示全部楼层
排版、修改他人制成品小技巧4 w$ ~: [- J0 D  C% h1 ~! M

( j  S0 k2 T. V1 Q假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改# p% l% U) q0 z( @4 c, l
或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下
2 q3 h- O+ W* j结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。
/ u9 n  I7 i7 f$ ?7 \: X# p这里有个比较省时省力的小技巧,可以快速定位到想找的地方
' F9 D& Z5 ?& _$ o. l* X2 U
5 P; z2 e& U( a2 p8 |" w1、Goldendict里,在想修改的地方点右键,有个“审查元素”:, P6 P: J( W# D2 `2 ?- \
2 M; ^  Y) O* a! N1 V

( I2 s7 f- J9 Y1 b2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事) @6 S5 T0 T' y: ^

! T7 \$ L" N, A9 f! s8 k' C
0 C! i7 q+ y% t# ?; Y3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方
* x" o% _( V6 @' M1 U1 X: E# t2 |( M) K
( h, n6 V8 X8 C
2 z3 m+ A  k- \3 s7 b: ]% W3 y收工

该用户从未签到

发表于 2014-10-24 18:41:00 | 显示全部楼层
2 g; d5 e% I8 x+ q* m/ ]9 D

5 W6 Q/ h& e- _, @1 w+ B* N 5 s  \: P( z+ l
& E0 A/ j, L5 ~7 b$ y) o1 U
感谢楼主分享知识和经验。4 `: Y/ W4 m) d$ F' P, b$ L

( G! ]3 c8 E; Y& e, R+ ?每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。
" Y& C* b  {3 |, o6 O  I7 O4 Z. |# T* m* M+ G, D1 b% l! z: F
私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。
, w3 Y) @% ?! L0 B* D, i9 p$ @, c+ D- h1 T7 O
但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。, j5 N* A; A2 {9 q5 V0 i8 y
6 M' c' K/ }3 ^: K6 h  L) J' Y
除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。
* W. G. ^3 W8 }4 o$ t' B: {7 l5 w. G5 H5 y9 S

# B+ @0 J4 a& a& m5 a3 c* B
! |/ A; q& j% x3 q  d( s/ F2 m4 k% I! z" j' z3 j

该用户从未签到

 楼主| 发表于 2015-9-20 10:40:37 | 显示全部楼层
Windows下制作词典必备的文本处理软件
3 T# B! I. B- [1 `, T3 F" L
  • EmEditor
  • Beyond compare7 ?: V) Y9 n" `% Y$ @
0 H- K2 P  n$ x8 N2 C: G6 v0 g
4 \% {: @* j7 i$ g% j' `  \
前者用于编辑,后者用于差分比较6 h' w7 ]3 \, L" f
处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

该用户从未签到

 楼主| 发表于 2015-11-3 22:35:33 | 显示全部楼层
关于字体,请参考
' ^( v) L' r: T0 f( h7 B1 I  M3 z4 {. V( H
网页设计中最常用的字体有哪些?(中文和英文)
& v! ]: W; h2 e( Z: L. Whttp://www.zhihu.com/question/19680724. [' ?1 w+ x4 S9 X

2 Z: N' p+ `' g$ A) j8 K1 Q' I本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode/ _, D6 b% _7 `* E  F: l9 G: ^3 y( d
这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全
' V1 j1 C6 x$ ~, Y$ ?4 z/ X9 @( [另外Open Sans字体也挺漂亮+ d8 V& x4 E6 x

该用户从未签到

发表于 2014-10-22 21:25:59 | 显示全部楼层
bt4baidu 发表于 2014-10-22 20:21  ]% A" Q6 O: \1 u$ u3 ~
最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...

2 z* R2 h/ G0 m) ^! P多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。1 U) k" i8 V! i5 ~1 K
" w( {: g7 l: [* a: K- U  c: o0 b
我的一点网络小技术是很久以前在X客基地学的,当时花了几百块钱,没想到有些技术到现在还没过时。抓dictionary.com的话用一般的软件就能搞定,老牌的离线下载小软件(如offline等)或这几年流行的火车采集器(www.locoy.com)都不错。

该用户从未签到

 楼主| 发表于 2014-10-22 20:09:54 | 显示全部楼层
大熊部落 发表于 2014-10-21 16:18, c! n* ]! L6 W' k
用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...

9 x; w, `$ n5 f' V我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件$ z1 ]3 H, D0 D: q

1 \8 q" ~% w( I; E2 n4 x
下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
% }4 v0 L) h5 I
推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

该用户从未签到

发表于 2014-10-19 16:21:01 | 显示全部楼层
這個要推~ 謝謝百度哥

该用户从未签到

发表于 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 编辑
    3 a* g' e: J6 P+ q5 m+ e% Q% z' h5 m; {
    写得很好。刚看前几行的时候,的确激动了一下子。虽然没怎么懂,但是第一次能坚持把这样的东西看完,觉得也是对自我的一次超越。谢谢!

    该用户从未签到

    发表于 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的每日心情
    开心
    2020-6-21 17:06
  • 签到天数: 44 天

    [LV.5]常住居民I

    发表于 2014-10-19 21:25:27 | 显示全部楼层
    辛苦了,谢谢!!

    该用户从未签到

     楼主| 发表于 2014-10-20 20:22:48 | 显示全部楼层
    本帖最后由 bt4baidu 于 2014-10-20 20:25 编辑 3 p+ \7 B4 G8 Q. @; F
    & d+ q& E6 v% i/ }, R6 |! H9 `
    java和.net就是个垃圾,我懒得提而已- [7 [/ |. _* `, B  @8 q; ^2 l
    在Linus这样的大神眼里,连C++都是垃圾:
    0 q; ~  X/ k" F7 Dhttp://www.csdn.net/article/a/2010-06-12/218785
    ' m  x8 O- e% \
    8 `% _7 @) U9 T) c如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。3 w) N) T) j2 d* D6 M" S
    " v- ?) _7 R& U  E4 N# M, x4 B; j
    不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。* _/ n( Z- K# l, L
    我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。8 c+ `" j5 t: m" S
    这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。3 u0 T( ^  C0 O( F  E1 I, O1 @, a
    不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。, I. n& g; R. ?' g- x0 Z. T
    为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?
    $ [1 v7 ~8 U9 A" @: N因为垃圾代码太多了。3 E( ^: O$ L7 V9 w$ n% s- l

    3 Y' ^- T! {' ~8 a8 Z/ c
    7 O$ {2 Q" R( h$ [1 g$ \3 l" [

    该用户从未签到

    发表于 2014-10-21 00:07:23 | 显示全部楼层
    本帖最后由 meigen 于 2014-10-21 00:41 编辑 - g' i/ z8 E$ I; o0 o: F' L: d0 l

    1 C$ _1 K: D8 j: [6 p$ j; b, u+ ]7 J# v$ B- x: I1 K. V, X+ Z6 m$ ~) K
    算了,道不同不相为交流/ L6 W, F  Z8 p5 l/ w" ^& a; l
    想起某个梗2 L1 Q  Q/ X7 }) t$ |
    程序员眼中的编程语言

    该用户从未签到

    发表于 2014-10-21 00:35:28 | 显示全部楼层
    不赞成多线程抓网站,但是好贴子要支持!
    $ M6 n7 J- W2 E$ K) ]0 Y; ]* c, U0 R; u  e
    自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。
    6 C8 ^  t; l- ^+ M6 C  H3 Q
    6 N, h* S$ J$ s另外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. B! g. z: x* T) e- ?# U
    算了,道不同不相为交流/ R! K$ p: [$ c/ Z- o
    想起某个梗1 f& J! K& |0 a3 @" M
    程序员眼中的编程语言

    . L1 v, l# o$ o- O2 {: d不同的语言适用于不同的人群:. O7 W/ q* k$ O! K( U( e
    如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。' Q# e; ~. y: Z+ D9 G# W- i8 e) w
    如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。
    3 ]' @) |; O7 M; j至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。5 O4 |3 b1 g8 M1 a8 D, e

    , K; h; p# w& k8 h' o$ i编程语言的口水仗永远也打不完,不争了
    . w6 s% ~% q+ ^5 \5 ?" h' S

    该用户从未签到

     楼主| 发表于 2014-10-21 11:29:53 | 显示全部楼层
    大熊部落 发表于 2014-10-21 00:35' }  h3 o+ q3 x% n6 A
    不赞成多线程抓网站,但是好贴子要支持!) o) N- M( _/ H+ W) P

    + [* \* Q" M' p$ D$ Z9 \自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...
    * j3 V  @: e6 i
    下载软件?推荐一款?; N2 e( Y+ `3 }. |9 p
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
    ) u  [% i* }  }现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?( n. A  Y0 @% ~
    比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。, s6 D) ?9 C% g2 z! s5 F( L. B
    除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。
    0 R2 f; U' e3 x0 I. q) b- D! y; w目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。! S) @8 M9 E' g: [8 a! s2 q
    " }1 X/ P& q/ K; P
    至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。3 K) c: \/ H8 \0 T. o9 i; C2 t" A
    对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,$ F9 v# s. l6 a9 O  G9 @
    目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。, V2 U5 v6 {7 h" K

    该用户从未签到

     楼主| 发表于 2014-10-21 11:41:35 | 显示全部楼层
    本人做个大胆的预言:7 f: ~( X5 K( r% O
    随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。: E' Q9 N7 Z2 m* w; L+ p
    未来会出现一个新的行业:私人计算机管家。
    + Y# s( z) N# P5 i2 Z0 x  J/ u专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。
    : G4 I% ~$ y# ^# r, z, ~& n4 u但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

    该用户从未签到

    发表于 2014-10-21 16:18:27 | 显示全部楼层
    bt4baidu 发表于 2014-10-21 11:29
    * j$ M" p3 C; N9 ^' K$ m) y下载软件?推荐一款?+ j" z  p/ E5 i/ w' z# p' H
    最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;+ l2 q/ Y: ]2 m* G
    现在99.999% ...

    4 E- N5 n8 ]7 O# ]7 y3 {' N用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
    5 @, l# o. t9 R! y& @. N2 Q: r4 V4 w7 n
    十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。% L, i8 E# s' X

    5 a* @3 c# I. Q8 a; l% t$ B! L用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。, R' F' s1 K- T4 ^

    % J' V& t& l. l) ^- m( a/ m; k我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2014-10-22 20:21:14 | 显示全部楼层
    平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。
    1 d6 E( i9 l  i4 n8 m6 @+ O: O
    & O& [3 u/ P9 Q& `8 H3 D% M) U
    最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差4 S0 K7 F- L2 ~$ T. h9 e1 H
    计算机是用会的,不是学会的;
    6 K5 w& `! i$ e4 J8 |8 y2 a8 T程序是调试出来的,不是写出来的  V7 c7 D& {, x9 g; h' v$ q
    - ?: w2 V, h$ D# g' E7 G
    既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。3 D0 [  j/ l# n5 b+ y
    你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。
  • TA的每日心情
    奋斗
    2019-10-19 21:04
  • 签到天数: 37 天

    [LV.5]常住居民I

    发表于 2014-10-23 09:53:00 | 显示全部楼层
    就需要这样的教程!学习了~
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    顶部qrcode底部
    关注公众号送论坛充值码
    关注微信公众平台
    关注微信公众号 pdawiki,获取邀请码,看文抢积分,抽奖得浮云! Follow our Wechat official account "pdawiki", get invitation codes, and play the lottery to earn points (积分)!

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2020-8-16 01:02 , Processed in 0.104933 second(s), 8 queries , MemCache On.

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

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