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

it2022-05-05  111

文章目录

Python爬虫实例:自制翻译机要求实现功能:用户输入英文或中文,程序即可打印出来对应的译文。步骤解决反爬上码加界面结果展示

Python爬虫实例:自制翻译机

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

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

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

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

步骤

放一下我操作的流程图吧,因为这是个动态的网页,前面的博客也有说到,所以我们要在XHR里找想要的数据:

然后输入要翻译的文字,找到我们需要的数据:

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

(有bug,往下看) 然后就可以写代码啦~~!封装成函数更好看嗷

解决反爬

但是我们会遇到一个问题,就是有道翻译有反爬虫机制,它使用了加密技术。你的程序可能会报错:{“errorCode”:50},它的解决方法基本都是删除url中的"_o",目的大概就是绕过有道翻译的反爬虫机制,也就是salt和sign。 当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('请输入:'))

加界面

#!/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') # 喜欢什么背景色就在这里面找哦,但是有色差,得多试试:http://www.science.smith.edu/dftwiki/index.php/Color_Charts_for_TKinter 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()

结果展示

✿✿ヽ(°▽°)ノ✿~


最新回复(0)