标签:python 有道 爬虫 js headers str fanyi salt md5
1、实现功能
首先我们需要实现在pycharm中输入每个单词可以直接获取内容
2、实现步骤
首先登陆有道翻译,获取该页的 Requests url(请求的网址(统一资源定位符)) REquest headers(头部请求内容) Form data(表单数据)
然后开始编写爬虫程序
import requests
keyword = input('请输入要翻译的单词:')
url ='http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
headers ={
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Connection': 'keep-alive',
'Content-Length': str(233+len(keyword)),
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': 'OUTFOX_SEARCH_USER_ID_NCOO=1943717867.319528; _ga=GA1.2.1847775097.1555988513; OUTFOX_SEARCH_USER_ID="-117950717@10.169.0.81"; JSESSIONID=aaa41HNsw8M6z6VigrxPw; ___rl__test__cookies=1556242344070',
'Host': 'fanyi.youdao.com',
'Origin': 'http://fanyi.youdao.com',
'Referer': 'http://fanyi.youdao.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
data_dic = {
'i': keyword,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': i,
'sign': md5_str,
'ts': r,
'bv': '5933be86204903bb334bf023bf3eb5ed',
'doctype':'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
response = requests.post(url = url,data = data_dic,headers = headers)
print(response.text)
运行程序之后会发现无法获取数据
3、错误分析
首先有道接口不会变也就是 requests url 不会错,请求头部内容只有请求的内容长短发生变换,其他不变
那么就是表单提交的内容发生了变化
上面三幅图是输入三个不同内容之后产生的表单数据,经过观察发现,只有salt(对应的是当前请求的时间戳)、ts(当前时间戳加一位1到10之间的随机数)、sign(经过哈希加密后的数据)发生了改变,这三者是经过js动态生成的,所以说对应的数据生成形式需要要js中进行分析,然后再用python写出对应生成方式
4、分析js中数据生成方式
找网站的js文件双击打开,复制粘贴后在线格式化,再复制到pycharm里就好了
5、在js中找到改变salt,sign,ts的函数
在复制到pycharm后按ctrl+f查找salt。
headers中的数据来源于客户端,目的地是服务器,所以headers中的数据要么是用户输入的值,要么是js自己或根据用户输入产生的动态值,js生成的数据会用变量接收,Form Data中的键名一般会(99.99%)与js中的变量名一致,因为是同一个人开发的这一模块。我们根据salt,sign,ts到js文件中按住ctrl+f查找找就能找到相应的功能函数,找到了就可以发现他们三个键的值是怎么生成的了,我们再用python实现js同样的功能就好了。
6、找到数据来源
在js代码中按ctrl+f查找salt找到下面代码块(可能有多个salt,按照理解分析找到对的地方)。
图中的e是以参数传进来的,我们要找他可以ctrl+f查询谁调用了这个r函数,就能得到参数e是啥了,即:查询r(e)或 = r( ,没错就是等号和单括号。 我找到的结果是:e就是我们输入的查询单词mode
最后一行给定了两个字符串,并且将e和i放进去一起进行md5加密
7、python实现相同逻辑
实现五处动态:
代码实现js相同逻辑
import requests
import time
import random
# 生成md5字符串
def getMd5(value):
import hashlib
md5 = hashlib.md5()
md5.update(bytes(value, encoding='Utf-8'))
md5_str = md5.hexdigest()
return md5_str
if __name__ == '__main__':
#输入单词
keyword = input('翻译的单词:')
#生成salt的值
r = str(int(time.time()*1000))
salt = r + str(int(random.random()*10))
#生成sign
value = "fanyideskweb" + keyword + salt + "@6f#X3=cCuncYssPsuRUE"
md5_str = getMd5(value)
#生成header
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.9,und;q=0.8,en;q=0.7',
'Connection': 'keep-alive',
'Content-Length': str(233+len(keyword)),
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': 'OUTFOX_SEARCH_USER_ID=-1475131016@10.169.0.83; OUTFOX_SEARCH_USER_ID_NCOO=6241167.578427844; _ga=GA1.2.1519057173.1535511777; JSESSIONID=aaamFTGK4qLCf4uKcrxPw; ___rl__test__cookies=1556242390777',
'Host': 'fanyi.youdao.com',
'Origin': 'http://fanyi.youdao.com',
'Referer': 'http://fanyi.youdao.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
#生成表单数据
data_dic = {
'i': keyword,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': md5_str,
'ts': r,
'bv': 'ae62d2e2541901f6ebf99ec18e429e3f',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
#接口地址
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
#发起网络请求
response = requests.post(url=url,data=data_dic,headers=headers)
print(response.text)
运行结果:
翻译的单词:job
{"translateResult":[[{"tgt":"工作","src":"job"}]],"errorCode":0,"type":"en2zh-CHS","smartResult":{"entries":["","n. 工作;职业\r\n","vt. 承包;代客买卖\r\n","vi. 做零工\r\n"],"type":1}}
标签:python,有道,爬虫,js,headers,str,fanyi,salt,md5 来源: https://blog.csdn.net/weixin_44239541/article/details/89576537
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。