反爬虫的脑洞究竟有多大?
(点击上方蓝色,轻松关注)
来源:大话WEB开发
数据的重要性
如今已然是大数据时代,数据正在驱动着业务开发,驱动着运营手段,有了数据的支撑可以对用户进行用户画像,个性化定制,数据可以指明方案设计和决策优化方向,所以互联网产品的开发都是离不开对数据的收集和分析,数据收集的一种是方式是通过上报API进行自身平台用户交互情况的捕获,还有一种手段是通过开发爬虫程序,爬取竞品平台的数据,后面就重点说下爬虫的应用场景
和实践中会遇到的问题和反反爬虫
的一些套路与技巧。
应用场景
1. 互联网平台,偏向销售公司,客户信息的爬取
客户信息的爬取可以释放销售人员寻找客户资源的时间,提高销售对市场开发的效率。
爬取相关平台上的客户信息,上报到
CRM
管理系统,提供给销售人员进行开发。
2. 资讯爬取并应用到平台业务中
经常浏览资讯的时候会发现其实很多平台的热门资讯内容都很相似,尊重版权的平台,会标明来源出处。
爬取资讯信息,应用到资讯业务中,可以减轻资讯内容编辑人员的压力,如果不需要创造自己的内容,也可全部托管给程序AI运营。
3. 竞品公司重要数据挖掘分析与应用
竞品平台重要业务数据,如:汽车X家的车型信息,X哪儿的酒店信息,返X网的商品信息,… …。
爬取竞品重要数据,对数据进行筛选和处理,然后投入业务中展示,增加这块业务数据量,减轻这块资源的运营编辑的压力。
… …
爬虫开发
1. Python开发爬虫(推荐)
入门也比较简单,代码短小精干,各种便于爬虫开发的模块和框架。
2. 其他语言
很多语言也都可以开发爬虫,但是均都不是很全面,根据实际技术栈和开发场景去使用,语言只是工具,思路才是通用的。
爬虫必备技巧
做爬虫开发,需要对WEB这块有相对全面深入的理解,这样后面遇到反爬虫才能得心应手,见招拆招。
了解HTML
会使用HTML
标签构造页面,知道如何解析出DOM
里标签,提取想要的数据内容。了解CSS
了解CSS
,会解析出样式里的数据内容。了解JS
基本JS语法
,能写能读懂,并了解JS库:Jquery
,Vue
等,可以对使用开发者工具调试JS。了解JSON
了解JSON
数据,会序列化和反序列化数据,通过解析JSON对象
获取数据内容。了解HTTP/HTTPS
能够分析请求信息和响应信息,可以通过代码构造请求。会正则解析
通过正则匹配出符合规则的字符串,提取想要的数据内容。会数据库操作
通过数据库操作对爬取数据进行存储,如:MYSQL
语法。会使用抓包工具
- 浏览器F12开发者
调试工具(推荐:谷歌),Network(网络)
栏目可以获取抓包信息。
- 工具:Charles
,Fiddler
(可抓包HTTPS
,抓包APP
)。
- 通过抓包工具可以过滤出数据接口或者地址,并且分析请求信息和响应信息,定位数据所在的字段或者HTML标签。会使用开发者工具
- 浏览器F12开启开发者工具。
- 需要会使用开发者工具调试HTML
,CSS
,JS
。会模拟请求
- 工具:Charles
,Fiddler
,Postman
- 通过模拟请求,分析出请求需要那些必要的信息,如:参数
,COOKIE
,请求头
,懂得怎么模拟请求就知道编码的时候如何去构造。能定位数据
- 数据在API
中:前端/原生APP请求数据API,API返回数据大部分是JSON
格式,然后渲染展示。
- 数据在HTML中:查看页面HTML源代码
,如果源代码里有想要获取的数据,就说明在服务端已经绑定好数据在HTML里。
- 数据在JS代码中:查看页面HTML源代码,如果获取数据不在HTML里,又没有请求数据API,可以看下数据是不是绑定到JS变量
里。会部署
可以部署到Windows
或者Linux
服务器,使用工具进行爬虫进程监控,然后进行定时轮训爬取。
反爬虫对抗技巧
反爬虫可以分为服务端限制和前端限制
服务端限制:服务器端行请求限制,防止爬虫进行数据请求
前端限制:前端通过CSS和HTML标签进行干扰混淆关键数据,防止爬虫轻易获取数据
设置请求头(服务端限制)
Referer
User-Agent
… …
签名规则(服务端限制)
如果是
JS
发起的请求,签名规则可以在JS函数中找到,然后再根据规则去构造签名。如果是
APP
发起的请求,可能是前端调用原生封装的方法,或者原生发起的,这个就比较无解,需要反编译APP
包,也不一定能成功。
延迟,或者随机延迟(服务端限制)
如果请求被限制,建议可以试试请求延迟,具体延迟xxx毫秒/x秒,根据实际情况设定合适的时间。
代理IP(服务端限制)
如果延迟请求还是被限制,或者需要延迟很长时间才不会被限制,那就可以考虑使用
代理IP
,根据实际场景与限制的规律去运用,一般只要被限制的时候就切换请求的代理IP,这样就基本可以绕过限制。目前有很多收费的代理IP服务平台,有各种服务方式,具体可以搜索了解下,费用一般都在可以接受的范围。
登录限制(服务端限制)
请求带上登录用户的
COOKIE
信息。如果登录用户
COOKIE
信息会在固定周期内失效,那就要找到登录接口,模拟登录,存储COOKIE
,然后再发起数据请求,COOKIE
失效后重新这个步骤。
验证码限制(服务端限制)
简单验证码,对图片里的字母或者数字进行识别读取,使用识图的模块包可以实现。
复杂验证码,无法通过识图识别,可以考虑使用第三方收费服务。
CSS/HTML混淆干扰限制(前端限制)
前端通过CSS或者HTML标签进行干扰混淆关键数据,破解需要抽样分析,找到规则,然后替换成正确的数据
font-face
,自定义字体干扰
如例子:汽车X家论帖子,猫X电影电影评分。
<!--css-->
<!--找到://k3.autoimg.cn/g13/M05/D3/23/wKjByloAOg6AXB-hAADOwImCtp047..ttf-->
<style>
@font-face {font-family: 'myfont';src:
url('//k2.autoimg.cn/g13/M08/D5/DD/wKgH41oAOg6AMyIvAADPhhJcHCg43..eot');src:
url('//k3.autoimg.cn/g13/M08/D5/DD/wKgH41oAOg6AMyIvAADPhhJcHCg43..eot?#iefix')
format('embedded-opentype'),url('//k3.autoimg.cn/g13/M05/D3/23/wKjByloAOg6AXB-hAADOwImCtp047..ttf') format('woff');}
</style>
<!--html-->
<!--会员招募中-->
<div> Mercedes C+ 会员招募<span style='font-family: myfont;'></span></div>
<!--
从html中获取【html中文编码】=
然后解析ttf文件得到【ttf中文编码】列表
匹配发现【ttf中文编码】=uniF159可以与【html中文编码】=匹配,在第7个,第7个中文就是"中"
(抽样分析会发现ttf中中文位置是固定的,中文编码是动态变化的,所以只要映射出【ttf中文编码】索引就可以知道中文字符了)
-->
破解思路:
找到ttf字体
文件地址,然后下载下来,使用font解析模块包
对ttf文件
进行解析,可以解析出一个字体编码的集合,与dom
里的文字编码进行映射,然后根据编码在ttf
里的序号进行映射出中文。
可以使用FontForge/FontCreator工具打开ttf文件进行分析
伪元素隐藏式
通过伪元素来显示重要数据内容,如例子:汽车X家。
<!--css-->
<style>
.hs_kw60_configod::before {
content: "一汽";
}
.hs_kw23_configod::before {
content: "大众";
}
.hs_kw26_configod::before {
content: "奥迪";
}
</style>
<!--html-->
<div>
<span class="hs_kw60_configod"></span>
-
<span class="hs_kw23_configod"></span>
<span class="hs_kw26_configod"></span>
</div>
破解思路:
找到样式文件,然后根据HTML标签里class
名称,匹配出CSS
里对应class中content的内容进行替换。
backgroud-image
通过背景图片的position
位置偏移量,显示数字/符号,如:价格,评分等。根据backgroud-postion
值和图片数字进行映射。
html 标签干扰
通过在重要数据的标签里加入一些有的没的隐藏内容的标签,干扰数据的获取 。如例子:xxIP代理平台
。
<!--html-->
<td class="ip">
<p style="display:none;">2</p>
<span>2</span>
<span style="display:inline-block;"></span>
<div style="display: inline-block;">02</div>
<p style="display:none;">.1</p>
<span>.1</span>
<div style="display:inline-block;"></div>
<span style="display:inline-block;"></span>
<div style="display:inline-block;">09</div>
<span style="display: inline-block;">.</span>
<span style="display:inline-block;">23</span>
<p style="display:none;">7</p>
<span>7</span>
<p style="display:none;"></p>
<span></span>
<span style="display: inline-block;">.</span>
<div style="display: inline-block;"></div>
<p style="display:none;">3</p>
<span>3</span>
<div style="display: inline-block;">5</div>:
<span class="port GEA">80</span>
</td>
<!--js-->
<script>
$(".ip:eq(0)>*:hidden").remove()
$(".ip:eq(0)").text()
</script>
<!--
输出:202.109.237.35:80
通过移除干扰标签里有display:none隐藏标签,然后再获取text就不会有干扰的内容了
-->
破解思路:
过滤掉干扰混淆的HTML标签
,或者只读取有效数据的HTML标签的内容。
… … (反爬虫脑洞有多大,反反爬虫拆招思路就有多淫荡)
防止投毒
有些平台发现爬虫后并不会进行限制封杀,而是给爬虫提
供误导的数据
,影响竞品公司进行错误的决策,这就是投毒。为了防止被投毒,需要对数据进行抽样校验。
总结
目前大部分中小平台对防御爬虫的意识还比较薄弱,促使了爬虫的盛行,通过爬虫可以用比较小的代价,获取更大的利益。
竞品数据的挖掘分析与应用对于业务增长有着举足轻重的作用,爬虫开发对于互联网产品公司的来说是个必不可少的技术。
当前并没有一种可以完全避免爬虫的技术,所以添加反爬虫策略只是增加了一定的难度门槛,只要拆招技术够硬还是可以被突破翻越。
反爬虫和反反爬虫是技术之间的较量,这场没有硝烟的战争永不停息。(程序员何必为难程序员)。
供参考代码
font解析 C#和Python实现
C#
/// 需要引入PresentationCore.dllprivate void Test() {
string path = @"F:\font.ttf";
//读取字体文件
PrivateFontCollection pfc = new PrivateFontCollection();
pfc.AddFontFile(path);
//实例化字体
Font f = new Font(pfc.Families[0], 16);
//设置字体
txt_mw.Font = f;
//遍历输出
var families = Fonts.GetFontFamilies(path);
foreach (System.Windows.Media.FontFamily family in families) {
var typefaces = family.GetTypefaces();
foreach (Typeface typeface in typefaces) {
GlyphTypeface glyph;
typeface.TryGetGlyphTypeface(out glyph);
IDictionary<int, ushort> characterMap = glyph.CharacterToGlyphMap;
var datas = characterMap.OrderBy(d => d.Value).ToList();
foreach (KeyValuePair<int, ushort> kvp in datas) {
var str = $"[{kvp.Value}][{kvp.Key}][{(char)kvp.Key}]\r\n";
txt_mw.AppendText(str);
}
}
}
}
python
# pip install TTFont
from fontTools.ttLib import TTFont
from fontTools.merge import *
me = Merger()
font = TTFont('./font.ttf')
cmaps = font.getBestCmap()
orders = font.getGlyphOrder()
# font.saveXML('F:/1.xml')
print cmaps
print orders
完毕。
近期文章:
欢迎大家转发分享,觉得好就给个赞吧!