您的位置:首页 > 编程语言 > Python开发

利用python爬虫实现简单翻译软件

2017-12-18 21:58 555 查看
近期,在做项目中,有一个问题一直困扰着我,就是翻译英文太难,中文毕竟还是母语,所以读写看还是方便的多,但因为项目中处理的都是英文的部分,所以,想做一个小的爬虫程序,来实现翻译的功能。有了这个目标,OK,现在开始实现。

首先,需要简单的了解一下爬虫,尽可能简单快速的上手,我希望可以在今天下午四点的时候搞定基础知识,其次,需要了解的是百度的API的接口,搞定这个之后,谷歌翻译会更加麻烦一点,先搞定百度翻译,然后再解决谷歌翻译的事情,最后,按照官方给出的demo,然后写自己的一个小程序。

第一个部分:Python爬虫的基础知识

1,使用的第三方库:urllib, urllib2,利用这些库我们可以得到网页的内容。

2,Python正则表达式,用于匹配表达式,可以视为抽取的作用,把我们想要的部分可以抽取出来。

3,爬虫的Scrapy框架。这个是后续的内容啦。

详见官方文档:http://doc.scrapy.org/en/latest/

4,URL,统一资源定位符,即我们需要到达的目的地址

DNS,域名系统,就是IP的另一个名字,我们只需要知道别名,就可以访问到那个IP地址了。

HTML代码,网页的实质,利用谷歌的审查元素就可以看到网页呈现的格式。

5,简单的爬虫的教程,感谢大神的分享, 我就直接贴上大神的网址,以便后续遗忘时的查看。http://python.jobbole.com/81336/

6,数据传送的二种方式:post和get方式

简单的网页抓取是静态的网页,但很多时候,是动态的网页,需要我们传递数据给服务器来获得所需要的网页数据,所以数据传送的方式分为二种,post方式和get方式。

get方式是直接以链接的方式来访问,链接中包含了所有的参数,用户可以方便直观的查看自己提交的内容,但不太安全;post方式则不会再网址上显示所有的参数,查看提交的内容不方便,但相对而言比较安全。

post方式:(对于数据具有隐藏功能)

import urllib
import urllib2
values = {}
values['username'] = "1016903103@qq.com"
values['password'] = "XXXX"
data = urllib.urlencode(values)
url = "http://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn"
request = urllib2.Request(url,data)
response = urllib2.urlopen(request)
print response.read()


get方式:(显式的显现数据)

4000

import urllib
import urllib2
values={}
values['username'] = "1016903103@qq.com"
values['password']="XXXX"
data = urllib.urlencode(values)
url = "http://passport.csdn.net/account/login"
geturl = url + "?"+data
request = urllib2.Request(geturl)
response = urllib2.urlopen(request)
print response.read()


7,设置Headers

站点对于简单的方式访问并不买账,这个时候并不会返回任何内容,不会响应,所以需要模拟浏览器的工作,所以需要设置一些Headers的属性,让我们的访问类似于浏览器的访问。

在头部Headers中,有很多文件编码,压缩方式,请求的agent等信息,如果没有请求的身份,那么服务器不一定会有响应,所以我们在头部数据中加入agent信息,来模拟浏览器的行为。对于headers中的“反盗链”的方式,需要判断的是referer字段,判断是不是它自己,如果不是,则不会响应。

User-Agent : 有些服务器或 Proxy 会通过该值来判断是否是浏览器发出的请求
Content-Type : 在使用 REST 接口时,服务器会检查该值,用来确定 HTTP Body 中的内容该怎样解析。
application/xml : 在 XML RPC,如 RESTful/SOAP 调用时使用
application/json : 在 JSON RPC 调用时使用
application/x-www-form-urlencoded : 浏览器提交 Web 表单时使用
在使用服务器提供的 RESTful 或 SOAP 服务时, Content-Type 设置错误会导致服务器拒绝服务


8,设置代理Proxy

import urllib2
enable_proxy = True
proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'})
null_proxy_handler = urllib2.ProxyHandler({})
if enable_proxy:
opener = urllib2.build_opener(proxy_handler)
else:
opener = urllib2.build_opener(null_proxy_handler)
urllib2.install_opener(opener)


9, Timeout设置

10,cookie的使用

一直说cookie,cookie,到底是什么东西,是指某些网站为了辨别用户身份,进行session跟踪而存储在用户本地终端上的数据。比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的,那么我们可以利用Urllib2库保存我们登录的Cookie,然后再抓取其他页面就达到目的了。

首先,我们需要的是一个opener的实例,之前我们采用的urlopen,是一个简单的opener实例,传入的参数仅仅是url,data,timeout,而我们需要更复杂的功能时,这个是满足不了我们的要求的,所以我们需要创建更一般的opener来实现Cookie的设置。

其次,我们采用cookielib模块,来提供可存储cookie的对象,以便于与urllib2模块配合使用来访问Internet资源,Cookielib模块功能非常强大,我们可以利用本模块的CookierJar类的对象来捕获cookie并在后续连接请求时重新发送,比如可以实现模拟登录功能。该模块主要的对象有CookieJar,FileCookieJar,MozillaCookieJar,LWPCookieJar.

