bt4baidu 发表于 2014-10-19 15:25:55

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

本帖最后由 bt4baidu 于 2015-11-22 10:08 编辑

这篇文章主要是给计算机小白和初学者扫盲。
本人尽量写得浅显一点, 希望完全没接触过计算机编程的文科生也可以看懂。
只讲原理和思路, 具体的编程语言、语法之类的问题自己找资料解决,网上到处都是。

一、计算机的两个终极哲学问题
1936年,图灵在他的重要论文《论可计算数及其在判定问题上的应用》里,提出著名的“图灵机”的设想。
图灵机被公认为现代计算机的原型,它的工作原理简单来说是这样的:
设想一条无限长的纸带,上面分成了一个个的小方格,方格有两种:空白的和上面有“—”的;
机器读入纸带上的方格信息,根据这些信息, 结合自己的内部状态查找程序表,输出计算结果。
方格信息代表了解决某一问题所需要的步骤,这样进行下去,就可以模拟人类的任何计算过程。
“纸带方格”代表外部输入,“内部状态查找程序表”代表算法——也就是程序,要靠人来写的。

那么要写出程序,立即就会发现不得不解决两个问题:
1、怎么知道机器当前读入的是哪个方格?怎么读到具体某一个方格?也就是寻址。
2、怎么把两种方格区分开?也就是特征识别。
这两个问题,就是计算机的终极哲学问题。
理论上,所有的计算机程序问题都可以逐步分解下去,最终分解为这两个基本问题。
下面的讲解也会以这两个问题为核心展开。

BTW, 如果你能想通这两个问题,遇到编程问题都可以这样子分解一下,把自己想象成一台图灵机,
——所谓“采用程序化思维”,也就相当于打通了任督二脉,立即具有了至少10年的编程内功。
所谓编程,本质上就是一种读取、存放、组织、区分数据,然后按照具体业务计算出结果的活动。
前者是核心,“我强烈建议围绕着数据来设计代码,而不是反其道而行之...坏程序员总是担心他们的代码,
而优秀的程序员则会担心数据结构和它们之间的关系。”——Linus曰。
具体的招式,也就是某种具体编程语言的语法,花个半天功夫就能学会的。

不要觉得自己上学时学的不是这个,or文科生,就不行。
江民杀毒软件大家想必都听说过。
创始人王江民同志,初中毕业,38岁才开始自学计算机,不出几年,就成为中国最早的反病毒专家。
咱不奢望成为专家,写写程序总还是可以的吧?

二、采用何种编程语言
上面已经说过,存放、读取、组织、区分数据是编程的核心问题。
显然,能够方便的进行上述四种活动的编程语言就是最好用、最易上手的编程语言。
抓网站,恐怕没有哪种语言比Python更方便。
当然,你要愿意,用C语言也不是不可以,不过可不是那么容易上手,
计算机专业的学生,有些到了大四毕业居然还搞不清何为指针、何为引用...这些家伙还是趁早转行,
没有慧根就别吃这碗饭。

三、网站抓取技术
1、下载某一个网页,提取其内容
以前写过一篇,就不重复了。参考:
用一个简单的例子讲讲怎样从网站上扒数据

2、寻址问题
下载网页,自然首先要知道网址,也就是东西放在哪儿。
如果事先有个单词总表,那是最简单不过,立即就可以根据网站的网址规则拼出来。
但是大部分在线词典,到底收了多少单词,事先是完全不知道的,
要把单词弄全,就要想办法得到每个单词的网址。
总结各主流词典网站,大概可以分为这么几类:
I. 事先有单词总表
比如http://www.vocabulary.com就是这种类型。
它是在wordnet3.0的基础上编纂的,直接用wordnet3.0的词汇表拼网址就可以。

