Python爬虫之二:自制简易词典

运行平台: Windows
Python版本: Python3.6
IDE: PyCharm
其他工具:Chrome浏览器


作为一个程序员,会经常查阅一些技术文档和技术网站,很多都是英文的,遇到不认识的词就要查,词典的使用频率也颇高,既然是程序员,高逼格的方式当然是做一个词典,此为动机。

1.寻找词典来源

​ 我寻找一个好的词典的标准是:解释到位、数据抓取方便。

​ 几个候选词典有:百度翻译、金山词霸、有道翻译、谷歌翻译。

​ 最终选定金山词霸作为词源,原因:

  • 大学时就使用金山词霸;
  • url比较简单。

2.数据抓取

2.1 寻找URL

​ 打开金山词霸在线翻译首页http://www.iciba.com/,输入一个单词进行查询,此处以“call”为例,查询页面出来以后看URL,浏览器的地址栏内容为http://www.iciba.com/call 。猜想查询URL格式为http://www.iciba.com/后面跟上要查询的单词(或词语),将call改为其他单词果然跳出相应的查询页面,中文也一样,由此可以证明以上猜想,也可以看出查询的URL真的简单明了。

2.2 寻找数据

​ 我只是想弄懂单词的意思,所以我需要的数据是如图所示部分:

需要的数据

​ 在浏览器按F12键调出开发者工具,然后刷新页面,我们要在页面中寻找我们需要的数据,按图示操作:

查找区域

​ 确定好了数据区域是< ul class="base-list switch_part">和< /ul>中间的部分,接下来就把这些数据都抓取下来吧。

2.3 抓取数据

​ 抓取数据用到了urllib.request库,解析html用到了BeautifulSoup库。所以首先导入这两个库。

import urllib.request
from bs4 import BeautifulSoup

​ 需要将整个网页内容抓取下来,用如下代码实现:

root_url = 'http://www.iciba.com/'
word = input('请输入想要查询的单词(或"q"退出):\n')
url = root_url +  word  # 拼接URL

response = urllib.request.urlopen(url)
html = response.read()

​ 有了html内容,接下来要把 base-list switch_part 标签里的内容读取出来,BeautifulSoup里的find可以实现此功能:

soup = BeautifulSoup(html, 'lxml')
tag_soup = soup.find(class_='base-list switch_part')
print(tag_soup)

​ 获得输出结果为:

<li class="clearfix">
    <span class="prop">v.</span>
    <p>
        <span>呼唤,喊叫;</span>
        <span>召唤,叫来,召集;</span>
        <span>下令,命令;</span>
        <span>打电话给</span>
    </p>
</li>, 
<li class="clearfix">
    <span class="prop">n.</span>
    <p>
        <span>喊叫,大声喊;</span>
        <span>电话联络;</span>
        <span>必要,理由;</span>
        <span>要求</span>
    </p>
</li>

​ 可以看出里面包含了两个< li class="clearfix">< /li>,这表明call这个单词有两个词性,接下来就要解析出所有的词性,用到BeautifulSoup的find_all函数:

meanings = tag_soup.find_all(class_='clearfix')
for i in range(len(meanings)):
    translation = meanings[i].get_text()    # 获取文本内容
    print(translation.strip())  # 去掉字符串开头和结尾的空行
    print('='*30)   # 华丽的分割线

​ 最后输出结果如图所示,这已经是我想要的结果了。

查询结果

3. 改进优化

​ 该词典的的基本功能已经完成,但是存在几个缺陷。

3.1 查询中文

​ 查询英语单词已经没有问题了,那么查询中文试试:

[图片上传失败...(image-5e0f82-1513432498747)]

​ 程序报错,是编码问题,是urllib.request.urlopen函数导致的,我们只需将URL拼接改为url = root_url + urllib.parse.quote(word)即可,试一下:

查询中文成功

3.2 查询不存在的单词

​ 如果查询不存在的单词结果会如何:

查询不存在的单词失败

