零、写在前面


本文涉及的反爬技术,仅供个人技术学习,禁止并做到:

  • 干扰被访问网站的正常运行
  • 抓取受到法律保护的特定类型的数据或信息
  • 搜集到的数据禁止传播、交给第三方使用、或者牟利
  • 如有可能,在爬到数据后24小时候内删除

具体可参考 2019年5月28号 颁布的 《数据安全管理办法(征求意见稿)》

一、背景


今天在爬另一家网站数据时,想直接从 ajax 接口入手,但是发现这些 request 加了额外参数来防止爬取,即在 request header 里,有一对随机key-value 参数:形如 e931588bc0dfbc5e6323 : c43dfe7cdc49b6318f43907ad4e7d9b69a23719d2e3b7b59799124408aa11cf383f459a4a558af8c64b289b7d974982aad58db705ac6784460733bd21784bde0,故意让你猜不到。

但是操作了一会,我总结了如下规律:

1、每个不同的接口 url,对应不同的 key ,但这个 key 刷新页面是不会变得。(看来 key 跟 url 有关)

2、每个 key 对应的 value 一直在变。(事后才知道 value 是根据 url 和 post body 共同决定的)

二、破解


于是通过网站被混淆过的 js ,耐心的打断点分析。

过程略。

三、结果


最后发现:

key 和 value 都是通过 HMAC(Keyed-Hashing for Message Authentication) 算法得来的。

1、HMAC 算法

HMAC 其实就等于我们平常用的 MD5 / SHA-1 去加 salt 的操作。而采用 HMAC 的好处就是,替代我们自己的 salt 算法,使得程序算法更标准化,也更安全

HMAC 可选择搭配 MD5 / SHA-1 或等等。这里用的是 SHA512

>>> import hmac
>>> key = b'secret'
>>> message = b'Hello, world!'
>>> h = hmac.new(key, message, digestmod='MD5')
>>> h.hexdigest()
'fa4ee7d173f2d97ee79022d1a7355bcf'

注意:传入的 key 和 message 都是bytes类型,所以str类型需要首先被编码为bytes

2、最终代码

注意:敏感信息被隐藏处理。

import hashlib
import hmac
import requests
import json host = 'http://example.com'
# request's param - 变化值
uri = '/api/search/example'
data = {
"cityName": "上海",
"cityCode": "31",
# 等等
} # hmac's secret - 固定值
secret = b'abcdefg' # calculate key
sign_key = hmac.new(secret, uri.lower().encode(), hashlib.sha512).hexdigest()
header_key = sign_key[10:30] # calculate value
sign_value = (uri.lower()+uri.lower() +
json.dumps(data, separators=(',', ':'), ensure_ascii=False)).lower()
header_value = hmac.new(secret, sign_value.encode(),
hashlib.sha512).hexdigest()
# print result
print(header_key, header_value)

然后我们把算出来的 key 和 value 塞入到每一次请求的 header 里,即可成功调用。

3、坑

上面代码在算 value 的时候,用了 json.dumps(),把中文 上海 转为了 "\u4e0a\u6d77",而不是上海,导致接口一直报错。

解决办法:json.dumps 多传一个参数 ensure_ascii=False

