接上一回,我们大致梳理了淘宝封杀selenium的思路,找到核心的参数ua,并抛出疑问:为什么ua每次都不一样,并且随着使用次数次数增加长度越来越长。

关于为什么每次获取的ua参数长度都不一样,有个网友留言让我豁然开朗:

`window.__defineGetter__('_f_', function (){return new Date()})

原理就是给这个属性绑定一个输出前的私有方法,每次在获取该属性的时候执行该私有方法,从而达到每次输出的值都不一样。

受此启发,然后在仔细分析window对象,找到如下两个关键信息

get _n:ƒ s() arguments:Arguments [callee: ƒ, Symbol(Symbol.iterator): ƒ] caller:ƒ () length:0 name:"s" prototype:{constructor: ƒ} __proto__:ƒ () [[FunctionLocation]]:115.js?d=24:formatted:559 [[Scopes]]:Scopes[2] set _n:ƒ () arguments:null caller:null length:0 name:"" prototype:{constructor: ƒ} __proto__:ƒ () [[FunctionLocation]]:115.js?d=24:formatted:17214 [[Scopes]]:Scopes[3]

有get _n方法和set _n()方法,其中get方法对应115.js文件的559行;set方法对应115文件的17214行。

通过调试产生_n值的位置是在get方法中,该函数名为s函数,如下:

function s() { for (var e = 3; void 0 !== e; ) { var a = 3 & e , s = e >> 2 , c = 3 & s; switch (a) { case 0: !function() { switch (c) { case 0: b += "mp", e = 8; break; case 1: e = b ? 0 : 8; break; case 2: e = b ? 1 : 2; break; case 3: b += "romCo", e = 4 } }(); break; case 1: !function() { switch (c) { case 0: b += "atib", e = 2 } }(); break; case 2: b += "ility", S[b] = 1; var r = h(22, S); return r; case 3: var b = "f"; e = b ? 12 : 4 } } }

一堆混淆视听的js,核心的东西只有一句var r = h(22, S); return r;

也就是h(22, S)函数产生了不同的ua

事实证明就是这个h函数决定了ua,继续看h函数

function h(c, o, n, i, p) { var u, d, v, C, j, E, R, _, T, L, M, N, D, P, I, U, B, F, z, H, Q, V, G, W, X, q, Y, J, K, Z, $, ee, ae, se, ce, re, be, ke, te, oe, ne, ie, he, pe, ue, de, ve, fe, le, ge, Ce, we, me, Ae, Se, je, xe, Oe, ye, Ee, Re, _e, Te, Le, Me, Ne, De, Pe, Ie, Ue, Be, Fe, ze, He, Qe, Ve, Ge, We, Xe, qe, Ye, Je, Ke, Ze, $e, ea, aa, sa, ca, ra, ba, ka, ta, oa, na, ia, ha, pa, ua, da, va, fa, la, ga, Ca, wa, ma, Aa, Sa, ja, xa, Oa, ya, Ea, Ra, _a, Ta, La, Ma, Na, Da, Pa, Ia, Ua, Ba, Fa, za, Ha, Qa, Va, Ga, Wa, Xa, qa, Ya, Ja, Ka, Za, $a, es, as, ss, cs, rs, bs, ks, ts, os, ns, is, hs, ps, us, ds, vs; us = this, is = -1, hs = 0; try { for (var fs = 15782; void 0 !== fs;) { var ls = 31 & fs, gs = fs >> 5, Cs = 31 & gs, ws = gs >> 5, ms = 31 & ws; switch (ls) { case 0: ! function() { switch (Cs) { case 0: ! function() { switch (ms) { case 0: ie = $.charCodeAt(se) - 704, he += String.fromCharCode(ie), fs = 13639; break; case 1: H.push(1), H.push(5), P = void 0, X = Te, C = X[de], X = [], u = "ecapsonom", F = u.split("").reverse().join(""), fs = 4168; break; case 2: R = E, E = 64 > R, fs = E ? 18853 : 7621; break; case 3: L = E[v], T[v] = new RegExp(L), fs = 21952; break; case 4: fs = ie < be.length ? 11652 : 15781; break; case 5: ee += "ingClient", fs = 21221; ······ 省略两千行左右

其中us=this,this是全局对象

对于h函数,一堆js已经看不过来了,有研究的网友可以提供点线索。ua的分析就先到这里了,下回分析password的加密。

欲知后事如何,欢迎关注。

------------------------------

ID:Python之战

|作|者|公(zhong)号:python之战

专注Python,专注于网络爬虫、RPA的学习-践行-总结

喜欢研究技术瓶颈并分享,欢迎围观,共同学习。

独学而无友,则孤陋而寡闻!

---------------------------

淘宝封杀selenium的ua算法分析相关推荐

  1. 针对淘宝反selenium的反反爬措施详讲1-----pyautogui

    现在某猫和某宝在反反selenium的道路上越越来恶毒了,大部分是检测webdriver的关键符(网上有很多介绍这里就不一一介绍了)当我们遇到反selenium那该怎么办??????????????? ...

  2. Python爬虫淘宝基于selenium抓取淘宝商品数据2021年测试过滑动验证

    配置一下"可能需要修改的参数",就可以食用底部代码了,ps:可能已失效 本文章代码功能 准备工作 Python用到的库和准备工作 可能需要修改的参数 在CMD中打开一个Chrome ...

  3. 淘宝封杀返现模式 淘宝客返利网站模式遇挑战

    一淘旗下淘宝联盟昨日发布公告称,将从明年1月1日起不再支持淘宝站内购物返现的淘宝客模式,只支持返积分,返实物,返优惠券等非现金方式返利模式.这也意味着,依靠返现为生的返利网站和部分淘宝客的商业模式将面 ...

  4. 淘宝密码加密方式分析,及python实现

    上回说到<分析淘宝登陆对selenium爬虫的封杀方案,反爬虫机制的升级>.<淘宝封杀selenium的ua算法分析>,对淘宝封杀Selenium的思路有了一个清晰认识,核心就 ...

  5. PhantomJS+Selenium爬取淘宝

    文章目录 动态网页处理 PhantomJS Selenium 处理异步请求 模拟键盘操作 页面等待 显示等待 隐式等待 Phantomjs+Selenuim爬取淘宝 动态网页处理 很多网站都采用AJA ...

  6. python爬虫淘宝登录_淘宝的模拟登录(python3+selenium)

    淘宝登录 爬数据的前提是要先登录,那么先来说怎么使用python3+selenium登录淘宝的. 一.登录前的准备工作 关于一开始做登录时,一直会出现滑块,这个滑块怎么滑都通过不了,后来才知道是淘宝有 ...

  7. Python + selenium 爬取淘宝商品列表及商品评论 2021-08-26

    Python + selenium 爬取淘宝商品列表及商品评论[2021-08-26] 主要内容 登录淘宝 获取商品列表 获取评论信息 存入数据库 需要提醒 主要内容 通过python3.8+ sel ...

  8. selenium模拟登陆淘宝,获取cookies

    新年工作第一天,再次祝大家新年快乐,猪年大吉! 1.前言,前期准备 这次分享一下模拟登陆淘宝实记.淘宝作为中国几大电商网站之一,反爬措施可以说是相当完善的,在这里我会分享出我是如何使用selenium ...

  9. 【Python网络编程】爬取百度贴吧、小说内容、豆瓣小说、Ajax爬微博、多线程爬淘宝

    一.爬取百度贴吧 import re titleR ='<a rel="noreferrer" href=".*?" title=".*?&qu ...

最新文章

  1. JForum 的 SSO集成
  2. SSM框架之MyBatis3专题5:MyBatis注解式开发
  3. object的实例是 python_Python:type、object、class与内置类型实例
  4. LeetCode_2_两数相加
  5. 为什么1000 == 1000返回为False,而100 == 100会返回为True?
  6. Orac and LCM #641(div2) c题--求质因数次小指数
  7. base64 能放数组里面么_数组:总结篇
  8. 学习学习SpringSecurity
  9. java 中的static关键字和final关键字
  10. 运筹OR帷幄,运筹优化的剖析与应用
  11. 面试题:怎么以最快速度计算8*4:
  12. Android毕业设计选题依据,毕业设计选题依据、目的意义、
  13. Openstack平台neutron模块之网络基础概念
  14. java接口和抽象函数_Java接口和抽象类区别
  15. How to Review a Technical Paper
  16. 51单片机的仿真实验——1602显示屏显示万年历与温度
  17. HX8110A功放IC大功率功放芯片
  18. GetAsyncKeyState函数中按键的信息
  19. 如何用简单方法推导正弦函数的和角公式: sin(α+β)=sinαcosβ+cosαsinβ ?
  20. 纯html5+css3能写出什么惊人效果

热门文章

  1. [机器学习] 深入理解 目标函数,损失函数和代价函数
  2. CSS实现间隔线|(竖线)
  3. 马丁福勒《UML精粹》读书笔记_第三章
  4. SQL Server 2005连接服务器时服务器名称填什么?
  5. HTML5和CSS3核心笔记
  6. 摄像机,光源和阴影 -----OGRE 3D 1.7 Beginner‘s Guide中文版 第四章
  7. 如何新建一个oracle数据库,ORACLE怎么新建数据库
  8. Motivated Word (2)
  9. 厦门大学校园导游系统(图论)
  10. [转]目前游戏行业内部主要几款游戏引擎的技术对比