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

  • 1.寻找词典来源
  • 2.数据抓取
    • 2.1 寻找URL
    • 2.2 寻找数据
    • 2.3 抓取数据
  • 3. 改进优化
    • 3.1 查询中文
    • 3.2 查询不存在的单词
    • 3.3 停止
    • 3.4 给你点颜色看看
  • 4. 如何使用
    • 4.1 直接运行py文件
    • 4.2 打包
  • 5.完整代码

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

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  # 拼接URLresponse = 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 查询中文

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

​ 程序报错,是编码问题,是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':breakelse:......(解析和显示工作)

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,Foreinit(autoreset=True)
root_url = 'http://www.iciba.com/'while True:word = input('请输入想要查询的单词(或"q"退出):\n')if word == 'q':breakelse: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)

欢迎关注公众账号:


Python爬虫之二:自制简易词典相关推荐

  1. Python爬虫实例:自制翻译机(简单)

    文章目录 Python爬虫实例:自制翻译机 要求实现功能:用户输入英文或中文,程序即可打印出来对应的译文. 步骤 解决反爬 上码 加界面 结果展示 Python爬虫实例:自制翻译机 一起试试爬取有道翻 ...

  2. 转 Python爬虫入门二之爬虫基础了解

    静觅 » Python爬虫入门二之爬虫基础了解 2.浏览网页的过程 在用户浏览网页的过程中,我们可能会看到许多好看的图片,比如 http://image.baidu.com/ ,我们会看到几张的图片以 ...

  3. 【python爬虫】爬取Bing词典的单词存到SQLite数据库(加了pyqt5界面显示)

    之前一篇博客的连接: [python爬虫]爬取Bing词典的单词存到SQLite数据库 相比之前这篇文章中的源码,这次带UI的代码不仅改进了UI界面,爬虫部分的代码也有改进. 展示 代码github ...

  4. Python爬虫【二】爬取PC网页版“微博辟谣”账号内容(selenium同步单线程)

    专题系列导引   爬虫课题描述可见: Python爬虫[零]课题介绍 – 对"微博辟谣"账号的历史微博进行数据采集   课题解决方法: 微博移动版爬虫 Python爬虫[一]爬取移 ...

  5. Python爬虫(二)

    Python爬虫(二) 一.请求对象的定制-User-Agent反爬机制 请求对象的定制:由于urlopen方法中没有字典类型的数据存储,所以headers不能直接存储进去 请求对象的定制的目的:是为 ...

  6. Python 爬虫入门(二)——爬取妹子图

    Python 爬虫入门 听说你写代码没动力?本文就给你动力,爬取妹子图.如果这也没动力那就没救了. GitHub 地址: https://github.com/injetlee/Python/blob ...

  7. Python爬虫实例(二)——爬取新冠疫情每日新增人数

    Python是世界上最美的语言 大家好,我是Henry! 疫情以来,相信大家每天都关注着疫情的实时动态,许多网站上也post了疫情的相关资料. 丁香园 百度 各个网站都会统计每日新增,刚学了Matpl ...

  8. Python爬虫:二十行代码获取某知名网站高质量视频,带视频讲解

    文章目录 一.写在前面 二.爬虫原理 三.案例实现 四.视频讲解 一.写在前面 兄弟们,自从上次爬虫热门后,我就没发高质量爬虫了,看的人都少了,唉~ 原来你们都是这样的人 二.爬虫原理 作用: 批量获 ...

  9. Python爬虫初学二(网络数据采集)

    目录 一.网络数据采集 1.什么是网络数据采集 2.网络数据采集的特点 二.网络数据采集之urllib库 三.网络数据采集之requests库 1.requests安装 2.request方法汇总 3 ...

  10. 使用python爬虫技术进行有道词典翻译中英文【修正转载】

    今天在网上想找资料学习一下爬虫技术,在博客:[python爬虫]--调用有道词典进行翻译_saya_wj-CSDN博客_通过爬取有道词典的方式实现中英文的翻译的代码里面意外的发现translate方法 ...

最新文章

  1. ST-3806系列单圈编码器 测试说明
  2. Spring 事务core 模块-RowMapper
  3. BZOJ2647 : [Neerc2011]Journey
  4. rest_framework中的url注册器,分页器,响应器
  5. delphi查看源码版本_[Mybatis]-IDEA导入Mybatis源码
  6. php ai,php能做AI智能吗
  7. vscode格式化代码快捷键
  8. 溯光者:超简单,一文读懂显卡型号编码数字、字母怎么看,都是什么意思?
  9. java 验证码 仿12306_Java仿12306图片验证码
  10. 测试工作中必备技能---思维导图你会吗? 10分钟让你精通思维导图!!!
  11. vue-router 报NavigationDuplicated: Navigating to current location问题解决
  12. Shell语言-16-Shell脚本调试 -n -v -x -c
  13. 计算机域名的解释,通俗易懂:域名与IP的关系讲解
  14. 如何防护DNS欺骗攻击
  15. about Red_Hat_Enterprise_Linux_7
  16. 如何使用激活工具Microsoft Toolkit
  17. 19个相见恨晚的黑客技在线学习网站,你离黑客又近了一步
  18. Elasticsearch存在的价值及其核心思想
  19. html2canvas + jspdf 实现 html导出pdf
  20. 虚拟机VisualBox 安装Centos7系统

热门文章

  1. python计算快递运费价格表_python2.4项目:快递计价程序
  2. C语言 求最小公倍数
  3. 提供在线存储服务的网站
  4. 看《中国合伙人》有感
  5. 从一个角色建模师角度谈谈游戏角色设计
  6. 网络江湖演义(一) ×××士刘韧 王泽宾
  7. kmeans的手肘法
  8. matlab散点图matplotlib散点图
  9. linux命令-进程(服务)管理
  10. Android日志输出