前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >反爬虫和抗DDOS攻击技术实践

反爬虫和抗DDOS攻击技术实践

原创
作者头像
ZNing
修改于 2017-06-29 02:35:00
修改于 2017-06-29 02:35:00
5.7K00
代码可运行
举报
文章被收录于专栏:ZNing·腾创库ZNing·腾创库
运行总次数:0
代码可运行

导语

企鹅媒体平台媒体名片页反爬虫技术实践,分布式网页爬虫技术、利用人工智能进行人机识别、图像识别码、频率访问控制、利用无头浏览器PhantomJS、Selenium 进行网页抓取等相关技术不在本文讨论范围内。

Cookie是什么

大家都知道http请求是无状态的,为了让http请求从“无状态” to “有状态” , W3C 在 rfc6265 中描述了整个http协议的状态机制,既从客户端(通常是浏览器)到服务器端的流转过程,cookie 的引入使得 服务器在 接收到请求时可以区分用户和状态。

通过上边这张图,我们可以容易的发现,这个过程就好像“上车打票”一样,有普通票(不记名)和 也月票(“记名的票”),有位伟大的程序员曾经说过“如果你的程序逻辑和实际生活中的逻辑反了,就一定是你错了”。

言归正传,为什么反爬虫

互联网有很多业务或者说网页,是不需要用户进行登录的(不记名的票),你可以简单的认为这其实是一个“不需要记录http状态的业务场景”(注意这里是简单认为,但其实并不是无状态的),那这些不需要登录的页面,往往又会包含大量的聚合信息,比如新闻门户网站、视频门户网站、搜索引擎,这些信息是公开的,其实是可以可以被爬虫抓取的,站长甚至还要做SEO(搜索引擎优化)让搜索引擎或其他网站更多更经常的去收录自己的整站,以便推广,那既然我们要做SEO优化为什么还要 “反爬虫” ?

因为通过程序进行 URL 请求 去获得数据的成本是很低的,这就造成大量抵质量网页爬虫在网络横行,对业务方的服务器造成不必要的流量浪费和资源消耗。

网页爬虫到底有多容易

正常打开的界面内容是这样的

查看网页源代码,看看我们要抓取的目标,这里就不在演示了,然后利用Chrome开发者工具提供的 “Copy as curl”

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl 'https://v.qq.com/' -H 'Pragma: no-cache' -H 'DNT: 1' -H 'Accept-Encoding: gzip, deflate, sdch, br' -H 'Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Cache-Control: no-cache' -H 'Cookie: tvfe_boss_uuid=ad12b5df44c4af49; ad_play_index=34; pgv_info=ssid=s9710442890; ts_last=v.qq.com/; pgv_pvid=7925047056; ts_uid=578794400; qv_als=778esxpJSKmr5N0bA11491899166PnRBKw==' -H 'Connection: keep-alive' --compressed

然后你会发现,与“查看网页源代码” 没有区别,说明我们已经成功获得数据内容。

反爬虫效果是什么样的?

我们通过浏览器直接打开下面这个链接 ,会发现请求到的结果是个JSON

现在我们重复刚刚的 “Copy as curl” 的过程,看看是否依然能获得正确结果 ? 答案是否定的,我们来验证一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl 'https://media.om.qq.com/media/5054675/list' -H 'pragma: no-cache' -H 'dnt: 1' -H 'accept-encoding: gzip, deflate, sdch, br' -H 'accept-language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4' -H 'upgrade-insecure-requests: 1' -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36' -H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'cache-control: no-cache' -H 'authority: media.om.qq.com' -H 'cookie: signiture=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjpbXSwiZWkiOjUsInN0IjoiMTQ5MTg5OTczNjQ3NyIsImlhdCI6MTQ5MTg5OTc0M30.fTAsbJZNOTsHk0QoLfZIA-AXhO6ezaCOiCTj8lYCqO4; tvfe_boss_uuid=ad12b5df44c4af49; pgv_info=ssid=s9710442890; pgv_pvid=7925047056; omuisid=eyJ1aWQiOiI5ZGVjMjRiN2UxM2FiNGUyZWJjNWRhMGU1N2EyYTRkZSJ9; omuisid.sig=5wAr5khpxGvFDp3WpkJ6_QX9iE4' -H 'referer: https://media.om.qq.com/media/5054675/list' --compressed

我们会发现得到的是一个网页而不是 JSON,命中了反爬虫逻辑

到底发生了什么?

前面提到了 “不记名票据” 和 因推广需求网站不需要登录的场景,那针对这样的情况,是否我们就真的不需要对请求进行签名呢 ? 答案是否定的,不花钱或花很少的钱就可以免费进入公园游玩了,游客可能本身是感受不到“票据”的存在,但其实我们还是需要对用户进行标记,这里发散一下,其实统计网站在追踪pv/uv时也是进行了类似的“标记”,下面我们通过一张图来描述下上面请求发生的过程