II. 网站有索引页面
如:
OALD(http://www.oxfordlearnersdictionaries.com/)
它的索引页在 http://www.oxfordlearnersdictionaries.com/browse/english/
LDOCE(http://global.longmandictionaries.com/)
采用框架结构,左侧边栏就是索引页
MWC(http://www.merriam-webster.com)
索引页在 http://www.merriam-webster.com/browse/dictionary/
等等
这类也容易搞,思路是先从索引页得到单词表和网址,再一个个下载。

urls = []
for someindex in indexs: # 循环所有索引页
    browseurl = ''.join(['http://somewebsite.com/', someindex])
    browsepage = getpage(browseurl) # 下载索引页面
    target = SoupStrainer('sometag', class_='target') # 抠出放单词链接的区域
    bs = BeautifulSoup(browsepage, parse_only=target)
    if bs:
      for a in bs.find_all('a'):
            urls.append((a.string, a['href'])) # 取得该索引页上全部单词及链接
然后:
for url in urls: # 循环所有单词
    wordpage = getpage(url) # 下载单词页面


III. 索引页和单词释义一体型网站
如:Online Etymology(http://www.etymonline.com/)
和上述II.处理方式相同,在循环索引页的过程中把单词抠出来即可

for someindex in indexs: # 循环所有索引页
    browseurl = ''.join(['http://somewebsite.com/', someindex])
    page = getpage(browseurl) # 下载页面
    target = SoupStrainer('sometag', class_='target') # 抠出放单词的区域
    bs = BeautifulSoup(page, parse_only=target)
    for tag in bs.find_all(target): # 循环抠出单词
      worddefine = getworddefine(tag)


IV. 片断索引型网站
如:
ODE(http://www.oxforddictionaries.com/)
每查一个单词,右侧边栏有个Nearby words
RHD(http://dictionary.reference.com/)
右侧边栏有Nearby words
CALD(http://dictionary.cambridge.org/)
在页面的最下面有个Browse栏,给出前后相邻的单词
这类网站没有总索引,只好利用它的Nearby栏。
思路是从第一个单词(一般为‘a’或者符号数字之类的)开始抓,
每抓一个单词,同时得到下一个单词的网址,直到最后一个单词结束(一般为‘zzz’什么的)

cur = 'a'
end = 'z'
nexturl = ''.join(['http://somewebsite.com/', cur])
while cur!=end and nexturl:
    page = getpage(nexturl) # 下载单词页面
    worddefine, cur, nexturl = getword(page)# 得到本单词释义、下一个单词及其链接


V. 完全没有任何索引,那就没法子了
当然穷举算是一个办法,自己搞一个庞大的单词表,然后按I.的步骤处理
理论上也是可以的,就是效率差一点;
另外各家新词收录情况不一,有些词组、短语拼法也不太一致,单词表准备得不充分就没法完全网罗。

3、提高下载效率
I. 多进程
上面写的都是伪代码,也就是简单示范一下处理流程,直接写个循环了事。
实际抓网站时,这么做效率显然是非常低的。
假如有十万个单词,每个单词需要1秒,循环十万次就是差不多28小时,要花掉一天,
有些网站还经常抽风,半分钟下载不了一个单词,那就更慢。
假如在这段时间内,你家猫咪把电源插头给挠掉,或者键盘被女秘书不小心坐到了呢?
要速战速决,就得开多进程。
同样十万个单词,分成25个进程下,也就是28/25=1个多小时。
再开多一点呢?岂不更快。。。那样硬盘就转不动了,所以也是有极限的,要看PC的配置。
在Python里开多进程,同样十分简单,

from multiprocessing import Pool
pool = Pool(25) # 开25个进程
pool.map(downloadloop, args) # downloadloop是下载函数,args是其参数

这就搞定了。

对于上述I.~III.,包括V.,分块比较容易,无非是把一个大数组分成25份,
关于IV.,事先没有单词总表,就只好采用区间的概念,
比如('a', 'b'), ('b', 'c')。。。这样划分若干个区间下载

初学编程的人,一碰到进程、线程,常常有种畏惧感,
看到同步锁、共享内存、信号量什么的顿时觉得头大。
其实没什么好怕的,这是个寻址问题,关键是搞清楚它的内存空间构造是怎样的,
其中涉及到一点操作系统、读写互斥、原子操作的概念,找相关的书了解一下即可,没有特别难以理解的。

II. 断点续传
事情永远不是那么完美的,网络连接随时有可能中断,网站可能存在瑕疵、死链。
所以下载程序也要有点容错的功能,最好莫过于可以自行从中断处恢复,完全无需人工干预;
即便无法自行恢复,也得容易手工处理,不然可有的烦了。
这也是个寻址问题:关键是搞清楚从什么地方断的,把它标记下来;循环检测没下完的区块,从中断处接着下,
直到所有区块下完。

def fetch_a_word(part, word, url, data): # 下载一个单词
    word_define, failed = get_a_word_from_website(word, url)
    if failed:
      dump_failed_word(part) # 输出下载失败的单词及网址
      return False
    else:
      data.append(word_define) # 保存下载成功的单词数据
      return True

def download(part): # 下载一个区块
    words = getwordlist(part) # 读取单词总表
    if hasfailed(part):
      word, url = read_failed_word(part) # 读取前次下载失败的单词及网址
    else:
      word, url = words # 首次从头下载
    data = [] # 用来存放单词定义
    while not_end(words): # 循环下载
      if not fetch_a_word(part, word, url, data):
            failed = True
            break
      else:
            word, url = get_next_word(words) # 准备下一个单词及其网址
    if failed:
      suffix = '.part'
    dump_data(data, suffix) # 输出下载成功的单词,若因下载失败中断,文件名加后缀'.part'

def isfinished(part) : # 判断某区块是否下载完成
    if is_data_file_exists(''.join()): # 通过检查数据文件有没有生成来判断
      return True
    else:
      return False

def downloadloop(): # 循环检测未下完的区块
    finished = 0
    while not finished:
      nf = [] # 没下完的区块
      for part in parts:
            if not isfinished(part):
                nf.append(part)
      finished = not nf
      for part in nf:
            download(part)


III. 高速下载网页的小技巧
Python里面有三个库都可以用来下载网页:urllib2、urllib3和requests。
其中urllib2是Python原生的,urllib3和requests为第三方库。
(似乎Python3已经把urllib3收编为正规军了)
这三个库有什么区别呢?
形象点说,urllib2相当于去别人家“拿”东西,开门只拿一件,然后关上门,再开门拿下一件的家伙。
再笨的贼也没有这么干的,不停地开、关门太浪费时间,也容易招警察;同样,频繁连接也会网站被封IP,
所以urllib3在urllib2基础上加了一个HTTP连接池,保持连接不中断,打开门以后一次拿个够,然后关门走人。
但是urllib3有个问题,它不支持cookie,所以无法保存用户信息,遇到需要登录的网站就没辙了。
这时候就该轮到requests出场。requests在urllib3的基础上又进化了一步,它可以通过session来保存用户信息,
通吃一切网站。
所以你完全可以只用requests,忽略另外两个。不过我一般习惯用urllib3,只在需要登录的时候才用requests。
这仨库的用法都非常简单, 两个第三方库都有齐全的文档可供随时参考,虽然大多数功能都用不到:
http://urllib3.readthedocs.org/en/latest/
http://docs.python-requests.org/en/latest/:

#urllib2
import urllib2
def getpage(url):
    req = urllib2.Request(url)
    response = urllib2.urlopen(req)
    page = response.read()

#urllib3
from urllib3 import PoolManager
http = PoolManager()
def getpage(http, url):
    r = http.request('GET', url)
    if r.status == 200:
      return r.data
    else:
      return None

#requests
import requests
session = requests.Session()
def getpage(session, url):
    r = session.get(url, timeout=10)
    if r.status == 200:
      return r.content
    else:
      return None

四、后期制作
1、文本处理,是个特征识别问题。
本质上是找到满足某种模式的一串数据,按一定的规则转换成另一种模式。
当前的大热门:生物识别(人脸、指纹、静脉、虹膜。。。)、语音/摄像头输入(智能家电、自动驾驶。。。)
都涉及到特征识别问题。
相比这些高难度动作,文本处理算是比较简单、基础。
Python里常用的文本处理技术:正则表达式、BeatifulSoup、lxml
正则表达式非常强大,但没法处理递归嵌套的标签型数据
(如:<div>第1层<div>第2层<div>第3层</div></div>...</div>,这已经不属于正则文法的范畴);
BeatifulSoup/lxml可以处理嵌套的标签型数据,普通文本则无法处理。
所以常常要结合使用。
这些难度都不大,关键是胆大心细、思维缜密,不厌其烦,慢工出细活。

2、排版
HTML、CSS的基础知识:
http://www.w3school.com.cn/html/index.asp
http://www.w3school.com.cn/css/index.asp
http://www.w3school.com.cn/css3/index.asp
非常系统、非常全面。
排版词典需要用到的HTML/CSS知识并不太多,遇到问题参考上述网站即可。

五、结语
花点时间写个科普文,主要是考虑到确实有些文科同学or计算机小白想制作词典,但没有思路,无从下手。
所谓术业有专攻,为学有先后,总结一点经验分享出来,也算是对社会做点贡献——
大家有个切实可行的方法参照,不至于绕太多弯路,浪费太多时间,从而节约了社会成本。

打算做万年伸手党的同学,本人也没想过要鼓动你们,继续做伸手党好了,热心人还是挺多的,时常有不错的新作发布。

只是拜托不要打扰别人,真想要就自己动手。
尤其不要抱着“你手熟,水平高,做得比我快”的想法,觉得找别人做词典就特别理直气壮、理所当然。
水平再高也要花时间;同时,水平高也意味着其单位时间的价值要超过水平低的人。
虽然每个人都觉得自己至高无上,应当受到别人重视,
其实“在你做出惊天动地的大事、拥有巨大名声之前,你在别人眼里就是个屁”——Bill Gates曰


========
六、拾遗
关于上述IV. 片断索引型网站,有坛友指出ODE、RHU等都有索引页,因此可以归到第II.类
确实如此
不过这里只是举例而已,不用太较真啦{:4_105:}
实际操作过程中,由于网站可能存在索引不全、死链、交叉跳转及数据瑕疵,往往要将II.和IV. 的方法结合起来用,否则不是抓重就是抓漏
这种综合性的抓取方法,本人称之为单词表密集轰炸+广度扩展法。
即,
第一轮:先从索引页面获取全部的词头(集合A),再用这些词头去网站下载单词,同时提取每个单词页面里指向其它单词的链接(集合B)
第二轮:从集合B里删除已在集合A里的词头,得集合C;再用这个集合C里的词头去下载单词,并提取每个页面里的链接(集合D)
第三轮:从集合D里删除已在集合A和B的并集里的词头,然后重复第二轮的后几步动作
。。。
直到无法提取到新链接时,结束下载。大部分时候,第二轮结束时就已经提取不到新链接(即集合D为空)
最近新做的RHU、CED、WBD,均是采用这种方法,速度快,容错性强,效果极好。
形象点说,这种方法相当于草原上先有若干个着火点,这些着火点会把其周围的草地点着,最终烧光整片草原。
因为一开始着火点就已经比较多(索引页的大篇单词表),所以会烧得非常快、非常完整。

bt4baidu 发表于 2014-10-25 21:01:02

Oeasy 发表于 2014-10-24 18:41
感谢楼主分享知识和经验。

每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要 ...

现有的mdx词典,其实足够绝大多数人用一辈子的了

本人前段时间制作、收集了不少,经过一段时间的比较、试用、淘汰,只留下目前最常用的,也就八九本而已;未来相当一段时间内,本人应该是不会再出手的了,除非之前发的wish list里提到的几本有合适的数据来源。

本人最常用的词典:
主力阵容:VOC、ODE、WBD。
三本都是中型词典,收词量均在14w上下,以本人目前的阅读面来看,还未遇到这三本里面查不到的单词、未收录的义项。据说史上掌握单词量最大的人是政治家兼散文家丘吉尔,也没超过14w。除非钻故纸堆,恐怕用到W3、SOED的机会不多。

替补阵容:LDOCE、词源、短语8in1、韦小黄&韦小绿、Garner Usage。
LDOCE用来查常用词的惯用法/搭配、语法信息;
词源用来辅助理解、记忆单词;
短语8in1用来查漏网的惯用搭配、非正规用法;
韦小黄/Garner Usage用来辨析/比较同义反义、正误用法;
韦小绿用来辅助理解、记忆大词。小绿真是本好词典,有人说里面收的单词都是一辈子才能见一次的那种,其实不然。它虽然只收了1400多词,却几乎都是高频的大词。从本人的使用体验看,查得率相当高。比如最近看新闻说一种超大蜘蛛,里面有个词arachnid。别的词典只是干巴巴地说4对脚的生物之类的,只有韦小绿说了它的来源:从前有个女孩叫Arachne,编织技艺了得,把雅典娜女神给比下去了,结果激怒了女神,被她变成蜘蛛,终身织网。这种解释多有意思,看了永远忘不了。

上述词典,坛子里都有,无非是版本新一点旧一点。比如朗文5和朗文6,有人统计95%以上的内容都是一样的。如果是完美性格,非要用最新版,那就只有自己动手。不会有人在词典出版的第一年就去挑战版权方的。
“对于好学生,任何教育资源都应该是免费的”。虽然本人同意这种说法,也认为现行的版权制度存在重大问题——有人靠垄断知识获利,却完全合法;但是本人从未打算挑衅版权方,更未想过做Aaron Swartz那样的斗士。靠垄断知识获利是有点无耻,但如果没有利润,也就不会有人去做整理资料的事,这确实是个难题。

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

happlebao 发表于 2015-7-2 11:33:21

针对 IV. 片断索引型网站 说一下。
其实只是你没有发现而已。
ODE: http://www.oxforddictionaries.com/browse/english/
RHD:http://dictionary.reference.com/list/a/
CALD:http://dictionary.cambridge.org/browse/learner-english/

如果不想写爬虫来找索引入口,那么就要用好 Google 。答案肯定就在第一页。
以第二个为例:
inurl:browse | inurl:list site:dictionary.reference.com

PS:最近才发现这里,发现资料很多啊。

bt4baidu 发表于 2015-9-12 12:17:54

排版、修改他人制成品小技巧

假如下载了别人制作的词典,对其中某一块的配色、缩进等不太满意,想自己动手改改
或者,看到别人的排版比较舒服,自己制作词典的时候想借鉴一下
结果解开mdd,打开css文件,看到上百行密密麻麻的文字还真是有点晕。。。
这里有个比较省时省力的小技巧,可以快速定位到想找的地方

1、Goldendict里,在想修改的地方点右键,有个“审查元素”:
https://www.pdawiki.com/forum/data/attachment/album/201509/12/120433fopcdppddkc4uu1u.png

2、点进去会打开webkit浏览器的调试窗口,红框圈起来的地方就是了,想借鉴就直接copy-paste到自己的css里完事
https://www.pdawiki.com/forum/data/attachment/album/201509/12/120438zlf58fqlqlf36gag.png

3、修改就用Gettext等工具解开mdd文件,然后打开css改相应的地方
https://www.pdawiki.com/forum/data/attachment/album/201509/12/120444akv8y7hs00zsuy2y.png

收工{:12_410:}

Oeasy 发表于 2014-10-24 18:41:00



{:4_104:}

感谢楼主分享知识和经验。

每个人的时间都很宝贵。希望大家珍惜自己的时间,同时也要珍惜别人的时间。别人没有帮助你的义务。

私下里也有人找我各种求助,如果是举手之劳,我顺手就帮了。

但是如果耗时需要两分钟以上,我基本都是直接或间接拒绝。

除非对方很有礼貌,懂得如何提问和求助,提问之前自己思考、搜索过,再或者提问的是熟人或者他的问题我也很感兴趣,通过帮助他,我自己也能收获些东西。




bt4baidu 发表于 2015-9-20 10:40:37

Windows下制作词典必备的文本处理软件:

[*]EmEditor
[*]Beyond compare


前者用于编辑,后者用于差分比较
处理300Mb以上的超大尺寸文本文件毫无压力,实在是无比强悍

oltiger 发表于 2016-6-8 07:41:03

bt4baidu 发表于 2014-10-25 21:01
现有的mdx词典,其实足够绝大多数人用一辈子的了

本人前段时间制作、收集了不少,经过一段时间的比较 ...

肺腑之言。

bt4baidu 发表于 2015-11-3 22:35:33

关于字体,请参考

网页设计中最常用的字体有哪些?(中文和英文)
http://www.zhihu.com/question/19680724

本人用的最多的是Lucida Grande、Helvetica,正文里的斜体字首选Georgia,音标用Lucida Sans Unicode
这几种字体在Windows、苹果OS上显示效果都不错,字号也比较全
另外Open Sans字体也挺漂亮

flczjc 发表于 2022-2-26 17:50:52

{:4_104:}看了之后发现我确实没这慧根,老老实实找点现成的字典用用算了

是小樾啊 发表于 2021-7-6 11:06:02

bt4baidu 发表于 2014-10-22 20:21
最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的 ...

感觉找到适合自己的问题好少啊
这个适合的话感觉是兴趣和难度
想请教一下楼主是怎么处理这些问题的呢
还有种不系统的感觉

hidroid 发表于 2020-11-25 07:27:28

谢谢分享,很不错

kevinmzm 发表于 2014-10-19 16:03:34

Thank you for your good lecture. Will see if I can comprehend a point or two.

louislaolu 发表于 2014-10-19 16:12:07

本帖最后由 louislaolu 于 2014-10-19 16:13 编辑

写得很好。刚看前几行的时候,的确激动了一下子。虽然没怎么懂,但是第一次能坚持把这样的东西看完,觉得也是对自我的一次超越。谢谢!

ceoyee 发表于 2014-10-19 16:21:01

這個要推~ 謝謝百度哥{:4_113:}

houbible 发表于 2014-10-19 16:27:51

强大的教程,谢谢分享经验!谢谢bt4baidu!

chigre3 发表于 2014-10-19 17:28:11

受教了, ~\(≧▽≦)/~一个!

belleyeah 发表于 2014-10-19 17:31:18

先收藏了。慢慢看。{:4_104:}

cenfit 发表于 2014-10-19 20:08:45

已经收藏,谢谢!

wenlishahsa 发表于 2014-10-19 21:25:27

辛苦了,谢谢!!

Hugh 发表于 2014-10-20 01:10:40

学习!

bt4baidu 发表于 2014-10-20 20:22:48

本帖最后由 bt4baidu 于 2014-10-20 20:25 编辑

java和.net就是个垃圾,我懒得提而已
在Linus这样的大神眼里,连C++都是垃圾:
http://www.csdn.net/article/a/2010-06-12/218785

如果你的志向是做一名合格的码农,这些所谓高级语言最符合你的需求,生产效率很高,可以很好的完成老板分配的任务,我见过一周写一万行代码的,大部分都是什么类啊、对象啊之类的狂占代码量,在一般不懂行的眼里又显得特别拉风,貌似站在技术发展的最前沿;其实真正的大牛,早就不玩那些了。所谓面向对象,不过是为了提高生产性,好让资质较差的程序员跟得上而已,因为那些家伙无法理解过于抽象的事物。

不过面向对象也不是没有好处,它可以方便的把比较垃圾的代码隔离起来,不让它影响整个系统的稳定性。
我以前常常自己把整个系统框架搭起来,留出接口,具体那些粗活扔给下面的人干,即便代码水平比较差,影响范围也不会大。
这样系统的稳定性就有了,生产成本大大降低,效率也大大提高,因为可以大量找廉价码农。
不过,用户稍微吃点亏,因为垃圾代码毕竟是垃圾,运行效率比较差。
为什么win98的时候大家都是32M内存,运行程序倒不觉得非常吃力,现在动辄8G内存,机器反而经常吭哧吭哧跑半天呢?
因为垃圾代码太多了。


meigen 发表于 2014-10-21 00:07:23

本帖最后由 meigen 于 2014-10-21 00:41 编辑

{:4_109:}
算了,道不同不相为交流
想起某个梗
程序员眼中的编程语言http://coolshell.cn/wp-content/uploads/2009/12/language-fanboys.jpg

大熊部落 发表于 2014-10-21 00:35:28

不赞成多线程抓网站,但是好贴子要支持!

自以为是“文科生”的朋友们就别学Python了,因为这个世界上还有很多现成的抓网站软件,虽然Python确实是个好东西。

另外win95时代才是32M内存,win98的时候至少有128M,我一台老主机还是win98,文本检索速度秒杀XP。

bt4baidu 发表于 2014-10-21 11:28:36

meigen 发表于 2014-10-21 00:07
算了,道不同不相为交流
想起某个梗
程序员眼中的编程语言

不同的语言适用于不同的人群:
如果你有志在计算机领域施展一番拳脚,应该从C、汇编学起,离机器思维比较近,也没有那么多纷繁的库、乱七八糟的概念,可以专注于研究内存构造、算法本身。
如果只是用来处理日常文书事务,则Python、Office VBA这样的脚本语言最合适,说不定十几行代码便可以把你从一个星期的ditty work里解放出来,也容易学,实在是非常划算。
至于java、.net这些高级语言,留给打算做码农的家伙们学吧,这些语言被设计出来,目的是为了提高生产效率,便于人与人之间的交流;它离人的思维比较近,离机器思维比较远——你可以用它快速干完老板分配的任务,也可以从业务层面说个头头是道,但是很难搞清楚程序运行时的每个细节。

编程语言的口水仗永远也打不完,不争了

bt4baidu 发表于 2014-10-21 11:29:53

大熊部落 发表于 2014-10-21 00:35
不赞成多线程抓网站,但是好贴子要支持!

自以为是“文科生”的朋友们就别学Python了,因为这个世界上还 ...

下载软件?推荐一款?
最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
现在99.999%的网站都是动态的,服务器上只有PHP/Java程序和一些图片、视频,文本数据存在数据库里,网页是自动生成的,并没有那么一个文件在服务器上,如何下载呢?
比如这个论坛就是,咱们敲的这些字都会进数据库,在你打开网址的时候PHP程序去读数据库,才会把网页生成出来,并不会事先预备一个网页在那里。
除非那个软件可以模拟网页浏览的操作,那倒是可以。不过那样的话,还是需要事先有个完整的单词网址总表,但是正如我上面所说,很多时候你无法事先知道。
目前的下载软件多是用来下载图片和视频、mp3,不是用来下载网页。

至于多线程,完全不用担心,你用Chrome/IE打开网页的时候,就是多线程的。
对服务器影响较大的是频繁建立连接(所谓DOS攻击),下载数据只是影响流量带宽,对网站影响没那么大的,
目前主流网站都是毫秒级响应用户请求,带宽无比的大,下载单词对它的影响不值一提。

bt4baidu 发表于 2014-10-21 11:41:35

本人做个大胆的预言:
随着智能设备越来越多,生活越来越智能化,人不但要具备人际交往能力,也要具备人机交往能力。
未来会出现一个新的行业:私人计算机管家。
专门替土豪处理计算机相关事务。其实现在已经有专门替土豪发微博、回微信的助理,可以算管家一类。
但还不够,账户安全、数据安全,哪些可以放网上,哪些该物理隔离,这些并没有人替土豪处理,于是清凉图片满天飞。

大熊部落 发表于 2014-10-21 16:18:27

bt4baidu 发表于 2014-10-21 11:29
下载软件?推荐一款?
最早的时候,网站上都是静态HTML文件,是可以用下载软件整锅端的;
现在99.999% ...

用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。

十几年前的小软件就有模拟的功能,对那些看不到任何页面的数据库也有软件搞定,不过有些方法可能超出“下载”的范畴。

用不用多线程(最多3线程)是原则,有点像“偷”与“抢”的区别,反正不是为了商业利益,还是遵守原则比较好。

我不是专业人员,平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

bsqby 发表于 2014-10-21 20:06:14

此类科普文, 多多益善, 学习之!

bt4baidu 发表于 2014-10-22 20:09:54

大熊部落 发表于 2014-10-21 16:18
用Phthon能做的也能用软件来做,因为软件只是把代码做成界面而已。比如你上面说的下载一个词条后可以获得 ...

我一般是先看看自己能不能写一个,搞不定或者太花时间再去搜现成的软件

下载一个词条后可以获得另一个词条的链接,那么软件会自动下载这第二个词条,因为软件可以设置成下载所有新的链接。
推荐一款可以下dictionary.com的?这个网站上的词典我还是蛮感兴趣的,就是懒得动手

bt4baidu 发表于 2014-10-22 20:21:14

平时只用C玩玩算法游戏,目前在学习Phthon,但愿十年内不用再学习新的语言。

最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒的练习,效果甚差
计算机是用会的,不是学会的;
程序是调试出来的,不是写出来的

既然会C,完全不用花时间学Python啊,10分钟足够了。我也就是花几分钟看了下百度百科就开始干了,遇到问题随时可以查资料。
你现在问我Python有哪些关键字、哪些运算符,我都答不上来;这些都无关紧要的——我在做词典的过程中,大概已经写了上万行程序了。

大熊部落 发表于 2014-10-22 21:25:59

bt4baidu 发表于 2014-10-22 20:21
最好带着一个问题,在解决问题的过程中边用边学,比如抓词典;否则泛泛的看书、看资料、做一些不痛不痒 ...

多谢指点!我只能用C玩玩简单的竞赛算法题,这些天用Python抓过一些页面,正在研究更复杂一点的方法。

我的一点网络小技术是很久以前在X客基地学的,当时花了几百块钱,没想到有些技术到现在还没过时。抓dictionary.com的话用一般的软件就能搞定,老牌的离线下载小软件(如offline等)或这几年流行的火车采集器(www.locoy.com)都不错。

smallrock 发表于 2014-10-23 09:53:00

就需要这样的教程!学习了~

mitkyg 发表于 2014-10-24 11:00:51

{:4_104:}学习
页: [1] 2 3 4 5 6
查看完整版本: 【史上最全】在线词典抓取、制作技术汇总