出去一趟才知道英文的重要性!
回来做一个有道翻译的爬虫项目,帮助日常查询学习单词
私信博主01 领取完整项目代码!
知识点:
爬虫
反爬分析
效果:
开始制作
▲▲▲
分析:
打开有道词典,查看翻译请求的url,封装的headers信息,以及下面的data数据信息
要找到数据中salt,sign,ts,bv字段的生成方式
通过打开相应的js文件
搜到要查看的字段,分析js代码
bv: 版本号的md5加密
ts: 一个时间戳
salt: 时间戳+一个10以内的随机数
sign: 两段固定值+带翻译字段+salt合成的字段md5加密
代码:
import requests from hashlib import md5 import random import time import json class YDTranslate(): def __init__(self, key, encry_string): #获取一些初始字段 self.url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule' self.key = key self.appVersion = '5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36' self.encry_string = encry_string self.ts = self.ts() self.bv = self.bv() self.salt = self.salt() self.sign = self.sign() #封装headers信息 self.headers = { 'Accept':'application/json, text/javascript, */*; q=0.01', 'Accept-Language':'zh-CN,zh;q=0.9', 'Connection':'keep-alive', 'Content-Length':'251', 'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8', 'Cookie':'OUTFOX_SEARCH_USER_ID=-275607117@10.169.0.83; OUTFOX_SEARCH_USER_ID_NCOO=447981333.4251267; _ga=GA1.2.241140362.1560759881; _ntes_nnid=a2b8b52948e9f02708d0778613e1d3a6,1562727377858; JSESSIONID=aaau-eQ5b0In65Q1xY-4w; ___rl__test__cookies=1573028282928', 'Host':'fanyi.youdao.com', 'Origin':'http://fanyi.youdao.com', 'Referer':'http://fanyi.youdao.com/', 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36', 'X-Requested-With':'XMLHttpRequest', } #封装data信息 self.data = { 'i': key, 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb', 'salt': self.salt, 'sign': self.sign, 'ts': str(self.ts), 'bv': self.bv, 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web', 'action': 'FY_BY_REALTIME', } def ts(self): return int(time.time()*1000) def bv(self): s = md5() s.update(self.appVersion.encode()) return s.hexdigest() def salt(self): return str(self.ts) + str(random.randint(0, 10)) def sign(self): string = "fanyideskweb" + self.key + str(self.salt) + self.encry_string s = md5() s.update(string.encode()) return s.hexdigest() def get_translate(self): '''获取翻译结果''' res = requests.post(self.url, data=self.data, headers=self.headers) res.encoding = 'utf-8' html = res.text rDict = json.loads(html) translate = rDict['translateResult'][0][0]['tgt'] try: rList = rDict['smartResult']['entries'] reslist = ''.join(rList) print('翻译:{0} \n解释:{1}'.format(translate, reslist)) except: pass return translate #调用翻译类 print('====单词翻译====') print('---输入quit退出---') while True: key = input('请输入要翻译的单词:') if key != 'quit': encry_string = 'n%A-rKaT5fb[Gy?;N5@Tj' res = YDTranslate(key, encry_string) res.get_translate() else: break
使用pyinstall打包
完成!!!