爬虫—有道翻译案例分析
最近也是刚开始学爬虫,就做这个比较简单的案例,把学习和分析的思路记录一下~ 关键词:request、post、抓包、js分析、MD5加密等
一、分析思路
- 有道翻译url:https://fanyi.youdao.com/
-
这里使用的是谷歌浏览器(无痕) -
右键检查,输入需要翻译的单词或句子 -
抓包 -
请求头的话这里就不重点说了,User-Agent、cookies、Referer三个字段最好都能加上 -
我们可以看到请求方式为post,那么就要重点分析提交的表单数据; -
表单参数一般为固定写死的和动态变化的,固定的可以直接写上去,变化的则需要分析变化情况并找出一定的规律 -
我们可以通过多次发多次请求来观察哪些是变的,哪些是不变的; -
下面对 “ 你好 ”发起两次请求 -
通过对比FormData里面的参数可以发现: salt 、sign、lts 这三个字段的参数是动态变化的(如果感觉不保险,可以多发几次请求观察)
import requests
import hashlib
import time
import random
class Youdao(object):
def __init__(self,word):
self.url = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
self.headers = {
'Cookie': 'OUTFOX_SEARCH_USER_ID=-676104602@10.108.160.100; JSESSIONID=aaac40qHRBaDr_iGhSLUx; OUTFOX_SEARCH_USER_ID_NCOO=696608045.4734024; fanyi-ad-id=115021; fanyi-ad-closed=1; ___rl__test__cookies=1630572993167',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
'Referer': 'https: // fanyi.youdao.com /'
}
self.formdata = None
self.word = word
def generate_formdata(self):
word = self.word
"""
1.分析表单中动态变化的参数(多次抓包对比)
2.全局搜索动态参数的字段或者值
3.找出对应实现的js代码,打断点分析
ts: "" + (new Date).getTime(),
salt: r + parseInt(10 * Math.random(), 10);
sign: n.md5("fanyideskweb" + e + i + "Y2FYu%TNSbMCxc3t2u^XT") MD5 加密算法
"""
lts = str(time.time()*1000)
salt = lts + str(random.randint(1,9))
tempstr = "fanyideskweb" + self.word + salt + "Y2FYu%TNSbMCxc3t2u^XT"
md5 = hashlib.md5()
md5.update(tempstr.encode())
sign = md5.hexdigest()
self.formdata = {
'i': word,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': sign,
'lts': lts,
'bv': '89e18957825871c419be045180c67d3b',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_CLICKBUTTION'
}
def get_data(self):
response = requests.post(url=self.url,headers=self.headers,data=self.formdata)
return response.json()
def run(self):
self.generate_formdata()
data = self.get_data()
result = data['translateResult'][0][0]['tgt']
print(result)
if __name__ == '__main__':
word = input('请输入需要翻译的汉语:')
Youdao = Youdao(word)
Youdao.run()
|