​ 失败是因为在tag_soup = soup.find(class_='base-list switch_part')这一行执行完之后,tag_soup的值为None,已经不是BeautifulSoup里的数据类型了,已经不能使用find_all 函数了。那么在此处做一个判断:

  • 如果tag_soup为None,打印提醒语句并等待下一次输入
  • 如果tag_soup不为None,那么继续执行下面的解析。
if tag_soup == None:    # 防止输入的单词没有释义
    print(Fore.GREEN + '输入的单词不存在,重新输入.')
else:
    meanings = tag_soup.find_all(class_='clearfix')
    for i in range(len(meanings)):
        translation = meanings[i].get_text()
        print(ranslation.strip())   # 去掉字符串开头和结尾的空行
        print('='*30)

3.3 停止

​ 为了可以循环查询,将用户输入、查询、显示的步骤放到while True:语句里,那么如何优雅的退出呢?判断输入,我以字母‘q’为退出标识

while True:
    word = input('请输入想要查询的单词(或"q"退出):\n')
    if word == 'q':
        break
    else:
        ......(解析和显示工作)

3.4 给你点颜色看看

​ 这个工具是要自己使用的,最终是在控制台下显示,一团黑白相间的东西,没有美感,那么如何美化输出呢?将输出染上颜色。

​ 控制台输出上色需要用到colorama第三方库,使用pip进行安装:

pip install colorama

​ 引入该库:

from colorama import init,Fore # init是初始化,Fore是字体颜色

init(autoreset=True) # 初始化

​ 将几个print语句进行上色:

print(Fore.GREEN + '输入的单词不存在,重新输入.')
......
print(Fore.CYAN + translation.strip())
print(Fore.RED + '='*30)

​ 来看一下最终效果:

整体展示

​ 至此,一个简单的词典就完成了。

4. 如何使用

4.1 直接运行py文件

如果你已经开发完此词典说明你电脑里已经有python环境了,那么可以直接运行py文件。

  1. 我已经将py文件的打开应用设置为python.exe了,所以可以直接双击运行。
  2. 打开cmd,进入该py文件目录,执行python dict.py即可运行。

4.2 打包

​ 如果要给别人使用,那么打包成exe就是个完美的解决方案了。打包用到了pyinstaller第三方库,执行pip install pyinstaller进行安装。此处打包用到了pyinstaller的两个参数:

参数 含义
-F 指定打包后只生成一个exe格式的文件
-i 改变生成程序的icon图标

​ 到网上去下载一个ico文件作为改程序的图标(程序员也是要美感的),推荐一个icon下载网站http://www.easyicon.net/ 。打开CMD,进入到dict.py所在文件夹执行如下指令:

pyinstaller -F -i Dictionary.ico dict.py

​ 在dist目录下就可以看到生成的exe了。把dict.exe放到某个目录下,将快捷方式放到桌面,或者将该目录放到系统环境变量中,在cmd下直接敲dict.exe就能运行了,酷!

​ 欣赏一下最终效果:

词典演示

5.完整代码

# -*- coding: utf-8 -*-
"""
Created on Sat Dec 16 2017

@author: WangQiang
"""

import urllib.request
from bs4 import BeautifulSoup
from colorama import init,Fore

init(autoreset=True)
root_url = 'http://www.iciba.com/'

while True:
    word = input('请输入想要查询的单词(或"q"退出):\n')
    if word == 'q':
        break
    else:
        url = root_url +  urllib.parse.quote(word)  # 解决url中带有中文编译失败的问题
        response = urllib.request.urlopen(url)

        html = response.read()
        soup = BeautifulSoup(html, 'lxml')

        tag_soup = soup.find(class_='base-list switch_part')

        if tag_soup == None:    # 防止输入的单词没有释义
            print(Fore.GREEN + '输入的单词不存在,重新输入.')
        else:
            meanings = tag_soup.find_all(class_='clearfix')
            for i in range(len(meanings)):
                translation = meanings[i].get_text()
                print(Fore.CYAN + translation.strip())  # 去掉字符串开头和结尾的空行
                print(Fore.RED + '='*30)

大家有兴趣可以加群一起交流:

交流群

微信公众号
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容