反爬虫常见套路

  1. 判断user-agent

  2. 校验referer头

  3. 校验cookie

  4. 同一IP访问次数限制

  5. js/ajax动态渲染页面

反反爬虫应对策略

1、user-agent头校验

每次请求设置随机user-agent头。可以引入fake_useragent模块或从http://useragentstring.com/pages/useragentstring.php?typ=browser获取最新请求头。

通过scrapy框架实现,download_middleware中间件,process_request方法。示例:

# 自定义User-Agent列表
request.headers['User-Agent'] = random.choice(USER_AGENTS)# fake_useragent方式实现
from fake_useragent import UserAgent
request.headers['User-Agent'] = str(UserAgent().random)

2、校验referer头

  1. 设置referer为网站主域名

  2. 通过selenium爬取,selenium会自动为每次请求增加referer头

3、校验cookie

对方的网站的cookie规则无法分析/破解难度太大。可以通过selenium/splash处理对cookie的操作,建立cookie池

4、同一ip访问次数限制

如果同一个ip在某个时间段访问频次过高,会被认为是爬虫,封掉ip。解决办法:

1.使用代理ip

1) 批量获取ip,构成ip池
2) 分次请求代理ip接口,每次请求一条ip,获取ip和过期时间

scrapy实现方式,download_middleware中间件,process_request方法。示例:

request.meta['proxy'] = proxy

2.设置抓取频率

修改scrapy settings文件

# 设置下载延迟 3s
DOWNLOAD_DELAY = 3

代理平台对比

指标平台 芝麻代理 快代理 ...
稳定性 中(测试过程中,未发现代理不能用的情况) 未使用,不明确 ...
灵活性 高(参数配置灵活,通过url调用) 未使用,不明确 ...

5、js/ajax动态渲染页面

此类网站可以通过selenium或者splash工具来进行处理。各自优缺点对比:

指标工具 selenium splash
性能 低(每次请求需页面加载完才能进行下一步处理) 高(Twisted和QT,发挥webkit并发能力)
效率 低(模拟浏览器,浏览器底层初始化一些流程) 高(Twisted和QT,发挥webkit并发能力)
运维成本 低(作为scrapy一个类库调用) 高(需配合docker使用,开启docker-splash服务)
内存 高(随时间推移,占用内存越高) 待测试...
灵活性 高(参数配置方便)
使用范围 浏览器测试自动化工具 异步渲染页面

综上所述,爬取动态页面数据,在效率以及爬取性能上,splash会有明显优势。

&Question

1、如何确保100%爬取?

1、代理ip稳定

2、建立失败请求重试机制

2、代理ip被对方网站封掉如何处理?(重试机制?)

通过scrapy框架download_middleware中间件,process_response方法来判断返回参数进行处理。示例:

    def process_response(self, request, response, spider):# 判断response状态码 或 返回内容为验证码,则获取新的代理ipif response.status != 200:self.logger.info('ip被拉黑')# 更新代理ipself.update_proxy()# 返回request对象 重新发起请求return request# 返回response到爬虫脚本return response

也可以作为重试机制之一。

3、selenium代理设置问题及替代方案

通过资料查找以及实践踩坑发现selenium对于代理ip的设置不太友好,而且如何动态切换代理ip也是个问题(也可以实现)。

splash设置动态ip比较方便。示例:

  1. 中间件实现

class ProxyMiddleware(object):def process_request(self, request, spider):request.meta['splash']['args']['proxy'] = proxyServerproxy_user_pass = "USERNAME:PASSWORD"encoded_user_pass = base64.encodestring(proxy_user_pass)request.headers["Proxy-Authorization"] = 'Basic ' + encoded_user_pass
  1. spider实现