破解另一家网站的反爬机制 & HMAC 算法的更多相关文章

  1. python爬虫破解带有RSA.js的RSA加密数据的反爬机制

    前言 同上一篇的aes加密一样,也是偶然发现这个rsa加密的,目标网站我就不说了,保密. 当我发现这个网站是ajax加载时: 我已经习以为常,正在进行爬取时,发现返回为空,我开始用findler抓包, ...

  2. python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题

    python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题 一丶爬虫概述       通过编写程序'模拟浏览器'上网,然后通 ...

  3. 第三百四十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—cookie禁用、自动限速、自定义spider的settings,对抗反爬机制

    第三百四十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—cookie禁用.自动限速.自定义spider的settings,对抗反爬机制 cookie禁用 就是在Scrapy的配置文件set ...

  4. python爬虫---CrawlSpider实现的全站数据的爬取,分布式,增量式,所有的反爬机制

    CrawlSpider实现的全站数据的爬取 新建一个工程 cd 工程 创建爬虫文件:scrapy genspider -t crawl spiderName www.xxx.com 连接提取器Link ...

  5. Python爬虫实战——反爬机制的解决策略【阿里】

    这一次呢,让我们来试一下"CSDN热门文章的抓取". 话不多说,让我们直接进入CSND官网. (其实是因为我被阿里的反爬磨到没脾气,不想说话--) 一.URL分析 输入" ...

  6. 用Nginx分流绕开Github反爬机制

    用Nginx分流绕开Github反爬机制 0x00 前言 如果哪天有hacker进入到了公司内网为所欲为,你一定激动地以为这是一次蓄谋已久的APT,事实上,还有可能只是某位粗线条的员工把VPN信息泄露 ...

  7. selenium反爬机制

    使用selenium模拟浏览器进行数据抓取无疑是当下最通用的数据采集方案,它通吃各种数据加载方式,能够绕过客户JS加密,绕过爬虫检测,绕过签名机制.它的应用,使得许多网站的反采集策略形同虚设.由于se ...

  8. python爬虫破解带有CryptoJS的aes加密的反爬机制

    发现问题 在一次偶然中,在爬取某个公开网站(非商业型网站)时,老方法,打开调试工具查看请求方式,请求拦截,是否是异步加载,不亦乐乎,当我以为这个网站非常简单的时候,发现二级网页的地址和源码不对应 Aj ...

  9. 二十八 Python分布式爬虫打造搜索引擎Scrapy精讲—cookie禁用、自动限速、自定义spider的settings,对抗反爬机制

    cookie禁用 就是在Scrapy的配置文件settings.py里禁用掉cookie禁用,可以防止被通过cookie禁用识别到是爬虫,注意,只适用于不需要登录的网页,cookie禁用后是无法登录的 ...

随机推荐

  1. mac 终端高亮显示~

    针对terminal采用bash模式: 编辑 ~/.bash_profile, 加入以下代码: export CLICOLOR=1 export LSCOLORS=gxfxaxdxcxegedabag ...

  2. 使用 NTP/Chrony 同时 Centos7 网络时间

    Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,提供高精准度的时间校正服务. 在 Centos ...

  3. SpringBoot项目创建与第一个SSM项目示例

    本节介绍SpringBoot创建第一个示例SSM项目的完整过程,使用工具STS,与IDEA操作基本类似. 示例代码在:https://github.com/laolunsi/spring-boot-e ...

  4. SI4432和SI1212通讯

    SI4432是美国Silabs研发的一款工作频段低于1GHz的高性能射频收发芯片,属于其EzRadioPro系类.在国内已经广泛应用于工业.科研.医疗(ISM)以及短距离无线通信设备(SRD),其输出 ...

  5. UVA-156

    Most crossword puzzle fans are used to anagrams - groups of words with the same letters in different ...

  6. 基于iCamera测试AR0134 960p 全局快门相机模块小结

    基于iCamera测试AR0134 960p 全局快门相机模块小结 首先看看此模块的特性 AR0134 全局曝光 CMOS模块 1280*960像素 5.3 V/lux-sec 摄像头模块实物靓照(上 ...

  7. Java多态之动态绑定

    目录 Java多态之动态绑定 引用变量的类型 编译时类型 运行时类型 方法绑定 静态绑定 动态绑定 方法表 Java多态之动态绑定 上篇回顾:多态是面向对象程序设计非常重要的特性,它让程序拥有 更好的 ...

  8. layedit添加首行缩进

    由于在编辑的时候,有首行缩进的需求,并且,如果直接使用空格进行缩进,还会出现layedit看到的效果和实际显示的效果不一致的情况.多方搜索无果,于是决定修改源代码.具体步骤如下: 1.首先找到laye ...

  9. 200G网盘资源分享

    今日偶得大量网盘资源,遂写一博文以分享! 来源:HACK学习呀,微信公众号:HACK学习呀 文件名 链接 提取密码 2015cracer入侵入门到精通视频教程 点我查看 trf3 一笔√带过入侵教程 ...

  10. 【CSS】333- 使用CSS自定义属性做一个前端加载骨架

    点击上方"前端自习课"关注,学习起来~ 我们在打开APP或者网站的时候,经常可以看到这样的效果,在内容加载完成之前,会有一个骨架动画的出现,这种加载方式比传统的进度条方式要友好的多 ...