具体的教程:http://python.jobbole.com/81344/

11,正则表达式

正则表达式是对字符串操作的一种逻辑公式,是用事先定义好的一些特定字符,及这些特定字符的组合,组成一个“规则字符串”,用于对字符串的一种过滤逻辑。

第二部分:了解百度翻译的API

首先,需要在百度翻译平台来进行注册http://api.fanyi.baidu.com/api/trans/product/apidoc

在管理控制台来找到自己的APP ID和密钥。



例:将apple从英文翻译成中文:
请求参数:
q=apple
from=en
to=zh
appid=2015063000000001
salt=1435660288
平台分配的密钥: 12345678
生成sign:
>拼接字符串1
拼接appid=2015063000000001+q=apple+salt=1435660288+密钥=12345678
得到字符串1 =2015063000000001apple143566028812345678
>计算签名sign(对字符串1做md5加密,注意计算md5之前,串1必须为UTF-8编码)
sign=md5(2015063000000001apple143566028812345678)
sign=f89f9594663708c1605f3d736d01d2d4
完整请求为: http://api.fanyi.baidu.com/api/trans/vip/translate?q=apple&from=en&to=zh&appid=2015063000000001&salt=1435660288&sign=f89f9594663708c1605f3d736d01d2d4 也可以使用POST方法传送需要的参数。


提交URL后的返回值为JSON格式,利用json模块来进行解析。

第三部分:具体的实现(初步的简易实现版本已经获得~~,开心·~待我加一个界面进去)

1,Tkinter的使用

这里我们采用的是Tkinter,是python自带的一个库,是一个图形库,Tk会调用操作系统提供的本地的GUI接口,完成最终的GUI。

插个题外话,感觉自己越做越大的样子,,想想有点幸福呢,有想法就去做,等等就实现不了了。。。


继续Tkinter的学习,,我也在怀疑自己,我是不是应该为了找工作做准备呀,一直沉浸在自己的小世界中,是不是不太好。。。不管,今天要做一个小的界面出来。

简单的教程,参见大神的博客,我把参考的博客贴出来,以便后续的复习。

http://blog.csdn.net/wangyiyan315/article/details/16361065

大佬千千万,你说厉不厉害,就问你说厉害不厉害~~

对于Tkinter可以设置窗口的标题,窗口的大小,以及改变窗口的长宽问题;

其次说明其中的一些组件以及容器的概念

详情参见:https://www.cnblogs.com/kaituorensheng/p/3287652.html

http://lib.csdn.net/article/python/3615

具体的程序,我贴到这里,第一次做,能力有限,界面有点丑,之后改进。

# -*- coding: utf-8 -*-

import httplib
import md5
import urllib
import json
import random
from Tkinter import *
import tkMessageBox
from preprocess.utils import tools
import codecs
sys.path.append("./preprocess/data")

httpClient = None

class Application():

def __init__(self):

self._from = 'en'
self._to = 'zh'
self._appid = '**********'  # 安全起见,我就注释掉了
self._key = '********'

self.root = Tk()
self.root.title("翻译小软件-赵越")
self.root.geometry('800x800')

self.load_sys()
self.frm = Frame(self.root)
Label(self.frm, text="需要翻译的句子").pack()
self.l = Listbox(self.frm, width=80, height=20)
self.l.pack()
for item in self.text:
self.l.insert(END, item)

self.Button1 = Button(self.frm, text="翻译", command=self.GetResult)
self.Button1.pack()
self.Button2 = Button(self.frm, text="No Need", command=self.Getremove)
self.Button2.pack()
self.frm.pack()

def load_sys(self):
filename = tools.file_find("tweet_classification/train/tweets_test.txt")
file_m = codecs.open(filename, 'r')
self.text = []
for line in file_m.readlines():
line = line.strip().split('\t')
texts = line[0]
self.text.append(texts)

def Getremove(self):
self.l.delete(self.l.curselection())

def GetResult(self):

q = self.l.get(self.l.curselection())
q = q.encode('utf8')
myurl = '/api/trans/vip/translate'
salt = random.randint(10001, 99999)
sign = self._appid + q + str(salt) + self._key
m1 = md5.new()
m1.update(sign)
sign = m1.hexdigest()

myurl = myurl+'?appid='+self._appid+'&q='+urllib.quote(q)+'&from='+self._from+'&to='+self._to+'&salt='+str(salt)+'&sign='+sign
try:
httpClient = httplib.HTTPConnection('api.fanyi.baidu.com')
httpClient.request('GET', myurl)
response = httpClient.getresponse()
TransResult = response.read()
data = json.loads(TransResult)
# print data
dst = data['trans_result'][0]['dst']
# print dst
tkMessageBox.showinfo('text', "text is: %s" % dst)
# return self._dst
except:
print "error"

# ----------- 程序的入口 -----------
app = Application()
mainloop()


出来的效果图:



哇卡哇卡,,完成一次小的实践操作呢·~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: