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. ...
随机推荐
- [转]Xcode的重构功能
Xcode提供了以下几个重构功能: Rename Extract Create Superclass Move Up Move Down Encapsulate 在菜单栏中的位置如下图: 在代码区里直 ...
- java部分基础总结
新手期一些知识的总结面向对象: 首先先将面向对象与面向过程区分开:面向过程主要是通过过程,达到某种目的,这种目的的目标就是对象,二面向对象重点则是不再考虑过程,直接面向对象! 对象 概念:一切客观存在 ...
- js formatString 格式化字符串
/* 函数:格式化字符串 参数:str:字符串模板: data:数据 调用方式:formatString("api/values/{id}/{name}",{id:101,name ...
- PHP页面中文乱码问题
首先纯html页要用meta标签声明编码<meta http-equiv="Content-Type" content="text/html; charset=&q ...
- Thinkphp join 连接查询
public function test ( ) { $User = M('authlist'); $rs = $User->join('left join wifi_shop on wifi_ ...
- bootstrap 模版
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8& ...
- WebApi上传图片 await关键字
await关键字对于方法执行的影响 将上一篇WebApi上传图片中代码修改(使用了await关键字)如下: [HttpPost] public async Task<string> Pos ...
- WebVR
WebVR 主要面向Web前端工程师,需要一定Javascript及three.js基础:本文主要分享内容为基于three.js开发WebVR思路及碰到的问题:有兴趣的同学,欢迎跟帖讨论. 目录:一. ...
- 树莓派设置固定ip
2016发布的rasbian采用的网络机制是dhcpcd: 不能使用以前的修改配置文件/etc/network/interfaces: 新的配置方式保持/etc/network/interfaces不 ...
- Codeforces 159D Palindrome pairs
http://codeforces.com/problemset/problem/159/D 题目大意: 给出一个字符串,求取这个字符串中互相不覆盖的两个回文子串的对数. 思路:num[i]代表左端点 ...