爬虫网络请求之JS解密一(百度企业信用)

前言

反爬策略中最重要的一块领域就是在前端利用JS对数据请求参数进行加密或者数据隐藏(如大众点评的图像位移技术,即使使用代理也是无济于事,必须对JS进行驱动才能获取到数据。
这里有两种方案,一种是用selenium+浏览器,来驱动浏览器来加载数据,基本能解决所有JS问题,但是此方案效率非常低下,如果数据采集量大或更新频率高,非常不推荐这种方式。
另一种方案采集效率非常高效,需要对网页JS进行研究和分析,最后转换成自己的代码以此来驱动JS完成数据的加载。所以对JS研究和解密是学习研究网络爬虫必不可少的一项技能。
所以我会将遇到的一些JS加密研究和解密方式放上来,与大家一起学习探讨。仅供学习参考,切勿用于商业用途。

一、JS加密研究

(1)介绍

百度企业信用是查询企业一些基本信息的网站,之前也有人对百度企业信用JS研究过,百度企业信用JS加密研究。写的很好的一篇文章,我这里在做一点补充,希望大家一起学习探讨。百度企业信用的加密主要是对tot参数进行加密,只是目前我做的时候发现只需要pid参数即可,不需要tot参数也能获取到信息。所以这里仅作为学习讨论。

(2)页面分析

我们首先打开百度企业信用搜索一家公司,进入二级页面后打开开发者工具,抓取网络数据包,找到他的请求接口。如果有同学对这个步骤不了解的,可以翻阅我之前写的文章python爬虫项目(新手教程)之知乎。
单击页面变更记录,可以发现如图1-1所示:

图1-1 变更记录接口参数

我们看到变更记录的接口链接,同时发现请求是GET方式,需要三个参数pid、tot、 。这里只有pid是必须的,pid获取方式在搜索页面时获取如图1-2所示:

图1-2 pid获取方式示例图

“”这个参数后面是一串数字,其实就是当前请求的时间戳,一般都是13位数字。
最后我们来找tot参数,如何获取。

(3)JS解密

这一步很重要,需要从大量js文件中去找一个参数,并且不会有注释,所以还需要有一点js基础。通过翻js文件,一个个搜索可以发现tot如图1-3所示:

图1-3 查询js关键参数位置

我们可以看到tot值等于window.tk。这里有个window的意思,其实是指整个窗口页面,也就是说在动态的网页下,js控制窗口的值来实现页面“动态”。那么我们直接去主页面的Elements找就可以找到相关信息,通过检索window.tk 可以发现 如图 1-4所示:

图1-4 检索window.tk位置

这一步需要读js代码,所以最好有一点JS基础,并不需要完全读懂,只需要了解他参数请求方式和哪个函数有关即可。这里可以看到window.tk=mix(tk,baiducode),而function mix(tk,bid)函数已经给出,我们只需要获取tk与baiducode值即可。

  • var tk=document.getElementById('tXP72jv').getAttribute('aEaA6u0');
  • var baiducode = document.getElementById('baiducode')
    这里很明白告诉我们baiducode ,tk 都是在标签中,元素id和元素属性值都告诉我们,我们只需要写正则表达式提取出来即可得到这些值。然而我们会发现每次tk获取的getElementById和getAttribute中的值都是一直在变化,所以我们还需要先从这段js中得到每次请求tk的id名和属性名。正则表达如下

下面展示一些 `内联代码片`。

    rule = re.compile('var tk = document.getElementById\(\'(.*?)\'\).getAttribute\(\'(.*?)\'\);',re.S)tk1,tk2 = re.findall(rule,response.text)[0]#先从js中获取有tk内容标签的id值和属性名print(tk1,tk2)rule = re.compile(tk2+'="(.*?)"')tk=re.findall(rule,response.text)[0]#从对应标签中获取tk值rule =re.compile('id="baiducode">(.*?)<',re.S)baiducode=re.findall(rule,response.text)[0]#从对应标签中获取baiducode值

做到这里,我们已经筹齐了所以关键参数,只需要带入function mix(tk,bid)函数中,即可得到tot值,这里有两种办法,第一种:读懂js代码,翻译成对应语言,得出结果。第二种:调用execjs这种能够执行js的内库,调用执行js接口得出结果。这里我推荐第二种,方便简单。
使用教程可以参考这里:python3调用js的库之execjs

二、代码实现

这里贴出获取tot参数过程中解密方式。由于execjs在python3.5版本会有问题,主要是execjs本身也是用python2.7版本写的,所以用python3以上版本会有一点问题,所以这里节约时间就用python2.7版本做测试。

#coding=utf-8
import execjs
import requests
import re
import lxml.html
def mix(tk,baiducode):ctx='''function mix(tk, bid){tk = tk.split('');var bdLen = bid.length;bid = bid.split('');var one = tk[bid[bdLen - 1]];for(var i = bdLen - 1; i >= 0; i -= 1) {tk[bid[i]] = tk[bid[i - 1]];if ((i - 2) < 0) {tk[bid[i - 1]] = one;break;}}return tk.join("");}'''print(tk,baiducode)tot = execjs.compile(ctx).call('mix',tk,baiducode)print(tot)return tot
if __name__=='__main__':url ='https://xin.baidu.com/detail/compinfo?pid=xlTM-TogKuTwtCkgkYi3AMoT2WsNQRne0gmd'#这里先请求主页面,然后分析JSresponse=requests.get(url,headers={"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"})rule = re.compile('var tk = document.getElementById\(\'(.*?)\'\).getAttribute\(\'(.*?)\'\);',re.S)tk1,tk2 = re.findall(rule,response.text)[0]#先从js中获取有tk内容标签的id值和属性名rule = re.compile(tk2+'="(.*?)"')tk=re.findall(rule,response.text)[0]#从对应标签中获取tk值rule =re.compile('id="baiducode">(.*?)<',re.S)baiducode=re.findall(rule,response.text)[0]#从对应标签中获取baiducode值tot =mix(tk,baiducode)

三、总结

当我们碰到动态网页时,都是习惯性的找数据请求的接口地址,往往这些地址都会有参数验证,这就需要我们分析JS,通过研究JS获取验证参数,从而得到数据。这些加密方式有很多,需要逐一地去分析,接下来我会做一个有关JS解密的系列,尽量会讲细一点。同样,有问题欢迎大家指出,一起探讨交流。

如果您喜欢我的文章,请关注或点击喜欢,您的支持是我最大的动力 ^ ^~!
仅供学习参考,切勿用于商业用途
转载请注明作者及其出处

黑羊的皇冠 简书主页

爬虫网络请求之JS解密一(百度企业信用)相关推荐

  1. 用Python爬虫获取百度企业信用中企业基本信息!太厉害了!

    一.背景 希望根据企业名称查询其经纬度,所在的省份.城市等信息.直接将企业名称传给百度地图提供的API,得到的经纬度是非常不准确的,因此希望获取企业完整的地理位置,这样传给API后结果会更加准确.百度 ...

  2. 百度企业信用js加密研究

    一.简单说明 企业相关信息对于预测企业发展状况十分重要.基于公司业务,最近分析企业信息查询网站,了解了很多相关的网站,有全国企业信用信息公示, 天眼查,企查查,启信宝,水滴信用,百度企业信用,阿土伯等 ...

  3. JS逆向之国家企业信用信息公示系统Cookie传递

    目标地址 http://www.gsxt.gov.cn/corp-query-entprise-info-xxgg-100000.html 分析 POST http://www.gsxt.gov.cn ...

  4. python爬虫高级教程,JS逆向之百度翻译

    环境 python版本号 系统 游览器 python 3.7.2 win7 google chrome 关于本文 本文将会通过爬虫的方式实现简单的百度翻译.本文中的代码只供学习,不允许作为于商务作用. ...

  5. Python爬虫网络请求 requests(get、post)

    Python网络请求模块 urllib Urllib 库,它是 Python 内置的 HTTP 请求库,也就是说我们不需要额外安装即可使用,它包含四个模块 第一个模块 request,它是最基本的 H ...

  6. python爬虫网络请求超时_6、web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求...

    利用python系统自带的urllib库写简单爬虫 urlopen()获取一个URL的html源码 read()读出html源码内容 decode("utf-8")将字节转化成字符 ...

  7. python爬虫——有道翻译JS解密

    爬虫兴起的同时,反爬虫手段也在不断更新,今天以有道翻译http://fanyi.youdao.com/为例,介绍破解JavaScript加密的反爬虫基本流程. 分析网页 我们进入网站,随便输入一个内容 ...

  8. python爬虫网络请求超时是什么意思_python爬虫怎么处理异常和超时?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 写代码总是会出异常的,尤其是爬虫这类程序,无法确保每次请求都能稳定地返回统一的结果,比如反爬虫策略提升.代理IP超时.程序异常等等,处理好这些问题,才能保 ...

  9. python爬虫网络请求超时是什么意思_爬虫请求超时设置

    在本机网络状况不好或者服务器网络响应延迟甚至无响应时,我们可能会等待很久才能收到响应,甚至到最后收不到响应而报错.为了防止服务器不能及时响应,应该设置一个超时时间,即超过了这个时间还没有得到响应,那就 ...

最新文章

  1. c语言中程序偏离,C语言中的指针加减偏移量
  2. HUD - 4463 Outlets
  3. 新增Skin-watercolor
  4. java与mysql的交互_java与数据库交互常用到的一些方法
  5. 畅通工程再续 最小生成树
  6. 类似抖音的短视频app开发难度大吗?短视频源码让你事半功倍
  7. OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章)和varying,uniform,attribute修饰范围...
  8. http://blog.csdn.net/wangyoujin321/article/details/51472606
  9. 韩顺平Linux操作系统视频教程
  10. 最佳75个安全工具介绍及其下载地址
  11. 用计算机算术表白,数学表白密码
  12. 关于偏微分、全微分总结
  13. win7忘记密码解决,Administrator账号密码忘记 解决办法
  14. Android 启程
  15. 微信小程序中使用地图
  16. [CF1504E]Travelling Salesman Problem
  17. 微信公众平台开发(2)--微信认证流程图文详解
  18. matlab 功率谱密度 汉宁窗_【转】功率谱密度相关方法的MATLAB实现
  19. SLAM总结(三)-传感器之各传感器特性
  20. Redux 入门教程,应用的状态管理器

热门文章

  1. 一台服务器支持多个域名和站点
  2. 通过URL在前端页面传参的方法
  3. 机器人导航(仿真)(二)——amcl定位
  4. ECSHOP产品详情页修改商品购买数量并实时更新商品总价的实现与优化
  5. LaTeX入门必备视频教程
  6. 【转载】儒林外史人物——周进(二)
  7. CornerNet代码学习之pytorch多线程
  8. JS-打开新窗口(window.open)/关闭窗口(window.close)
  9. 对c++输入输出的一些封装(bushi)
  10. 数据结构(二)----线性表(List)链式存储结构(1)