以下以有道翻译网站为例介绍爬取时存在的问题
1.1 先进入网站进行访问,使用开发者工具抓包找出服务器返回的数据包的api
1.2 而后查看请求头,观察交互过程,请求方式为post,且部分Form Data进行了加密,i为需要翻译的输入内容,其他均不变
在这里插入图片描述
1.3 接下来用全局搜索寻找数据包的来源及formdata的出处,并找出可变参数的实现过程
1.4 在js代码中找出参数生成的过程,也可在浏览器控制台中调试生成代码
2.1 可变参数生成
import random
import time
from hashlib import md5
# ts:
# 时间戳:格林尼治时间(1970.1.1.00.00.00)到当下的总秒数
r=str(time.time()*1000)
# salt:
i=r+str(random.randint(0,10))
# sign:
sign=md5(("fanyideskweb" + word + salt + "Nw(nmmbP%A-r6U3EUn]Aj").encode()).hexdigest()
2.2 全部代码
import requests
import time
from hashlib import md5
import random
def main ():
url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
headers={
'Cookie': '',
'Host': 'fanyi.youdao.com',
'Origin': 'http: // fanyi.youdao.com',
'Referer': 'http: // fanyi.youdao.com /',
'User-Agent': ''}
word=input("请输入需要翻译的文字:")
timetemp=time.time()*1000
salt=str(timetemp)+str(random.randint(0,10))
temp="fanyideskweb" + word + salt + "Nw(nmmbP%A-r6U3EUn]Aj"
sign=md5(temp.encode('utf-8')).hexdigest()
data={
'i':word,
'from':'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': sign,
'ts': timetemp,
'bv': 'e3024dc52ff5c694b77471a08006ba92',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
res=requests.post(url=url,headers=headers,data=data)
print(res.json()['translateResult'][0][0]['tgt'])
if __name__=='__main__':
main()
3.1 首先找出获取数据的接口,查看浏览器与服务器的交互过程,试验得出formdata的规律;
3.2 根据接口名称进行全局搜索,取出异步执行的js代码,从中找出foredata的生成函数;
3.3 用python代码替换js代码生成参数。
js进一步学习见python爬虫js逆向学习(二)python爬虫js逆向学习(三)