爬虫相关知识和技巧

 Pala   2018-03-01 18:16   308 人阅读  0 条评论

爬虫必备技巧

  • 了解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标签进行干扰混淆关键数据,破解需要抽样分析,找到规则,然后替换成正确的数据

1 . 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文件进行分析

2 . 伪元素隐藏式


通过伪元素来显示重要数据内容 

如例子:汽车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的内容进行替换

3 . backgroud-image

通过背景图片的position位置偏移量,显示数字/符号,如:价格,评分等 

根据backgroud-postion值和图片数字进行映射

4 . 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标签的内容

防止投毒

有些平台发现爬虫后并不会进行限制封杀,而是给爬虫提供误导的数据,影响竞品公司进行错误的决策,这就是投毒

为了防止被投毒,需要对数据进行抽样校验

转载:SFLYQ

本文地址:http://chenxm.cc/post/551.html
版权声明:本文为原创文章,版权归 Pala 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?