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



Python爬虫实例:自制翻译机

一起试试爬取有道翻译自制翻译器吧ლ(^ω^ლ) ,自己动手做个翻译器吧,一点都不难哦~
用post和json,短短几行(或者说二十几行)就可以做到!


要求实现功能:用户输入英文或中文,程序即可打印出来对应的译文。

实现一键翻译的功能,最简单的方案便是爬虫。在此,我们选择的网站是有道翻译:http://fanyi.youdao.com/

然后还是那套熟悉的流程:F12 --> Network --> 操作 --> 在新加载出来的请求中(判断数据是否在URL里)寻找我们需要的数据 --> 对比、找规律。


步骤

放一下我操作的流程图吧,易知要在XHR里找要的数据:

在这里插入图片描述
然后输入要翻译的文字,找到我们需要的数据:

在这里插入图片描述

然后我们要去看Header里面,找到我们真正要请求的URL。然后再操作几次,得到URL的规律:

在这里插入图片描述
(有bug,往下看)
然后就可以写代码啦~~!封装成函数更好看嗷


解决反爬

但是我们会遇到一个问题,就是有道翻译有反爬虫机制,它使用了加密技术。你的程序可能会报错:{“errorCode”:50},它的解决方法基本都是删除url中的"_o",目的大概就是绕过有道翻译的反爬虫机制,也就是saltsign
在这里插入图片描述
当url中包含"_o"的时候会自动包含如下两个参数:salt,sign,仔细看的话,这两个参数值是会变的,只是变化不明显而已。所以我们不要它俩做参数就奥K。

服务器返回的内容,是json的格式。我们可以用处理列表、处理字典的手段来提取翻译。


上码

# -*- coding:utf-8 -*-
import requests

# 把代码封装成函数更python
def crawl(word):
    url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
    data = {'i': word,
            'from': 'AUTO',
            'to': 'AUTO',
            'smartresult': 'dict',
            'client': 'fanyideskweb',
            'doctype': 'json',
            'version': '2.1',
            'keyfrom': 'fanyi.web',
            'action': 'FY_BY_REALTIME',
            'typoResult': 'false'}
    # 将需要post的内容,以字典的形式记录在data内。
    r = requests.post(url, data=data)
    # post需要输入两个参数,一个url,一个是data,返回的是一个Response对象
    answer = r.json()
    result = answer['translateResult'][0][0]['tgt']
    print('"'+ word + '"的翻译结果:' + result + '\n')

if __name__=="__main__":
    while(1): 	#自己设计输入结束的条件,原谅我弄了个死循环
        crawl(input('请输入:'))

界面

我们也可以给它加个好看的(丑丑的)界面(其实好不好看不重要,能实现就8错了!)。

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import requests
from tkinter import Tk,Button,Entry,Label,Text,END

class YouDaoFanyi(object):
    def __init__(self):
        pass
    def crawl(self,word):
        url='http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
        data={'i': word,
              'from': 'AUTO',
              'to': 'AUTO',
              'smartresult': 'dict',
              'client': 'fanyideskweb',
              'doctype': 'json',
              'version': '2.1',
              'keyfrom': 'fanyi.web',
              'action': 'FY_BY_REALTIME',
              'typoResult': 'false'}
        r = requests.post(url, data)
        answer = r.json()
        result = answer['translateResult'][0][0]['tgt']
        return result

class Application(object):
    def __init__(self):
        self.window = Tk()
        self.fanyi = YouDaoFanyi()
		#窗体名字
        self.window.title(u'My Translation')
        #可以自己调整窗口大小
        self.window.geometry('300x400+500+300')
        self.window.minsize(300,400)
        self.window.maxsize(300,400)
        
        self.entry = Entry(self.window)
        self.entry.place(x=10,y=10,width=200,height=25)
        self.entry.bind("<Key-Return>",self.submit1)
        
        self.result_text1 = Text(self.window,background = 'azure')
        self.result_text1.place(x = 10,y = 5,width = 285,height = 155)
        self.result_text1.bind("<Key-Return>",self.submit1)

        self.submit_btn = Button(self.window,text=u'翻译',command=self.submit)
        self.submit_btn.place(x=205,y=165,width=35,height=25)
        self.submit_btn2 = Button(self.window,text=u'清空',command = self.clean)
        self.submit_btn2.place(x=250,y=165,width=35,height=25)

        self.title_label = Label(self.window,text=u'翻译结果:')
        self.title_label.place(x=10,y=165)

        self.result_text = Text(self.window,background = 'light cyan')
        self.result_text.place(x = 10,y = 190,width = 285,height = 165)

    def submit1(self,event):
        content = self.result_text1.get(0.0,END).strip().replace("\n"," ")
		result = self.fanyi.crawl(content)
		self.result_text.delete(0.0,END)
        self.result_text.insert(END,result)

    def submit(self):
        content = self.result_text1.get(0.0,END).strip().replace("\n"," ")
        result = self.fanyi.crawl(content)
        self.result_text.delete(0.0,END)
        self.result_text.insert(END,result)
        print(content)

    def clean(self):
        self.result_text1.delete(0.0,END)
        self.result_text.delete(0.0,END)

    def run(self):
        self.window.mainloop()

if __name__=="__main__":
    app = Application()
    app.run()

结果展示

在这里插入图片描述


✿✿ヽ(°▽°)ノ✿~


————————每个人都在抱怨生活不易,可是都在默默为生活打拼————————

发布了16 篇原创文章 · 获赞 113 · 访问量 4893

猜你喜欢

转载自blog.csdn.net/qq_43280818/article/details/96442502