1、有道翻译
''' |-- 代码思路解析: |-- 1、拿到网址首先查看network内Headers的:Request URL;User-Agent;From Data,这几个就是代码所需要的url地址和接口所需要传入的参数 |-- 2、编写代码:url,参数data放到一个字典内:data={},把From Data内的数据都拷贝到代码中并变成参数数组格式:data['smartresult']= 'dict' |-- 3、由于有道有反爬虫的机制,所以需要做进一步的处理: |-- 1)、未反爬虫处理前,报:{"errorcode":50} |-- 2)、打开network,发送两次请求,查看From Data,发现只有三个地方数据有变化:i,salt,sign(i:需要进行翻译的字符串如:尘封最帅;salt:加密 |-- 用到的盐,这个是破解反爬虫的关键点;sign:签名字符串,也是破解反爬虫的关键点) |-- 3)、查看网页源代码,查找所有js文件,我们找到fanyi.js,然后点击这个文件,跳转到源文件中,全部复制此代码到http://tool.chinaz.com/Tools/jsformat.aspx中,点击格式化 |-- 然后把格式化的代码复制出来,黏贴到subline内,然后搜索salt,找到相关代码:function(e, t) { var n = e("./jquery-1.7"); e("./utils"); e("./md5"); var r = function(e) { var t = n.md5(navigator.appVersion), r = "" + (new Date).getTime(), i = r + parseInt(10 * Math.random(), 10); return { ts: r, bv: t, salt: i, sign: n.md5("fanyideskweb" + e + i + "p09@Bn{h02_BIEe]$P^nG") } }; |-- 4)、分析这段代码发现:sign由四个字符串拼接而成:fanyideskweb e i p09@Bn{h02_BIEe]$P^nG; e :代表需要翻译的字符串 r :代表获取系统的时间戳 i :代表r的时间戳加上0-10的随机字符串 |-- 5)、通过以上4步,就知道了salt和sign的生成原理,这样就可以写python打代码来对接他的接口了 |-- 4、对数据进行编码处理 |-- 5、创建一个request对象,把url和data传进去,并且使用POST请求 |-- 6、打开这个请求 |-- 7、读取返回来的数据 |-- 8、把返回的json字符串解析成字典 |-- 9、不采用['translateResult'][0][0]['tgt']这种格式来翻译结果:{'type': 'ZH_CN2EN', 'errorCode': 0, 'elapsedTime': 0, 'translateResult': [[{'src': '尘封最帅', 'tgt': 'Dusty the most handsome'}]]} [0] :代表去掉[[{'src': '尘封最帅', 'tgt': 'Dusty the most handsome'}]]}中第一个[]和第二个[0] ['tgt'] :代表直接打印输出:tgt的结果 |-- 10、采用['translateResult'][0][0]['tgt']这种格式翻译的结果:翻译的结果:Dusty the most handsome ''' import urllib.request import urllib.parse import json import random import time import hashlib #用户输入翻译的内容 content = input('请输入需要翻译的内容:') #连接url地址 url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' #发送给服务器请求的数据 data = {} #破解反爬虫的参数 u = 'fanyideskweb' c = 'p09@Bn{h02_BIEe]$P^nG' e =content i =str(int(time.time()*1000)+random.randint(1,10)) sign = hashlib.md5((u+e+i+c).encode('utf-8')).hexdigest() #此部分数据来源于:FromData data['i']= content data['from']= 'AUTO' data['to']= 'AUTO' data['smartresult']= 'dict' data['client']= 'fanyideskweb' data['salt']= '15439012305959' data['sign']= 'ba81b8cb1c6dc64c253bf6d250cbc09b' data['ts']= '1543901230595' data['bv']= '6d37ec4625573a83fa9ca0cb1e144ce5' data['doctype']= 'json' data['version']= '2.1' data['keyfrom']= 'fanyi.web' data['action']= 'FY_BY_CLICKBUTTION' data['typoResult']= 'false' #对数据进行编码处理 data = urllib.parse.urlencode(data).encode('utf-8') #创建一个request对象,把url和data传进去,并且使用POS请求 request = urllib.request.Request(url = url,data=data,method='POST') #打开请求 reponsend =urllib.request.urlopen(request) #读取返回来的数据 html = reponsend.read().decode('utf-8') #把返回来的json字符串解析成字典 line = json.loads(html) #print(line) #获取翻译结果 print('翻译的结果:%s'%(line['translateResult'][0][0]['tgt'])) 参考文档:https://blog.csdn.net/ISxiancai/article/details/79349184 https://blog.csdn.net/nunchakushuang/article/details/75294947
2、urlopen()方法的timeout参数用于设置什么?
timeout参数用于设置连接的超时时间,单位是秒
3、如何从urlopen()返回的对象中获取http的状态码
reponse = urllib.request.urlopen(url)
code = reponse.getcode()
4、客户端合服务端之间的请求-响应,最常用的两种方式
get和post
5、User-Agent属性通常是记录什么信息、
普通浏览器通过该内容像访问网站提供你所使用的浏览器类型,操作系统,浏览器内核信息等
6、使用字符串的什么方法将其他编码转换成Unicode编码?
decode。 decode的作用是将其他编码的字符串转换成unicode编码, 相反,encode的作用是将unicode编码转换成其他编码的字符串
7、json是什么
用字符串把python的数据结构封装起来,便于存储和使用
#把返回来的json字符串解析成字典 line = json.loads(html)
8、配合EasyGui,给下载一只猫的代码增加互动
* 让用户输入尺寸
* 如果用户不输入尺寸,那么默认按宽400,高600下载猫
* 让用户指定位置保存
import easygui as g import urllib.request def main(): #用户自己选择下载的猫的尺寸 title = '下载一只猫' msg = '填写下载猫的尺寸' fieldsnames = ['宽','高'] fieldsvalues = [] size = width,height = 400,600 fieldsvalues = g.multenterbox(msg,title,fieldsnames,size) #判断输入宽和高为空,非整数时的容错 while 1: if fieldsvalues == None: break errmsg = "" try: width = int(fieldsvalues[0].strip()) except: errmsg += '宽度必须为整数' try: height = int(fieldsvalues[1].strip()) except: errmsg += '高度必须为整数' if errmsg == "": break fieldsvalues = g.multenterbox(errmsg,title,fieldsnames,fieldsvalues) #爬取猫的网站 url = "http://placekitten.com/g/%d/%d" %(width,height) reponse = urllib.request.urlopen(url) cat_img = reponse.read() filepath = g.diropenbox("请选择存放猫的文件夹") #命名下载的图片文件名称 if filepath: filename = '%s/cat_%d*%d.jpg'%(filepath,width,height) else: filename = 'cat_%d*%d.jpg'%(width,height) #写入文件 with open(filename,'wb') as f: f.write(cat_img) if __name__ == '__main__': main()