def start_requests(self):for url in self.start_urls:yield SplashRequest(url,url=url,callback=self.parse,args={'wait': 5,'proxy': 'http://proxy_ip:proxy_port'}

4、验证码问题

  1. 手动认证(效率太低... 需要人工

  2. 更换ip (方便

  3. 打码平台 (一般的识别验证码类库不稳定,打码平台一般都需要收费

选择哪个,哪种方式更适合,需要测试以及项目需求才能确定。

5、如何高效抓取

  1. 破解对方ajax请求,通过ajax请求获取数据,不走页面

  2. mysql连接池(Twisted、adbapi)

  3. Redis分布式爬虫(Spider.Redis)

  4. 数据写入redis或MongoDB,异步读入mysql

6、Splash

这里以亚马逊为例,爬取亚马逊,使用Splash没有用selenium好,使用splash总是会出现响应丢失的情况,估计是响应时间太长了,后续还需要更加完善的测试。

预选方案

splash + 代理ip + 随机user_agent + cookie池 + 分布式爬虫

Python反爬研究总结相关推荐

  1. (三)Python反爬实战---JS反爬之某网站将json串Data数据加密成一串数字字母

       python反爬经验实战,适合小白入门,新手提升,大牛晋升.包含本人目前遇到反爬汇总,文章一周2-3篇,为了质量考虑,更新较慢,敬请谅解.购买专栏私信博主加微信,可无偿提供学习辅助. 考虑到新手 ...

  2. (四)Python反爬实战---JS反爬之某网站portal-sign验证参数加密

       python反爬经验实战,适合小白入门,新手提升,大牛晋升.包含本人目前遇到反爬汇总,文章一周2-3篇,为了质量考虑,更新较慢,敬请谅解.购买专栏私信博主加微信,可无偿提供学习辅助. 考虑到新手 ...

  3. 悟空问答python反爬_Python写个爬虫碰到反爬了,怎么办那就动手破坏它!

    搞定javascript加密 js加密最简单的是采用md5进行的,我们通过http://fanyi.youdao.com/来演示本篇博客内容 接下来你要注意的是这个请求是由哪个Js文件发起的 文件获取 ...

  4. 不讲武德的Python反爬神器『fake_useragent』

    Hello,大家好哇,我是灰小猿,一个超会写bug的程序猿. 学习过HTTP的小伙伴们应该都知道,我们在进行网站访问时的request请求,通常是需要添加请求头的,否则很多情况下浏览器会认为你是非法请 ...

  5. python反爬与反反爬常用知识点

    服务器反爬的原因1. 爬虫占总PV较高,浪费资源2. 资源被批量抓走,丧失竞争力3. 法律的灰色地带服务器常反什么样的爬虫1. 十分低级的应届毕业生根本不管服务器的压力,很容易把站点搞挂2. 十分低级 ...

  6. Python 反爬篇之 ID 混淆

    爬虫与反爬是一对相生相克的死对头,道高一丈魔高一尺.作为爬虫的一方,如果知道了某个站点的数据自增ID,那么就能轻而易举把整个站点都爬下来.是不是有点耸人听闻,你去看很多大站例如油管.P站等,他们都不会 ...

  7. python 反爬策略_如何应对网站反爬虫策略?如何高效地爬大量数据?

    爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider),这之间的斗争恢宏壮阔... Day 1 小莫想要某站上所有的电影,写了标准的爬虫(基于HttpCl ...

  8. Python反爬机制介绍

    一.UA检测与UA伪装 UA.User-Agent(请求载体的身份标识) UA检测:.门户网站的服务器会检测对应请求的载体身份标识.如果检测到请求的载体身份标识为某一款浏览器,说明该请求是一个正常的请 ...

  9. python 反爬机制_python3爬虫--反爬虫应对机制

    python3爬虫--反爬虫应对机制 内容来源于: 前言: 反爬虫更多是一种攻防战,网络爬虫一般有网页爬虫和接口爬虫的方式:针对网站的反爬虫处理来采取对应的应对机制,一般需要考虑以下方面: ①访问终端 ...

最新文章

  1. NOIP2011 提高组 Day1
  2. Redis专题-缓存穿透、缓存雪崩、缓存击穿
  3. VTK修炼之道2_VTK体系结构1
  4. Linux shell重复执行某命令n次
  5. 程序员必备的10大健康装备!
  6. opencv3.4.0在ubuntu16.04上的安装
  7. 回头再说-006 时间音乐
  8. 编译器各个步骤的介绍
  9. C# DataTable.Rows.Add(DataRow) 该行已经属于另一个表
  10. winpcap基本原理及常见应用_锁相放大器的基本原理(Part 1)
  11. excel npoi 连接_Asp.Net使用Npoi导入导出Excel的方法
  12. 开源WebRTC 服务器介绍
  13. 点击换图 秀米的svg_时隔五年再用秀米,我发现了这个超强玩法。
  14. 阿里巴巴29个屌炸天的开源项目!
  15. 『暗香记忆』十世成佛
  16. Mac上可与“时间机器”搭配使用的备份磁盘
  17. 关于小程序订单中心页设置的公告
  18. 用聚合数据API(苏州实时公交API)快速写出小程序
  19. mysql支持多语言_MySQL整理以存储未知语言的多语言数据
  20. 力学笃行系列之JAVA后台知识体系整理

热门文章

  1. cannot find package “github.com/json-iterator/go“cannot find package “github.com/modern-go/reflect2“
  2. Redis 笔记(05)— hash 类型(设置获取单个hash值、判断hash键是否存在、设置获取多个hash值、获取所有hash的键、获取所有hash的值、删除hash指定键)
  3. tf.nn.embedding_lookup()的用法
  4. LeetCode简单题之字符串转化后的各位数字之和
  5. C ++基本输入/输出
  6. 实时双频Wi-Fi如何实现下一代车内连接
  7. 客快物流大数据项目(八):Docker的安装和启动
  8. 女友问粉丝过万如何庆祝,我发万字长文《保姆级大数据入门篇》感恩粉丝们支持,学姐|学妹|学弟|小白看了就懂
  9. PHP获取今天,昨天,本月,上个月,本年 起始时间戳
  10. ubuntu 系统下安装 xlwt