前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >反爬虫和反反爬虫(上篇)

反爬虫和反反爬虫(上篇)

作者头像
小小詹同学
发布2018-07-24 17:39:40
3.4K0
发布2018-07-24 17:39:40
举报
文章被收录于专栏:小詹同学小詹同学

公众号爬取今日头条的那一期,不少小伙伴反应爬取下来的图片无法查看或者爬取不了,小詹也重新试了下,的确是的,写那篇推文的时候,头条还比较友好,没有添加反爬措施,大概是爬取的朋友太多,对其造成了极大的压力吧,添加了某些反爬技术,然而,上有政策,下有对策,粉丝群有小伙伴改写了程序并添加了反反爬策略进行了妹子的爬取~

那么今天小詹就带着大家一起学习学习爬虫中的反爬和反反爬知识(二者概念通俗易懂,就不进行介绍啦)~

反爬虫

现在越来越多的网站或者APP都有反爬的策略,我们得知道,为什么那些网站会存在反爬虫。大抵有几点原因:避免内部信息的泄露,导致经济上损失;避免非人为操作,爬虫过于频繁,造成服务器的崩溃。

反爬虫的方式有很多:

1. 最为经典的反爬虫策略当属“验证码”了。因为验证码是图片,用户登录时只需输入一次便可录成功,而我们程序抓取数据过程中,需要不断的登录,手动输入验证码是不现实的,所以验证码的出现难倒了一大批人。

2.一种比较恶心又比较常见的反爬虫策略当属封ip和封账号,当你抓取频率过快时,ip或者账号被检测出异常会被封禁。

3.还有一种比较普通的反爬虫策略:通过cookie限制抓取信息,比如我们模拟登陆之后,想拿到登陆之后某页面信息,千万不要以为模拟登陆之后就所有页面都可以抓了,有时候还需要请求一些中间页面拿到特定cookie,然后才可以抓到我们需要的页面。

4.另外一种比较常见的反爬虫模式当属采用JS渲染页面了。什么意思呢,就是返回的页面并不是直接请求得到,而是有一部分由JS操作DOM得到,所以那部分数据我们也拿不到咯。

……

反爬虫技术很多,今天主要讲的是大家平时爬妹子图时候比较容易遇到的:

(1)通过Headers反爬虫

从用户请求的Headers反爬虫是最常见的反爬虫策略。很多网站都会对Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测(一些资源网站的防盗链就是检测Referer)。

(2)基于用户行为的反爬虫

还有一部分网站是通过检测用户行为,例如同一IP短时间内多次访问同一页面,或者同一账户短时间内多次进行相同操作。

(3)动态页面的反爬虫

上述的几种情况大多都是出现在静态页面,还有一部分网站,我们需要爬取的数据是通过ajax请求得到,或者通过JavaScript生成的。

反反爬虫

对应较为常见的几种反爬技术进行介绍,实现反反爬!

(1)通过Headers反爬虫

如果遇到了这类反爬虫机制,可以直接在爬虫中添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者将Referer值修改为目标网站域名。对于检测Headers的反爬虫,在爬虫中修改或者添加Headers就能很好的绕过。

修改Headers有两种方式。一种是通过Request的headers参数进行修改,另一种是利用Request.add_header()方法进行修改。

代码语言:javascript
复制
#方式一:
header = {}
header['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
方式二:
req = urllib.request.Request(url)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36')

(2)基于用户行为的反爬虫

大多数网站都是前一种情况,对于这种情况,使用IP代理就可以解决。可以专门写一个爬虫,爬取网上公开的代理ip,检测后全部保存起来。这样的代理ip爬虫经常会用到,最好自己准备一个。有了大量代理ip后可以每请求几次更换一个ip,这在requests或者urllib2中很容易做到,这样就能很容易的绕过第一种反爬虫。使用代理IP步骤如下图:

如下代码,百度的三个代理,使用ip代理。

代码语言:javascript
复制
proxies = ['125.120.201.62:808',   
    '183.159.91.240:18118',  
    '171.12.182.238:26316',
    ]
proxy = random.choice(proxies)
proxy_support = urllib.request.ProxyHandler({'http':proxy})
opener = urllib.request.build_opener(proxy_support)
urllib.request.install_opener(opener)

对于第二种情况,可以在每次请求后随机间隔几秒再进行下一次请求(time.sleep函数)。有些有逻辑漏洞的网站,可以通过请求几次,退出登录,重新登录,继续请求来绕过同一账号短时间内不能多次进行相同请求的限制。

(3)动态页面的反爬虫

首先用Firebug或者HttpFox对网络请求进行分析。如果能够找到ajax请求,也能分析出具体的参数和响应的具体含义,我们就能采用上面的方法,直接利用requests或者urllib2模拟ajax请求,对响应的json进行分析得到需要的数据。

往期推荐

Python爬虫系列——入门到精通

Python爬虫实例之——小说下载

老司机带你用python来爬取妹子图

知乎大神爬取高颜值美女(Python爬虫+人脸检测+颜值检测)

千元资料免费送——人工智能相关(100G+)

资源福利第二弹——PPT模板和求职简历

资源福利第三弹——Python等教程(包括部分爬虫入门教程)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小詹学Python 微信公众号,前往查看

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

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档