相信大家在学编程的时候都会遇到自己不会的单词,而去网上百度,比如百度翻译啊,谷歌翻译啊,有道翻译啊,那么自己写一个是不是很有趣呢?下面就来解释一下爬取原理
用到的库有urllib,json,time,后两个都是python自带的库,所以只需要下载urllib库就可以,我用的python版本是3.7的,没有python的自行网上下载就可以
打开网页版本的有道 翻译,我用的是谷歌浏览器,不过其他浏览器应该也差不多,打开之后右击检查选项或者直接按F12都可以进入开发者模式,进入之后点击network会显示所有的网络请求,在上面的翻译板随便写一个要翻译的内容,点击翻译如下
会看到显示很多的网络请求,那到底哪个会藏着我们想要的数据呢?根据上图,我们点击第一条数据进去看一下
点击对应的response响应文件看看有没有我们想要的数据,可以看到,我们在点击翻译按钮的时候,发送的请求就是上图中Request URL的那个URL,然后我们再点击那个Response,我们可以看到返回的结果
并且在headers中最底下有个from_data数据,该数据是json类型的,可以看到i的值使我们输入要翻译的内容,from跟to前者是接收,后者是输出
接下来我们就可以开始写程序了,导入包
import urllib.request
import json
import urllib.parse
import time
给它一个循环,实现执行一次可继续执行
while True:
获取url和headers,url就是上面headers里面的Request URL,headers就是headers里面的User-Agent,就是用户代理,用来模仿浏览器访问的,因为当时是用手机模式弄得,所以这里就不展示了,也可以用IP代理
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
headers
上面说过from_data里面的数据是json数据类型的,如果json不会的还是自己去学一下先吧(因为这里不是主讲),所以在程序里面要把它弄成json数据类型,其实就是键-值的对应关系
form_Data = {} #用一个列表装着
form_Data['i'] = content
form_Data['from'] = 'AUTO'
form_Data['to'] = 'AUTO'
form_Data['smartresult'] = 'dict'
form_Data['client'] = 'fanyideskweb'
form_Data['doctype'] = 'json'
form_Data['version'] = '2.1'
form_Data['keyfrom'] = 'fanyi.web'
form_Data['action'] = 'FY_BY_REALTIME'
form_Data['typoResult'] = 'false'
获取url,请求头(request URL),数据之后进行解码,就是把乱七八糟的变成我们能看得懂的
data = urllib.parse.urlencode(form_Data).encode('utf-8') #以utf-8的形式
req = urllib.request.Request(url, data, head)
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8') #以utf-8的形式
result = json.loads(html) #返回json数据
完整代码如下
import urllib.request
import json
import urllib.parse
import time
while True:
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
head = {'http': '183.63.123.3:56489'}
content = input('请输入要翻译的内容:') #接收用户输入
if content == "q": #如果输入q并且回车则退出程序
break
form_Data = {}
form_Data['i'] = content
form_Data['from'] = 'AUTO'
form_Data['to'] = 'AUTO'
form_Data['smartresult'] = 'dict'
form_Data['client'] = 'fanyideskweb'
form_Data['doctype'] = 'json'
form_Data['version'] = '2.1'
form_Data['keyfrom'] = 'fanyi.web'
form_Data['action'] = 'FY_BY_REALTIME'
form_Data['typoResult'] = 'false'
data = urllib.parse.urlencode(form_Data).encode('utf-8')
req = urllib.request.Request(url, data, head)
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
result = json.loads(html)
print("翻译的结果是:%s" % (result['translateResult'][0][0]['tgt'])) #打印json数据中键对应的值
time.sleep(1) #延时一秒
效果图如下,是不是挺简单又好玩呢?
正在尝试写博客,把会的分享给你们,如有写的不好的地方,希望指点一下,谢谢!