这里我们有两次签名过程,一次在服务器端进行,一次在客户端进行,因为在这个页面是不需要用户登录,所以在服务器端进行签名,对于爬虫来说是一个几乎没有成本的过程,它可以每次来“园子”里玩的时候,都申请一张新的票,伪装成为一个“新的用户”,为了应对如此低廉的成本,我们增加“客户端进行签名”的流程,有人说“客户端签名是不靠谱的,因为你的代码别人都是可以看到的是可以破解的”,这个地方的客户端签名不是为了数据安全,而是为了增加爬虫进行抓取的成本,因为一般网页爬虫都不具备 js 之行能力,这样就增加了它抓取的成本。

另外一点,签名虽然是由客户端签发的,但是却是由服务器端进行验证,我们这里是利用 JWT(JSON WEB TOKEN) 进行了 encode和decode过程,且通过将服务器时间对客户端进行下发,完成有效期控制。

起到一定的防DDOS攻击的效果

通过上图我们可以看到,关键就是两次票据的签发与验证,一次由浏览器签发,一次由后台签发,但是验证真伪都是在服务端进行,这样做的最终效果就是,要对我们的界面进行抓取或攻击的人,必须按照我们设定的套路运转,就会增加他下载js并执行我们js的过程,如果有攻击方利用xss 获的肉机,对我们的域名发起攻击时,由于我们有两次票据验证,而去其中有一个票据的有效期时间很短,基本上不太可能对我们的服务器造成连续伤害了。

如果网页抓取人,通过使用完全模拟浏览器的运行环境的第三方软件(PhantomJS、Selenium,WEBDRIVER)对我们进行抓取,其实效率是很慢的,基本上需要5-6秒完成一次, 基本上比一个真实的用户打开网页还要慢很多,对于这种可以当成是真是用户一样对待,数据本来就是开放的

接入这套反爬、防DDOS逻辑后,从模调系统查看数据后台服务被击穿的现象已经完成消失,异常流量已被隔离。隔离。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
反-反爬虫:用几行代码写出和人类一样的动态爬虫
Phantomjs简介 什么是Phantomjs Phantomjs官网介绍是:不需要浏览器的完整web协议栈(Full web stack No browser required),也就是常说的无头
T4erg
2017/09/14
3.8K0
反-反爬虫:用几行代码写出和人类一样的动态爬虫
Python 爬虫浏览器伪装技术
浏览器伪装技术 浏览器伪装技术实战 1 网站常见的反爬虫和应对方法 一般网站从三个方面反爬虫:用户请求的Headers,用户行为,网站目录和数据加载方式。 前两种比较容易遇到,大多数网站都从这些角度来
Python知识大全
2020/02/13
2K0
Python 爬虫浏览器伪装技术
Python网络爬虫(一)- 入门基础1.通用爬虫 VS 聚焦爬虫2.HTTP & HTTPS3.urllib24.常用的响应报头(了解)
1.选择已有的url地址,将url地址添加到爬取队列 2.从提取url,DNS解析主机IP,将目标主机IP添加到爬取队列 3.分析网页内容,提取链接,继续执行上一步操作
Python攻城狮
2018/08/23
1.7K0
Python网络爬虫(一)- 入门基础1.通用爬虫 VS 聚焦爬虫2.HTTP & HTTPS3.urllib24.常用的响应报头(了解)
解决Postman响应Json过大无法下载
当Postman在请求一个超大的响应且类型是Json的时候(我们测试Json大约是 98Mb ),然后Postman就像Chrome浏览器一样,(HTTP状态码是200)无法查看响应的结果了。这样对于这类特定场景,想要看到这个超大Json,然后定位问题来说,是很不友好的。
收心
2024/06/04
5010
解决Postman响应Json过大无法下载
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
  ♥各位如果想要交流的话,可以加下QQ交流群:974178910,里面有各种你想要的学习资料。♥
