文章目录
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的格式。我们可以用处理列表、字典的手段来提取翻译。
上码
import requests
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'}
r
= requests
.post
(url
, data
=data
)
answer
= r
.json
()
result
= answer
['translateResult'][0][0]['tgt']
print('"'+ word
+ '"的翻译结果:' + result
+ '\n')
if __name__
=="__main__":
while(1):
crawl
(input('请输入:'))
加界面
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
()
结果展示
✿✿ヽ(°▽°)ノ✿~