破解另一家网站的反爬机制 & HMAC 算法
零、写在前面
本文涉及的反爬技术,仅供个人技术学习,禁止并做到:
- 干扰被访问网站的正常运行
- 抓取受到法律保护的特定类型的数据或信息
- 搜集到的数据禁止传播、交给第三方使用、或者牟利
- 如有可能,在爬到数据后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 算法的更多相关文章
- python爬虫破解带有RSA.js的RSA加密数据的反爬机制
前言 同上一篇的aes加密一样,也是偶然发现这个rsa加密的,目标网站我就不说了,保密. 当我发现这个网站是ajax加载时: 我已经习以为常,正在进行爬取时,发现返回为空,我开始用findler抓包, ...
- python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题
python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题 一丶爬虫概述 通过编写程序'模拟浏览器'上网,然后通 ...
- 第三百四十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—cookie禁用、自动限速、自定义spider的settings,对抗反爬机制
第三百四十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—cookie禁用.自动限速.自定义spider的settings,对抗反爬机制 cookie禁用 就是在Scrapy的配置文件set ...
- python爬虫---CrawlSpider实现的全站数据的爬取,分布式,增量式,所有的反爬机制
CrawlSpider实现的全站数据的爬取 新建一个工程 cd 工程 创建爬虫文件:scrapy genspider -t crawl spiderName www.xxx.com 连接提取器Link ...
- Python爬虫实战——反爬机制的解决策略【阿里】
这一次呢,让我们来试一下"CSDN热门文章的抓取". 话不多说,让我们直接进入CSND官网. (其实是因为我被阿里的反爬磨到没脾气,不想说话--) 一.URL分析 输入" ...
- 用Nginx分流绕开Github反爬机制
用Nginx分流绕开Github反爬机制 0x00 前言 如果哪天有hacker进入到了公司内网为所欲为,你一定激动地以为这是一次蓄谋已久的APT,事实上,还有可能只是某位粗线条的员工把VPN信息泄露 ...
- selenium反爬机制
使用selenium模拟浏览器进行数据抓取无疑是当下最通用的数据采集方案,它通吃各种数据加载方式,能够绕过客户JS加密,绕过爬虫检测,绕过签名机制.它的应用,使得许多网站的反采集策略形同虚设.由于se ...
- python爬虫破解带有CryptoJS的aes加密的反爬机制
发现问题 在一次偶然中,在爬取某个公开网站(非商业型网站)时,老方法,打开调试工具查看请求方式,请求拦截,是否是异步加载,不亦乐乎,当我以为这个网站非常简单的时候,发现二级网页的地址和源码不对应 Aj ...
- 二十八 Python分布式爬虫打造搜索引擎Scrapy精讲—cookie禁用、自动限速、自定义spider的settings,对抗反爬机制
cookie禁用 就是在Scrapy的配置文件settings.py里禁用掉cookie禁用,可以防止被通过cookie禁用识别到是爬虫,注意,只适用于不需要登录的网页,cookie禁用后是无法登录的 ...
随机推荐
- 使用react-breadcrumbs-dynamic
这是完全独立于路由器的解决方案,你可以将其与任何版本的React Router(2或3或4)或任何其他用于React的路由库一起使用,或者完全不进行路由.您只需要指定面包屑项目及其道具的组件.然而道具 ...
- redis位图巧用,节约内存
最近要做一个圣诞抽奖活动,需要记录每天用户签到的记录,以前一般都是用普通的字符串数据类型,每个用户的签到用一个 key // 用户10在活动第一天的签到key为record:1:10 $key = & ...
- iOS库的种类
一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 二.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系 ...
- [TimLinux] JavaScript 面向对象程序设计
1. 面向对象 面向对象语言有一个标志:都有类的概念.通过类可以创建任意多个具有相同属性和方法的对象.ECMAScript中没有类的概念,因此JavaScript中的对象夜雨基于类的语言中的面向对象有 ...
- 【新】Docker实战总结
>>> 目录 <<< Docker简介 Docker优势 Docker基本概念 Docker安装使用 Docker常用命令 Docker镜像构建 Docker本地仓 ...
- HDU5973 Game of Geting Stone(威佐夫博弈)
Two people face two piles of stones and make a game. They take turns to take stones. As game rules, ...
- 2019企业linux运维最需要的了解的一些硬件基础知识
第3章 服务器 245 3.1 电脑的种类 245 3.2 服务器的介绍 246 3.2.1 服务器的类别 246 3.2.2 服务器的性能 247 3.2.3 服务器的 ...
- django学习03-模版
新手做的笔记,很可能会有理解错误的地方.欢迎拍砖. 在polls/views.py中增加下面内容,完善功能. def detail(request, question_id): return Http ...
- Orleans 初接触
简介 这篇随笔主要记录了自己学习Orleans的经过和理解,在学习过程中会一直更新,思路和理解可能有些偏颇,如果有幸有大佬看到这篇文章,希望能给予批评指正. 导航 (一) 入门例子 (二) 测试用例 ...
- Mysql数据库优化一:集群(读写分离)之主从服务器的安装与配置
Mysql数据库的集群(读写分离),说白了就是将读操作和写操作分开在不同的服务器上实现,以达到提高效率的目的. 大致原理如下: 数据库中的所有操作都是有日志记录的(前提是要打开这个日志记录功能) 1. ...