不温卜火
2020/11/26
4.6K0
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
HTTP请求报文和响应报文
文章作者:Tyan 博客:noahsnail.com  |  CSDN  |  简书
Tyan
2022/05/09
9190
反爬虫之检测PhantomJS访客(翻译文)
翻译前言:作为数据采集工程师经常和反爬虫技术做斗争,其中我使用的爬虫结构是:分布式+多机器+adsl | tor+phantomjs无界面浏览器+机器学习验证码破解/这样的结构已经基本属于爬虫界的大招。但是对方如果通过检测phantomjs的浏览器特性还是能区别出爬虫。于是翻译本文知己知彼,翻译功底不好切勿见怪,高手请移步文尾部可以看英语原文。
十四君
2019/11/27
1.8K0
爬虫与反爬虫技术简介
互联网的大数据时代的来临,网络爬虫也成了互联网中一个重要行业,它是一种自动获取网页数据信息的爬虫程序,是网站搜索引擎的重要组成部分。通过爬虫,可以获取自己想要的相关数据信息,让爬虫协助自己的工作,进而降低成本,提高业务成功率和提高业务效率。
2020labs小助手
2022/09/20
9180
爬虫 (七) 必须掌握的基础概念 (四)
理论上所有的响应头信息都应该是回应请求头的。但是服务端为了效率,安全,还有其他方面的考虑,会添加相对应的响应头信息,从上图可以看到:
公众号---人生代码
2019/12/26
9780
python 爬虫学习笔记
爬虫,说白了其实就是一段自动抓取互联网信息的程序,它不需要我们自己手动一个一个地打开网站搜索信息,我们只需要制定规则,就可以让程序按照规则自动获取信息。
EmoryHuang
2022/10/31
4360
python 爬虫学习笔记
左手用R右手Python系列——模拟登陆教务系统
最近在练习R语言与Python的网络数据抓取内容,遇到了烦人的验证码问题,走了很多弯路,最终总算解决了。 在分享这篇文章之前,只想感慨一声,虽然Python拥有更为完善的爬虫生态和多如牛毛的爬虫分享课程,但是貌似这些大部分内容,使用R语言中的RCurl+httr都可以做到,但是可惜的利用R语言学习爬虫的爱好者与Pythoner相比,实在是太少了,R语言的高阶爬虫教程凤毛麟角,只能一点一点儿在stackflow上面搜罗整理。 希望我的这一篇案例能给大家带来一点儿可借鉴的思路。 R library("RCurl
数据小磨坊
2018/04/11
1.5K0
左手用R右手Python系列——模拟登陆教务系统
运用phantomjs无头浏览器破解四种反爬虫技术
在与反爬虫的对抗中,我们爬虫的大招有两个,其一是多种ip跟换方式(例如adsl|代理|tor等请参看之前的文章)。其二是无头浏览器,使用自动化的技术来进行自动数据抓取,模拟鼠标与键盘事件,可以用于破解验证码,js解析,诡异的模糊数据这类型的反爬虫技术
十四君
2019/11/27
1.9K0
巨细!Python爬虫详解
导读:爬虫(又称为网页蜘蛛,网络机器人,在 FOAF 社区中间,更经常的称为网页追逐者);它是一种按照一定的规则,自动地抓取网络信息的程序或者脚本。
IT阅读排行榜
2021/04/20
3.9K0
巨细!Python爬虫详解
HTTP 协议格式
参考:https://www.cnblogs.com/breka/articles/9791664.html
润森
2019/10/12
1.5K0
HTTP 协议格式
python爬虫入门(一)urllib和urllib2
爬虫简介  什么是爬虫? 爬虫:就是抓取网页数据的程序。 HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法。 HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)简单讲是HTTP的安全版,在HTTP下加入SSL层。 SSL(Secure Sockets Layer 安全套接层)主要用于Web的安全传输协议,在传输层对网络连接进行加密,保障在Int
zhang_derek
2018/04/11
2K0
python爬虫入门(一)urllib和urllib2
使用Python快速获取公众号文章定制电子书(一)
因为工作原因,小之停更了一段时间,发生了很多事,不过从今天开始,我将会满血复活。这篇文章将分享一个我最近写的 Python 相关的小 demo 。爬取某个公众号的所有历史文章,并导出到本地,方便之后在线下环境直接观看。
小之丶
2018/07/27
6070
使用Python快速获取公众号文章定制电子书(一)
反爬虫和反反爬虫(上篇)
公众号爬取今日头条的那一期,不少小伙伴反应爬取下来的图片无法查看或者爬取不了,小詹也重新试了下,的确是的,写那篇推文的时候,头条还比较友好,没有添加反爬措施,大概是爬取的朋友太多,对其造成了极大的压力吧,添加了某些反爬技术,然而,上有政策,下有对策,粉丝群有小伙伴改写了程序并添加了反反爬策略进行了妹子的爬取~
小小詹同学
2018/07/24
3.7K0
反爬虫和反反爬虫(上篇)
python爬虫(二)_HTTP的请求和响应
HTTP和HTTPS HTTP(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收HTML页面的方法 HTTPS(HyperText Transfer Protocol over Secure Socket Layer)简单讲是HTTP的安全版,在HTTP下加入SSL层。 SSL(Secure Socket Layer安全套接层)主要用于web的安全传输协议,在传输层对网络连接进行加密,保障在Internet上数据传输的安全。 HTTP的端口号为80 HTTPS
用户1174963
2018/01/17
2.9K0
python爬虫(二)_HTTP的请求和响应
Scrapy爬虫教程二 浅析最烦人的反爬虫手段
企鹅号小编
2017/12/28
2.6K0
Scrapy爬虫教程二 浅析最烦人的反爬虫手段
软件测试|Chrome 浏览器+Postman做接口测试
如果把测试简单分为两类,那么就是客户端测试和服务端测试。客户端的测试包括UI测试,兼容性测试等,服务端测试包括接口测试。接口测试检查数据的交换,传递和控制管理过程,它绕过了客户端,直接对服务端进行测试。
霍格沃兹测试开发Muller老师
2023/01/09
6980
推荐阅读
相关推荐
反-反爬虫:用几行代码写出和人类一样的动态爬虫
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档