记录维维的每一篇Hello World

需要安装的第三方库
pip install requests
使用到的模板/库
import requestsimport timeimport randomimport hashlibimport re
爬取步骤
一、获取请求url以及请求数据
1、前往有道翻译官网https://fanyi.youdao.com/获取,不知道怎么获取可以看【python爬虫】爬取百度翻译,里面有获取步骤,跟着步骤走就可以得到以下数据。
# 需要的数据data = {'i': '你好','from': 'AUTO','to': 'AUTO','smartresult': 'dict','client': 'fanyideskweb','salt': '16469009309320','sign': '1919a97164a3f49c2f7952950f9fec45','lts': '1646900930932','bv': '8485025d8b016004f09679843317d954','doctype': 'json','version': '2.1','keyfrom': 'fanyi.web','action': 'FY_BY_REALTlME'}# 请求urlurl = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
二、分析请求数据
1、因为有道翻译有反爬机制,所以需要分析数据,才能使用。

2、通过多次的翻译分析后就可以看到(这里只放两张图片展示)数据中:
i 是我们需要翻译的文字,
from 是原文的语言类型,如 cn 表示中文, AUTO是自动识别,
to 是需要目标翻译的语言类型,
lts 是时间戳(需要注意的是,JavaScript的时间戳是以毫秒计算的,我们后期写入的时候需要更改),
salt 是时间戳(lts)加一个随机数字,
sign 是一段通过md5加密的字符,需要分析js文件才能知道怎么生成,
其他参数均不变。
三、分析js文件,得到加密字符
1、打开有道翻译官网: https://fanyi.youdao.com/,按下F12打开工具,查看元素,在上面就可以看到有三个js文件的链接,依次打开,最终确定sign参数是在https://shared.ydstatic.com/fanyi/newweb/v1.1.9/scripts/newweb/fanyi.min.js中生成的。
2、打开js文件的链接https://shared.ydstatic.com/fanyi/newweb/v1.1.9/scripts/newweb/fanyi.min.js
3、可以看到,是一段很乱的JavaScript代码,很难从中提取出我们想要的东西,不过也有格式化js代码的网站,百度一下就可以找到,当然,也可以用python快速提取我们想要的字符。
#!../venv/Scripts python# -*- coding:utf-8 -*-# Project: get js# Created by 维维import requestsimport redef get_signs(url_js: str):"""得到加密字符:param url_js: fanyi.min.js的链接:return: 匹配到的加密字符"""header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.30"}response = requests.get(url=url_js, headers=header)response.encoding = 'utf-8'text = response.textres = re.search('\"fanyideskweb\"\s?\+\s?[a-zA-Z]\s?\+\s?[a-zA-Z]\s?\+\s?\"(.*?)\"', text, re.S)try:return res.group(1)except AttributeError:return Nonedef get_url_js():"""得到js代码的请求url:return: fanyi.min.js的链接"""url_yd = 'https://fanyi.youdao.com/'header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.30"}response = requests.get(url=url_yd, headers=header)response.encoding = 'utf-8'html = response.text# print(html)# 正则匹配想要的链接http_js = re.findall('<script.*?src="(http[s]?://[a-zA-Z0-9./]*fanyi.min.js)"></script>', html)try:return http_js[0]except IndexError:return Noneif __name__ == '__main__':# js的urljsUrl = get_url_js()# 匹配并打印if jsUrl is not None:md5Str = get_signs(url_js=jsUrl)print(md5Str)else:print("匹配失败")
四、实现翻译功能
数据齐全,就可以开始实现了,简单实现过程。
#!../venv/Scripts python# -*- coding:utf-8 -*-# Project: 有道翻译# Created by 维维import requestsimport timeimport randomimport hashlibdef youdao(text):e = texttimestamp = str(time.time()).replace('.', '')lts = str(int(timestamp * 1000))salt = lts + str(random.randint(0, 9))# md5加密sign_str = 'fanyideskweb' + e + salt + 'Ygy_4c=r#e#4EX^NUGUc5'sign = hashlib.md5(sign_str.encode(encoding='UTF-8')).hexdigest()data = {'i': e,'from': 'AUTO','to': 'AUTO','smartresult': 'dict','client': 'fanyideskweb','salt': salt,'sign': sign,'lts': lts,'bv': '8485025d8b016004f09679843317d954','doctype': 'json','version': '2.1','keyfrom': 'fanyi.web','action': 'FY_BY_REALTlME'}url = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.30",'Cookie': 'OUTFOX_SEARCH_USER_ID=-1154806696@10.168.8.76; \OUTFOX_SEARCH_USER_ID_NCOO=1227534676.2988937; \JSESSIONID=aaa7LDLdy4Wbh9ECJb_Vw; ___rl__test__cookies=1563334957868','Referer': 'https://fanyi.youdao.com/'}response = requests.post(url, data=data, headers=header)response.encoding = 'utf-8'result = response.json()if result['errorCode'] == 0:return result['translateResult'][0][0]['tgt']else:return textif __name__ == '__main__':while True:text1 = input("你想翻译的原文: ")if text1 == 'q':breaktext2 = youdao(text1)print("原文: ", text1, "\n翻译: ", text2, end='\n\n')
完整源码
#!../venv/Scripts python# -*- coding:utf-8 -*-# Project: 有道翻译# Created by 维维import requestsimport timeimport randomimport hashlibimport reclass Youdao:def __init__(self):"""爬取有道翻译,实现翻译功能"""self.__i = ''self.__from = 'AUTO'self.__to = 'AUTO'self.__url = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'self.__url1 = 'https://fanyi.youdao.com/'self.__header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.30",'Cookie': 'OUTFOX_SEARCH_USER_ID=-1154806696@10.168.8.76; \OUTFOX_SEARCH_USER_ID_NCOO=1227534676.2988937; \JSESSIONID=aaa7LDLdy4Wbh9ECJb_Vw; ___rl__test__cookies=1563334957868','Referer': 'https://fanyi.youdao.com/'}self.__sleep_second = 3self.__signs = self.__get_signs()self.__doc__ = "爬取有道翻译,实现翻译功能,仅作为学习使用"@propertydef url(self):"""有道翻译官网"""return self.__url@propertydef header(self):"""请求头"""return self.__headerdef set_sleep_second(self, second: int):"""设置出现错误时停留时间(s):param second: 停留时间"""self.__sleep_second = seconddef set_from_to(self, f: str, t: str):"""设置原文和翻译语言类型,默认为AUTO:param f: 原文语言类型:param t: 翻译语言类型"""self.__from = fself.__to = tdef __get_signs(self):"""得到sign中的加密字符:return: 加密字符"""response = requests.get(url=self.__url1, headers=self.__header)# 正则匹配想要的链接http_js = re.findall('<script.*?src="(http[s]?://[a-zA-Z0-9./]*fanyi.min.js)"></script>', response.text)try:response1 = requests.get(url=http_js[0], headers=self.__header)except IndexError as ie:print("IndexError:", ie)time.sleep(self.__sleep_second)self.__get_signs()res = re.search('\"fanyideskweb\"\s?\+\s?[a-zA-Z]\s?\+\s?[a-zA-Z]\s?\+\s?\"(.*?)\"', response1.text, re.S)try:return res.group(1)except AttributeError as ae:print("AttributeError:", ae)time.sleep(self.__sleep_second)self.__get_signs()def __translate(self):"""翻译实例"""timestamp = time.time()lts = str(int(timestamp * 1000))salt = lts + str(random.randint(0, 9))signs = 'fanyideskweb' + self.__i + salt + self.__signssign = hashlib.md5(signs.encode(encoding='UTF-8')).hexdigest()data = {'i': self.__i,'from': self.__from,'to': self.__to,'smartresult': 'dict','client': 'fanyideskweb','salt': salt,'sign': sign,'lts': lts,'bv': '8485025d8b016004f09679843317d954','doctype': 'json','version': '2.1','keyfrom': 'fanyi.web','action': 'FY_BY_REALTlME'}response = requests.post(url=self.__url, data=data, headers=self.__header)response.encoding = 'utf-8'result = response.json()self.__result = result['translateResult'][0][0]['tgt'] if result['errorCode'] == 0 else ''def translate(self, string: str) -> str:"""翻译功能:param string: 需要翻译的原文:return: 翻译的内容"""self.__i = stringself.__translate()return self.__resultdef translate_show(self, string: str):"""翻译并打印:param string: 需要翻译的原文"""self.__i = stringself.__translate()if self.__result == '':print(string)else:print(self.__result)if __name__ == '__main__':# 需要翻译的内容s = '人生苦短,我用python'print(s)# 实例化yd = Youdao()# 翻译并打印yd.translate_show(string=s)# 打印有道官网# print(yd.url)
python环境
电脑:Windows10
python:3.8.8(建议3.7以上)
