百度翻译爬虫

对于爬虫来说 反爬高难度之一必定有js加密吧 每次看js代码看的头昏眼暗的 今天分享一个百度翻译的爬虫 js的难度恰到好处 不会太难也不会太简单 对于想了解js加密的同学可以试把手
需要用到的一点知识是JS,和PyExecJS
PyExecJS库:在python里面 我们可以用这个库模拟执行js的代码

第一步来说肯定是打开网页源代码看看有没有想要的内容 很显然没有
那就只有继续分页网页结构 最终发现全局搜索找到了要的东西 json数据
百度翻译爬虫_第1张图片
那思路清晰的出来了 只需要请求这个url 得到response里面的内容即可 因为是post请求 所以只需要加上form_data就可以了

百度翻译爬虫_第2张图片

可是真这么简单吗 我们看一下form_data的数据并比较翻译其他内容时候的不同

百度翻译爬虫_第3张图片
明显表单数据不同 所以现在的任务是构建表单 找到表单上的数据
我们需要注意三个数据 query ,sign,token
query:这是我们需要翻译的内容
token:token值其实是会变化的 ,只是写文章时刚好是一样的 ,但是这不是关键, 注意这个值是可以在网页源码找到的 ,所以构建表单时不要直接将这个值放入表单 ,而是请求百度翻译url, 正则匹配token这个值 ,因为它真的是会变化的

sign: 而这个值才是全文的重点 唯一的难度就在于怎么得到这个sign值, 同样的 首先查找网页源码发现找不到,全局搜索也找不到,那就最后一种可能,js生成。

百度翻译爬虫_第4张图片

百度翻译爬虫_第5张图片
我们在send函数和前面打上断点 此时右边的调试还不能用 因为我们刷需要新网页 下一次就会在send函数前面停下

send函数:我们设想 send函数将一个东西发送出去 是不是说明里面的东西已经生成好了 所以我们的任务是进入send函数 看能不能找到需要的东西

百度翻译爬虫_第6张图片

当执行到下一个断点到同一个位置时 发现内容变成了我们需要的那个url的名字 说明到这里是对的 分析js 像我这种小白 很多是试出来的 所以有很多我也不知道为什么要这么做 哈哈哈
百度翻译爬虫_第7张图片

百度翻译爬虫_第8张图片
我们找到需要的sign之后在前面打上断点 看这个sign值的**h(n)**又是个什么东西

所以我们将断点停在sign这里 在进入这个函数
百度翻译爬虫_第9张图片

百度翻译爬虫_第10张图片

我们需要把function(e)和function(n)拿出来复制在pycharm 现在就要用到pyexecjs了
百度翻译爬虫_第11张图片

百度翻译爬虫_第12张图片

百度翻译爬虫_第13张图片
这里的window(I)通过观察发现是网页源码的个gtk,所以在function(e)上加一个参数gtk传入即可

import requests
import execjs
import re

url="https://fanyi.baidu.com/"
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36",
"referer":"https://fanyi.baidu.com/",
"cookie":"BIDUPSID=754435C63E2F5E789F0ECE56BAFB47D2; PSTM=1597471382; BAIDUID=754435C63E2F5E78214B65C85550A62A:FG=1; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_PREFER_SWITCH=1; SOUND_SPD_SWITCH=1; __yjs_duid=1_c12773a640fdeeecd684067d20c16b811609137270048; BDUSS=YzYXJpSX5HeklLWFN0bXlFeXY2cjFldlc3dnNQMjNUTmtSRHM3fk9MVFNyaVJnRVFBQUFBJCQAAAAAAAAAAAEAAAC6coY6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANIh~V~SIf1fNW; BDUSS_BFESS=YzYXJpSX5HeklLWFN0bXlFeXY2cjFldlc3dnNQMjNUTmtSRHM3fk9MVFNyaVJnRVFBQUFBJCQAAAAAAAAAAAEAAAC6coY6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANIh~V~SIf1fNW; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_PSSID=; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; delPer=0; PSINO=7; BAIDUID_BFESS=A4FCEC4A8A92869A11FF2310DA2B329F:FG=1; BA_HECTOR=a02l2k0g258l2l20c01g08jt20q; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1610887750,1610895268; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1610895395; ab_sr=1.0.0_YzhjZTg3YTc1MjI4YzE2NDZlODQwZDQ5MWFkM2ExNWI1ZDQxZjI3ZjVlODg1ZDBmNmQwMjFlNjY2ZTVkZjM0ZmFiN2E3Zjg5OWM0ZTQ4NjU1ODFiNzg2NzM5NDUxZThl; __yjsv5_shitong=1.0_7_143097fa5efe00d7188d18db0d30fc7eac9e_300_1610895395857_183.228.237.123_3a8d849a; yjs_js_security_passport=e6b9e67a33bbb9476e1bfb14da57b6694572ff03_1610895438_js"

}
session=requests.Session()
session.headers=headers
res=session.get(url)
token=re.findall("token: '(.*?)'",res.text)[0]


def makeexec():
    with open("test.js","r")as f:
        js=f.read()
        return execjs.compile(js)

get_sign=makeexec()
query=input("输入你要翻译的东西:")
gtk="320305.131321201"
sign=get_sign.call("e",query,gtk)
print(sign)
form_data={


"from": "zh",
"to": "en",
"query": query,
"simple_means_flag": "3",
"sign": sign,
"token": token,
"domain": "common"
}
url="https://fanyi.baidu.com/v2transapi?from=zh&to=en"
res1=session.post(url,data=form_data)
ans=re.findall('"dst":"(.*?)"',res1.text)[0]
print(ans)

看看效果
在这里插入图片描述
这个确实挺伤脑的 太难了太难了太难了

你可能感兴趣的:(爬虫,python)