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. ...
随机推荐
- CentOS下配置SMTP
在服务器上配置一个SMTP邮件服务可能是在日常工作中经常会遇到的需要,比如在做一些简单测试的时候. 配置步骤无比简单,废话不说: 1,yum -y install mail 2,编辑/etc/mail ...
- Html.Action和Html.RederAction来创建子视图
1. 父视图和子视图 父视图是包含了调用返回子视图的动作方法的视图. 父视图包含大部分用于呈现页面的HTML.子视图仅包含用于展示视图某部分的必须的标记. 例如,一个子视图创建一个列表,视图可能仅仅包 ...
- (转) 将VB.NET网站转换成C#的全过程
在学习URL重写过程中碰到个是VB写的源码,看起来总是不爽的就GOOLE了下 感觉这个文章写的不错 原文地址 http://www.cnblogs.com/cngunner/archive/2006/ ...
- win7 安装 IIS
和xp不同,xp安装 IIS需要下载额外的软件包. 步骤 1,依次打开 "控制面板" -> "程序" ->"打开或关闭windows功能& ...
- Java语言实现简单FTP软件------>FTP软件效果图预览之上传功能(三)
下面展示一下上传功能的过程 1.上传前 上传前选择好要将文件或文件夹上传到远程FTP服务器的哪个目的目录下. 2.上传中 添加上传任务 上传任务完成进度显示 3.上传完成 ============== ...
- bootstrap 模版
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8& ...
- HTML&CSS基础学习笔记1.23-表单的文本域和下拉列表
文本域 <textarea>标签定义多行的文本输入控件. 平时在网页上的一些需要输入比较多的内容的输入框,比如回复帖子,回答问题等,都可以用<textarea>标签. < ...
- zookeeper笔记--配置以及和spark hbase结合使用
Spark集群基于ZooKeeper的搭建:http://www.dataguru.cn/thread-333245-1-1.html Spark需要修改的地方: 进入spark的配置目录,参照下面代 ...
- Activity 模版样式简介
1:对话框样式. <activity android:theme="@android:style/Theme.Dialog"> 2:透明样式. <activity ...
- SQL Server 通过一个表和另一个表联合 批量更新这个表的字段
UPDATE OutPzPersonSet SET cPerson = a.AAA --SELECT * FROM OutPzPersonSet d INNER JOIN AAAA a ON d.cz ...