py爬取英文文档学习单词
最近开始看一些整本整本的英文典籍,虽然能看个大概,但是作为四级都没过的我来说还是有些吃力,总还有一部分很关键的单词影响我对句子的理解,因为看的是纸质的,所以查询也很不方便,于是想来个突击,我想把程序单词收拢在一起学习一下,希望这样的更有针对性一些,因为你想,arbitrary (任意的,武断的)这样的单词不太可能会出现在技术文档上,学了这样的单词对理解英文技术文档没有太大帮助。所以今天花了几个小时研究了一下,发现是很可行的,实现也不算难。步骤主要是以下几点,第一:先搞定翻译接口。翻译的来源分为接口型和爬虫型,我看了看百度的那个翻译页面,不是很好爬,但是百度官方提供了翻译的接口,只要申请成为百度的开发者即可,然后利用百度给的app key即可实现翻译,而且接口也很丰富,但是我还是觉得略微麻烦。另外一个就是谷歌了,我仔细看了看谷歌翻译页面的接口,发现竟然出奇的简单,只有一个set-cookie的接口,然后就是翻译的接口,你肯定猜到了,我用的就是爬取谷歌的翻译页面。第二:爬取你想分析的英文文档的单词。翻译嘛,总的有大批的单词啊,那么我这边也是通过爬虫获取的,给定一个页面,比如https://docs.python.org/3/library/abc.html#module-abc这样的技术文档,我们需要把所有看上去像单词的单词都正则匹配出来,然后逐个调用翻译接口翻译出来。好了,思路的介绍就是这样了,如果你已经产生了兴趣,你可以不往下看,自己先摆弄一番,如果你觉得想先看看我的实现,那我也十分欢迎。OK,我们先上一张结果图,
。这个就是所谓的爬取和翻译的结果了。那么我们紧接着贴一下代码吧:
# -*- coding: utf-8 -*-
import re, urllib.parse, urllib.request, http.cookiejar
# 以下四行代码是为了缓存cookie用的,谷歌翻译接口给不给你翻译,他只看请求源有没有他认可的cookie,一般的urllib.request请求是不会缓存cookie的
cj = http.cookiejar.LWPCookieJar()
cookie_support = urllib.request.HTTPCookieProcessor(cj)
opener = urllib.request.build_opener(cookie_support, urllib.request.HTTPHandler)
urllib.request.install_opener(opener) # 通过get请求来获取数据,这里需要注意的是,headers是应该带上的,虽然是get请求,但是某些网站的后台是会检测请求有没有带headers的,不带headers被认为是爬虫,他不理睬的,所以我们也要模拟一下
def getData(url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
request = urllib.request.Request(url = url, headers = headers)
response = urllib.request.urlopen(request)
text = response.read().decode('utf-8')
return text # 谷歌翻译页面只需要登陆一次
google_logined = False # 翻译函数
def translate(word):
if not google_logined:
# 刚才说的那个set-cookie的接口就是下面这个简短的http://tr...../,他会设置一段cookie
getData('http://translate.google.cn/')
global google_logined
google_logined = True
try:
# 常常的url就是翻译接口,最后带上需要翻译的单词
data = getData("http://translate.google.cn/translate_a/single?client=t&sl=en&tl=zh-CN&hl=zh-CN&dt=bd&dt=ex&dt=ld&dt=md&dt=qc&dt=rw&dt=rm&dt=ss&dt=t&dt=at&dt=sw&ie=UTF-8&oe=UTF-8&oc=2&otf=1&srcrom=1&ssel=0&tsel=0&q=" + word)
# 其实翻译出来的东西蛮多的,可是我们只需要最前面的中文就好了,于是正则匹配一下拿出来即可
reg = re.compile('^\[\[\[\"(.+?)\",\"(.+?)\"\]')
tran = reg.findall(data)[0]
# 一开始我没有用try except,发现有些单词的翻译json结构变了,估计是不好翻译以后,谷歌给的json很短,正则匹配出错了,所以try一下吧
except:
return ('error========================>>>'+word)
return tran # 这个正则用途你也许猜到了,就是正则匹配一个页面的所有的单词,但是性能并不是很好,他会把<span>apple</span>中的span和apple都匹配出来,不过稍加处理也就可以解决,咱先让性能一边玩去
parse_word_reg = re.compile('([a-zA-Z]{3,})') # 解析页面单词的函数,参数为url,用上面的正则去匹配,返回来的是一个结果列表,另外我用set这个集合生成函数做了一下过滤,用过python的童鞋懂的。。。
def parse_words(url):
content = getData(url)
words = parse_word_reg.findall(content)
words = list(set(words))
return words # 好了,万函具备,只欠测试了,我们传一个技术文档的url进去实施吧,发现他就逐个逐个开始翻译了。
words = parse_words("https://docs.python.org/3/library/abc.html#module-abc")
for word in words:
print(translate(word))
py爬取英文文档学习单词的更多相关文章
- docker swarm英文文档学习-9-使用Docker Configs存储配置数据
Store configuration data using Docker Configs 使用Docker Configs存储配置数据 Docker 17.06引入了集群服务配置,允许你在服务镜像或 ...
- docker swarm英文文档学习-3-开始
https://docs.docker.com/engine/swarm/swarm-tutorial/ 1)Getting started with swarm mode 本教程向你介绍Docker ...
- docker swarm英文文档学习-11-上锁你的集群来保护你的加密密钥
Lock your swarm to protect its encryption key上锁你的集群来保护你的加密密钥 在Docker 1.13及更高版本中,默认情况下,群管理器使用的Raft日志在 ...
- docker swarm英文文档学习-12-在集群模式中的Raft共识
Raft consensus in swarm mode 在集群模式中的Raft共识 当Docker引擎在集群模式下运行时,manager节点实现Raft 共识算法来管理全局集群状态.Docker s ...
- docker swarm英文文档学习-8-在集群中部署服务
Deploy services to a swarm在集群中部署服务 集群服务使用声明式模型,这意味着你需要定义服务的所需状态,并依赖Docker来维护该状态.该状态包括以下信息(但不限于): 应该运 ...
- docker swarm英文文档学习-10-使用Docker密钥管理敏感数据
Manage sensitive data with Docker secrets使用Docker secrets管理敏感数据 About secrets 对于Docker Swarm服务来说,sec ...
- docker swarm英文文档学习-6-添加节点到集群
Join nodes to a swarm添加节点到集群 当你第一次创建集群时,你将单个Docker引擎置于集群模式中.为了充分利用群体模式,可以在集群中添加节点: 添加工作节点可以增加容量.当你将服 ...
- docker swarm英文文档学习-7-在集群中管理节点
Manage nodes in a swarm在集群中管理节点 List nodes列举节点 为了查看集群中的节点列表,可以在管理节点中运行docker node ls: $ docker node ...
- docker swarm英文文档学习-4-swarm模式如何运行
1)How nodes work Docker引擎1.12引入了集群模式,使你能够创建一个由一个或多个Docker引擎组成的集群,称为集群.集群由一个或多个节点组成:在群模式下运行Docker引擎1. ...
随机推荐
- Tree( 树) 组件[3]
本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一. 事件列表很多事件的回调函数都包含'node'参数, ...
- 网页、JavaScript 的DOM操作
HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). HTML DOM 模型被构造为对象的树. Windows 对象操作 ...
- notification:object not locked by thread before notify()
今天写notification练习时,误将NotificationManager.notify(0, notification);写成notification.notify(); 代码如下 publi ...
- Ueditor使用方法
1.到百度下载文件,有各种版本.下载.net版本 2.将所需文件导入工程中 分别是:themes文件夹.third-party文件夹.ueditor.all.min.js.ueditor.config ...
- 使用angularjs中ng-repeat的$even与$odd属性时的注意事项
JavaScript中数组的索引是从0开始的,因此我们再取奇偶的时候需要用!$even和!$odd来将$even和$odd的布尔值反转 下面给出一个实例: 使用$odd和$even来制作一个红蓝相间的 ...
- C++拾遗(二)关于变量
符号常量——预处理方式 例如: #define ZERO 0 会替换程序中所有的ZERO为0,在那些设计为用于C和C++的头文件中,必须使用#define来定义符号常量. 无符号类型 unsigned ...
- python 登陆一个网站
今天想用python写一个登陆的脚本,搜了一下,网上挺多的,看了一些后写了个登陆虎扑论坛的脚本. 原理: 只要在发送http请求时,带上含有正常登陆的cookie就可以了. 1.首先我们要先了解coo ...
- MongoDB 介绍及Windows下安装
一.MongoDB简介 MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值存储方式.Mongo使用C++ ...
- 转载:JAVA中使用JSON进行数据传递
转载网址:http://www.cnblogs.com/undead/archive/2012/07/18/2594900.html 最近在做一个基于JAVA Servlet的WEB应用以及对应的An ...
- pyqt5表格qtablewidget
表格用到控件QTableWidget,还有一个类似的叫QTableView的. 设置单元格里的内容用方法:setItem(0,0,str) 第一个0表示第一行, 第二个0表示第一列, 第三个参数是写入 ...