1. 网页分析
首先要选择一个翻译网站,在这里我们选择有道翻译,进入网站:
然后检查元素,这里我们直接在network中可能找不到相应信息,我们在输入框中输入随机内容,然后点击翻译,这时就会发生变化。
找到左边这个文件,查看其中的Headers内容,这个URL就是我们解析时候需要用到的网址:
http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
注意在使用这个url的时候把_o给删除掉,不然会影响程序的运行,然后往下拉,这些为我们需要使用到的data信息。
防止网页对机器人的屏蔽,我们可以模拟浏览器进行访问,找到相应内容添加到代码中。
最后再点击Headers旁边的preview,我们可以看到输入的爬虫内容与它的翻译结果被放到了一个字典当中,我们最后再读取这个内容即可。
2. 完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | import urllib.request # 导入模块 import urllib.parse import json class Trs: def __init__( self ): url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule" content = input ( "翻译内容:" ) data = {} data[ 'i' ] = content data[ 'from' ] = 'AUTO' data[ 'to' ] = 'AUTO' data[ 'smartresult' ] = 'dict' data[ 'client' ] = 'fanyideskweb' data[ 'salt' ] = '15823411455528' data[ 'sign' ] = 'd03024a90896a5eb31a74a9344657b0e' data[ 'doctype' ] = 'json' data[ 'version' ] = '2.1' data[ 'keyfrom' ] = 'fanyi.web' data[ 'action' ] = 'FY_BY_REALTlME' data = urllib.parse.urlencode(data).encode( 'utf-8' ) r = urllib.request.Request(url, data) r.add_header( 'User-Agent' , 'Mozilla / 5.0 (Windows NT 10.0 ; Win64; x64) AppleWebKit / 537.36 (KHTML, like Gecko) Chrome / 79.0 . 3945.130 Safari / 537.36 ') response = urllib.request.urlopen(r) html = response.read().decode( 'utf-8' ) trs = json.loads(html) result = trs[ 'translateResult' ][ 0 ][ 0 ][ 'tgt' ] print ( "翻译结果:" ,result) if __name__ = = "__main__" : a = Trs() |
3. 代码分析
我们使用了前面我们看到的data参数,创建一个字典来存放这些data数据,然后发送请求的时候使用data参数,然后把相应的内容与我们在网页中看到的一一对应,再模拟浏览器访问,我们可以通过print来输出一下返回的json字符。
1 2 3 4 | trs = json.loads(html) print (trs) result = trs[ 'translateResult' ][ 0 ][ 0 ][ 'tgt' ] print ( "翻译结果:" ,result) |
输出结果为:
翻译内容:爬虫
1 2 3 | { 'type' : 'ZH_CN2EN' , 'errorCode' : 0 , 'elapsedTime' : 2 , 'translateResult' : [[{ 'src' : '爬虫' , 'tgt' : 'The crawler' }]]} 翻译结果: The crawler |
也就是输出为一个字典,我们想要获取的内容存放在一个二维列表当中,我们通过访问其索引值的方式找到它就可。
1 | trs[ 'translateResult' ][ 0 ][ 0 ][ 'tgt' ] |
我们再通过几次测试来看一下输出结果:
1 2 3 4 5 6 7 8 | 翻译内容:惟沉默是最高的轻蔑{ 'type' : 'ZH_CN2EN' , 'errorCode' : 0 , 'elapsedTime' : 18 , 'translateResult' : [[{ 'src' : '惟沉默是最高的轻蔑' , 'tgt' : 'But silence is supreme contempt' }]]} 翻译结果: But silence is supreme contempt 翻译内容:其实地上本没有路,走的人多了,也便成了路 { 'type' : 'ZH_CN2EN' , 'errorCode' : 0 , 'elapsedTime' : 20 , 'translateResult' : [[{ 'src' : '其实地上本没有 路,走的人多了,也便成了路 ', ' tgt ': ' Actually the earth had no road, walk of person many, also then became road'}]]} 翻译结果: Actually the earth had no road, walk of person many, also then became road |
如果我们输入的语句分开的时候:
1 2 3 4 5 | 翻译内容:勇者愤怒,抽刃向更强者;怯者愤怒,却抽刃向更弱者 { 'type' : 'ZH_CN2EN' , 'errorCode' : 0 , 'elapsedTime' : 2 , 'translateResult' : [[{ 'src' : '勇者愤怒,抽刃向 更强者; ', ' tgt ': ' A brave man angry, blade to more strong; '}, {' src ': ' 怯者愤怒,却抽刃向更弱者' , 'tgt' : 'Afraid of anger, but blade to a weak one' }]]} 翻译结果: A brave man angry, blade to more strong; |
这样的语句被分成了两句,我们就需要更改输出信息来完成翻译,代码如下:
1 2 3 | result1 = trs[ 'translateResult' ][ 0 ][ 0 ][ 'tgt' ] result2 = trs[ 'translateResult' ][ 0 ][ 1 ][ 'tgt' ] print ( "翻译结果:" ,result1 + result2) |
输出结果为:
1 2 3 4 5 6 7 | 翻译内容:勇者愤怒,抽刃向更强者;怯者愤怒,却抽刃向更弱者 { 'type' : 'ZH_CN2EN' , 'errorCode' : 0 , 'elapsedTime' : 1 , 'translateResult' : [[{ 'src' : '勇者愤怒,抽刃 向更强者; ', ' tgt ': ' A brave man angry, blade to more strong; '}, {' src ': ' 怯者愤怒,却抽刃向更弱者 ', ' tgt': 'Afraid of anger, but blade to a weak one'}]]} 翻译结果: A brave man angry, blade to more strong;Afraid of anger, but blade to a weak one |
4. 总结
本节我们主要学习了如何去爬取一些翻译来的内容,这是一个比较经典的爬虫入门题目,在使用爬虫的过程中要掌握的就是如何去从网页源码中找到我们需要的信息,把这一点掌握熟练之后可以进行更深层次的爬虫项目,下一节我们把这两节的内容通过事件管理结合在一起来完成我们的简单翻译器。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程