点击上方“Python编程与实战”,选择“置顶公众号”

第一时间关注Python实战技巧!

携程的反爬机制有点让人害怕,当某些参数不对的时候,直接返回的房价价格比实际价格要高,这也可以当作“千人千面”吧。

阅读步骤

效果展示

项目地址

携程反爬机制图示

携程反爬三点

总结

效果展示

项目地址

https://github.com/justcodedroid/spider_js/tree/master/xiecheng

携程反爬机制图示

携程反爬三点

我们抓取的地址是这类的。https://hotels.ctrip.com/hotel/7067729.html

抓取数据是乱码(温馨提示不要使用json中html字段),我们可以通过debugjs函数发现,字体之间有一个映射函数。用node重写。

function parser(e){

e = Buffer.from(e, 'base64').toString()

function t(e, t, o){

var i = "";

try {

i = ((n, t) => {

var r, o, e = "1", i = void 0 == e[0], c = i ? [] : "";

for (r = 0; r

o = t.charAt(n.charAt(r).charCodeAt(0) - 21760).charAt(0),

i ? c.push(o) : c += o;

return c = i ? c.join("") : c

})(e, t)

} catch (n) {

i = ""

}

return i

}

var i = ["T", "F", "e", "s", "M", "a", "g", "r", "o", "B", "u", "l", "y", "m", "f", "t"];

e = JSON.parse(e)

e.html = t(e.ComplexHtml, e.ASYS,)

return Buffer.from(e.html).toString('base64')

}

获取eleven参数,这个参数可以理解成浏览器的指纹。他会采集很多细节,然后拼成一串字符串。这段代码是用nodejs写了一个服务。

function get_eleven(text, url){

text = new Buffer(text, 'base64').toString()

url = new Buffer(url, 'base64').toString()

let process = require('process')

process.exit = function (){

throw  'fuck'

}

let JSDOM = require('jsdom').JSDOM

dom = new JSDOM('

hh')

location = {'href': url}

document = dom.window.document

window = {location: location, document: document}

navigator = {

userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',

geolocation: {}

}

function Image(){

}

eleven = null

function CASrYVcraFQgjGciKk(f){

eleven = f()

}

eval(text)

return Buffer.from(eleven).toString('base64')

}

module.exports = get_eleven

cookie的加密。ferror,_zQdjfing这两个值的生成xmind中已经介绍了,ferror依赖hotalid+UA,_zQdjfing依赖ferror。最坑的是hashCode方法,依赖首页的4个变量。

大家可以先用正则提取4个变量,然后调用下面方法。

function get_hash_code(c,a,s,m){

tc = []

md = function (n, m, k){

var p;

if (t[m])

return t[m];

if (m == 1) {

t[m] = n % k;

return t[m]

}

if (m & 1) {

p = (m - 1) >> 1;

t[1] = n % k;

t[m] = (md(n, p, k) + md(n, p, k) + n % k) % k;

return t[m]

}

p = m >> 1;

t[m] = (md(n, p, k) + md(n, p, k)) % k;

return t[m]

}

rd = function (){

t = [0];

s = (md(a, s, m) + c % m) % m;

return s

}

for (var i = 0; i

var r = '0x';

for (var j = 0; j

r += (rd() % 16).toString(16)

}

tc.push(parseInt(r, 16))

}

function hashCode(){

var _0x24e50e = {

'pmqAv': function _0x3bc67a(_0x21f6a6, _0xeed6f){

return _0x21f6a6

},

'tUguD': function _0x529e47(_0x6476ea, _0x5ee855){

return _0x6476ea ^ _0x5ee855;

},

'bTlKh': function _0x4d3092(_0x4010ff, _0xde8cef){

return _0x4010ff ^ _0xde8cef;

},

'PFtAy': function _0x59e07b(_0x3240f1, _0x482071){

return _0x3240f1 & _0x482071;

},

'DppDN': function _0x580566(_0x3bb80b, _0x142af4){

return _0x3bb80b >> _0x142af4;

},

'WavRi': function _0x1cb726(_0x320a0b, _0x1acb93){

return _0x320a0b & _0x1acb93;

},

'EcTAI': function _0x22ee49(_0x3277f3, _0x196702){

return _0x3277f3 >> _0x196702;

},

'ZjAoT': function _0x1c129a(_0x52c557, _0x5722fa){

return _0x52c557 & _0x5722fa;

}

};

var _0x328279 = _0x3eceb6 = this.length

, _0x5da81b = 0x0;

for (; _0x24e50e.pmqAv(_0x5da81b, _0x3eceb6); _0x5da81b++) {

var _0x238d5f = this.charCodeAt(_0x5da81b);

if (_0x238d5f >> 0x8) {

_0x328279 = _0x24e50e[_0x4f05('0x7', '\x6f\x79\x59\x26')](_0x328279 >> 0x8, tc[_0x24e50e['\x62\x54\x6c\x4b\x68'](_0x24e50e[_0x4f05('0x8', '\x6a\x66\x4d\x25')](_0x328279, 0xff), _0x24e50e[_0x4f05('0x9', '\x42\x73\x36\x74')](_0x238d5f, 0x8))]);

_0x238d5f = _0x24e50e[_0x4f05('0xa', '\x21\x21\x23\x33')](_0x238d5f, 0xff);

}

_0x328279 = _0x24e50e.EcTAI(_0x328279, 0x8) ^ tc[_0x24e50e.bTlKh(_0x24e50e.ZjAoT(_0x328279, 0xff), _0x238d5f)];

}

return _0x328279;

}

return hashCode

}

调用示例,给String添加个hashCode方法

c = 0x269ec3,

a = 0x343fd,

s = 1552287018864,// 这几个值是前端网页动态生成的,最好定时更新。

m = 0x7FFFFFFF

String.prototype.hashCode = get_hash_code(c,a,s,m)

总结

js逆向的步骤是套路,核心是耐心

作者:阳光下的小树

来源:CSDN

原文:https://blog.csdn.net/u013356254/article/details/88900501

公众号:Python编程与实战

欢迎关注!给您不一样的惊喜!

扫码加群互相学习交流,一起牛逼,里面有很多大佬

觉得不错就帮忙点个在看,或者转发一下!

送人

python 携程酒店数据爬取_携程酒店真实房价抓取 - Python编程与实战的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. python读写磁盘扇区数据有什么用_磁盘存放数据原理 - osc_v8xs2czi的个人空间 - OSCHINA - 中文开源技术交流社区...

    磁盘结构作用数据原理 拓扑图 盘面(side) 模型: 1.磁盘圆形盘面,一个磁盘内含有多个盘面. 2.层叠关系,每个盘面之间不会贴着. 3.第一个盘的正面成为0面,反面为1面:第二个盘正面为2面,反 ...

  2. python 条件表达式换行_Python基础语法 - LongKing-Xu的个人空间 - OSCHINA - 中文开源技术交流社区...

    python基础语法 一.标识符 在Python中,所有标识符可以包括英文.数字以及下划线(_),但不能以数字开头. 在Python中的标识符是区分大小写的. 在Python中以下划线开头的标识符是有 ...

  3. python语言是由谁设计并领导开发的_python语言概述 - osc_lt3ocv4d的个人空间 - OSCHINA - 中文开源技术交流社区...

    python语言的发展 python语言诞生于1990年,由Guide van Rossum设计并领导开发. python语言是开源项目的优秀代表,其解释器的全部代码都是开源的. 编写Hello程序 ...

  4. java绘制统计直方图取平均_统计学——直方图解析 - osc_lv8qb16y的个人空间 - OSCHINA - 中文开源技术交流社区...

    直方图(Histogram),又称质量分布图,是一种统计报告图, 由一系列高度不等的纵向条纹或线段表示数据分布的情况. 一般用 横轴表示数据类型,纵轴表示分布情况. 直方图是数值数据分布的精确图形表示 ...

  5. python灰色关联度分析代码_灰色关联分析法步骤 - osc_uwnmtz9n的个人空间 - OSCHINA - 中文开源技术交流社区...

    https://wenku.baidu.com/view/dc356290af1ffc4fff47ac0d.html?rec_flag=default&sxts=1538121950212 利 ...

  6. python 加权随机算法_加权随机算法 - 飞儿飞的个人空间 - OSCHINA - 中文开源技术交流社区...

    加权随机算法一般应用在以下场景:有一个集合S,里面比如有A,B,C,D这四项.这时我们想随机从中抽取一项,但是抽取的概率不同,比如我们希望抽到A的概率是50%,抽到B和C的概率是20%,D的概率是10 ...

  7. 在单链表写入一组数据代码_第5章 第1节 链表 - osc_x8s7voop的个人空间 - OSCHINA - 中文开源技术交流社区...

    ● 请你说出几种基本的数据结构, 参考回答: 常见的基本的数据结构有链表.栈.队列.树(只列出面试常考的基本数据结构) 1.链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链 ...

  8. python 过采样 权重实现_不平衡数据集的处理 - osc_sqq5osi1的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.不平衡数据集的定义 所谓的不平衡数据集指的是数据集各个类别的样本量极不均衡.以二分类问题为例,假设正类的样本数量远大于负类的样本数量,通常情况下通常情况下把多数类样本的比例接近100:1这种情况下 ...

  9. 人工鱼群算法python代码_人工鱼群算法python_鱼群算法 - Brillou的个人空间 - OSCHINA - 中文开源技术交流社区......

    本算法是参照李晓磊博士的论文实现的,详细的算法原理可阅读<一种新型的智能优化方法_人工鱼群算法_李晓磊> 算法基于鱼群的生存行为:在一片水域中,鱼存在的数目最多的地方就是本水域中富含营养物 ...

  10. mysql数据无故回档_数据库回档解决方案 - osc_hajrc28s的个人空间 - OSCHINA - 中文开源技术交流社区...

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者介绍:李明,腾讯云数据库架构师华南区负责人,曾在某专业数据库服务商.51job任职DBA. 作为一名DBA,日常工作中免不了需要做一些救 ...

最新文章

  1. Mybatis入门之动态sql
  2. ttf_openfont可以多次调用吗_西门子OB块、FC块、FB块、DB块之间有什么关系?如何调用?...
  3. boost::core模块实现交换string
  4. Redis面试题答案整理
  5. Android 横竖屏切换的处理 (转载)
  6. axios队列 vue_vue axios全攻略
  7. java concurrent int_java.util.concurrent.AtomicInteger
  8. 网站随机动态密码代码
  9. 全国高等学校计算机水平考试总结,参加全国计算机等级考试的经历和总结
  10. http请求过程_“HTTP请求的整个过程”与它引出了整个计算机网络知识图谱(一)...
  11. 【HDU2825】Wireless Password,AC自动机+状态压缩DP
  12. 华为笔记本键盘说明图_电脑键盘的这些功能键的真正用法,你全都了解吗?
  13. 使用TypeScript两年后,还值得吗?
  14. commitizen和cz-customizable配置git commit message
  15. cidaemon.exe进程cpu使用率100%
  16. python图片压缩原理_LZ77无损压缩算法原理详解(结合图片和简单代码)
  17. 51单片机的键盘分类和运用
  18. 【win】系统工具Win PE
  19. 014-无条件跳转指令jmp+
  20. 对麦克斯韦方程组的理解(非常详细)

热门文章

  1. 我的自学ROS历程3-3-Vsual Studio code安装
  2. 生活中哪些地方运用计算机网络,计算机网络技术在生活中应用.doc
  3. 计算机rapter 流程图,Raptor设计程序流程图并运行的具体操作步骤
  4. 有些东西还得记下来,看过了又忘了,找起来又难找 (fluxbox, ab, seige)
  5. 用了很多群控与云控,微信还是慢慢死掉了
  6. 图像坐标球面投影_C/C++ 图像处理(7)------图像の球面投影算法
  7. HTML四季变换图,四季星空图
  8. 微信小程序 在wxml写过滤器 脱敏手机号
  9. BOS启动的客户端,打开序时簿只显示一行
  10. python把工作簿拆分为工作表_如何批将Excel的多个Sheet工作表拆分为独立的工作簿?...