利用Python爬虫进行文本翻译
先呈上代码
**
import requests
from hashlib import md5
import time
url = "https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Connection": "keep-alive",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Cookie": 'OUTFOX_SEARCH_USER_ID_NCOO=258969939.9054812; OUTFOX_SEARCH_USER_ID="403847401@10.105.137.204"; JSESSIONID=aaab1cTKoo2Qp4ttxfd_x; ___rl__test__cookies=1647172042537',
"Accept-Language": "zh-CN,zh;q=0.9",
"Origin": "https://fanyi.youdao.com",
"Referer": "https://fanyi.youdao.com/",
"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",
}
dic = {
"i": None,
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"salt": "16471717107666",
"sign": "4",
"lts": "1647171710766",
"bv": None,
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_REALTIME"
}
if __name__ == '__main__':
while True:
dic["bv"] = md5(headers["User-Agent"].encode("utf-8")).hexdigest()
dic["i"] = input("请输入你想查询的内容:")
dic["lts"] = str(int(time.time()*1000))
dic["salt"] = dic["lts"] + '9'
e = dic["i"]
sign_text = "fanyideskweb{}{}Ygy_4c=r#e#4EX^NUGUc5".format(e, dic["salt"])
dic["sign"] = md5(sign_text.encode("UTF-8")).hexdigest()
res = requests.post(url=url, data=dic, headers=headers).json()
print(res["translateResult"][0][0]["tgt"])在这里插入代码片**
首先url对应我们的请求网址,您可以通过浏览器右键检查,找到network,这是浏览器的抓包工具,他会显示出浏览器的各种请求。当你在翻译框中输入文字时,network会随之刷新,然后再那一堆包中查找我们想要的内容,一般这种翻译就是post请求。找到请求的网址,如下图 图中的请求网址就是我们所需要的网址。
然后就是请求头文件headers,它里面包含了翻译的规定还有浏览器的相关参数比如User-Agent就是你的电脑和你的浏览器的相关信息,缺少这些信息可能会让你请求失败,这些信息你可以在上图中的请求表头中寻找。
最后就是所要传输的数据了,这里的数据为一个字典您可以在载荷中找到这些数据,载荷顾名思义就是传输过程中运载的东西,包含了你所翻译的内容和一些反爬的变量。为了防止利用爬虫来爬取数据,很多公司都采取了一些反扒爬技术,这里主要有四个变量需要我们注意,分别是是salt、sign、lts、bv,您可以通过设置断点的方式找到这些变量的所在位置并找到他们的表达式(由于我也不是很了解js这里就不过多解释了)这里放上他们的表达式。浏览器采用的是JavaScript语言,如果您对该语言有所了解可以直接建立一个JS文件进行调用。如果不了解就把这几句话转化成python语言(见代码部分)。由于每次翻译不同的内容这些变量的值都不同,所以需要在main函数中进行计算后在赋值给dic中的各部分。 最后运行就可以进行翻译了!
为什么用有道翻译呢?因为比较简单,刚开始我用的是百度翻译,结果百度的加密对我来说有亿点复杂最后只能翻译小段话,句子一变长就不行了(还是我太菜~),最后就用了有道翻译。等我再研究研究看百度翻译如何爬取。
(本人很菜有说的不对的地方还请指正)
|