阿C的博客

Date: 2017年5月25日

本文主题-规避反爬虫 什么是反爬虫?参看 # 反爬虫(Anti-spider) #

今天穿插一个话题,教大家怎么规避反爬虫。一般来说我们会遇到网站反爬虫策略主要有下面几点:

  1. 限制IP访问频率,超过频率就断开连接。
  2. 限制UA访问频率,超过频率就断开连接。[介绍]
  3. 限制Session访问频率,超过频率就断开连接。
  4. 限制Cookies访问频率,超过频率就断开连接。
附加说明:
针对IP: 爬虫解决办法是,降低爬虫的速度在每个请求前面加上 sleep() 或者不停的更换代理IP。
针对UA: 爬虫解决办法是,准备大量UserAgent随机调用。

我们今天就来针对1、2两点来写出反爬虫的下载模块,别害怕真的很简单。

使用模块
  • requests(网络请求模块)
  • re(正则表达式模块)
  • random(随机选择模块)
实现思路
  1. 代理IP发布网站中获取有效IP地址;
  2. 本地IP访问网页;当本地IP失效时,转换使用代理IP访问网页;
  3. 代理IP失败六次后转换下一个代理IP。

下面我们开整ヽ(●-`Д´-)ノ


第一步、先看看Python的默认UA
import requests

payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)
print r.text

运行结果:

{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "key1": "value1",
    "key2": "value2"
  },
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Connection": "close",
    "Content-Length": "23",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.13.0"
  },
  "json": null,
  "origin": "220.200.59.163",
  "url": "http://httpbin.org/post"
}

我们可以看到,程序请求页面的UA是这样的: python-requests/2.13.0,而正常浏览器请求页面的UA应该是这样的:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0

规避反爬虫-正常UA

反爬虫程序若做上述检测,则当场被抓现形,直接枪毙。

所以呢,我们必须要伪造正常浏览器访问的UA,同时为了一次性解决 2.限制UA访问频率 ,我们还需要伪造大量的UA,请求时随机选取一个,混淆视听。

Continue reading

KJ法 (极其猥琐的方法) 是日本川喜田二郎提出的一种质量管理工具。这一方法是从错综复杂的现象中,用一定的方式来整理思路、抓住思想实质、找出解决问题新途径的方法。KJ法不同于统计方法。统计方法强调一切用数据说话,而KJ法则主要用事实说话,靠“灵感”发现新思想、解决新问题

KJ法又称A型图解法亲和图法(Affinity Diagram),是新的QC七大手法之一。KJ法是将未知的问题、未曾接触过领域的问题的相关事实、意见或设想之类的语言文字资料收集起来,并利用其内在的相互关系作成归类合并图,以便从复杂的现象中整理出思路,抓住实质,找出解决问题的途径的一种方法。

实施步骤

  1. 准备: 主持人和与会者4~7人。准备好黑板、粉笔、卡片、大张白纸、文具。
  2. 头脑风暴法会议: 主持人请与会者提出30-50条设想,将设想依次写到黑板上。
  3. 制做卡片: 主持人同与会者商量,将提出的设想概括2-3行的短句,写到卡片上。每人写一套。这些卡片称为“基础卡片”
  4. 分成小组: 让与会者按自己的思路各自进行卡片分组,把内容在某点上相同的卡片归在一起,并加一个适当的标题,用绿色笔写在一张卡片上,称为“小组标题卡”。不能归类的卡片,每张自成一组。
  5. 并成中组: 将每个人所写的小组标题卡和自成一组的卡片都放在一起。经与会者共同讨论,将内容相似的小组卡片归在一起,再给一个适当标题,用黄色笔写在一张卡片上,称为“中组标题卡”。不能归类的自成一组。
  6. 归成大组: 经讨论再把中组标题卡和自成一组的卡片中内容相似的归纳成大组,加一个适当的标题,用红色笔写在一张卡片上,称为“大组标题卡”
  7. 编排卡片: 将所有分门别类的卡片,以其隶属关系,按适当的空间位置贴到事先准备好的大纸上,并用线条把彼此有联系的连结起来。如编排后发现不了有何联系,可以重新分组和排列,直到找到联系。
  8. 确定方案: 将卡片分类后,就能分别地暗示出解决问题的方案或显示出最佳设想。经会上讨论或会后专家评判确定方案或最佳设想。

应用流程

  1. 组织团队: 将问题可能涉及的相关部门人员组织起来,少则可以是3-5人,多则数十人。意见特别强烈的人不能被摒除在外,平时不讲话的人,只要工作相关便需邀请参加。
  2. 建立共识: 运用团队技巧,让团体成员降低压力,建立整体共存共荣的一体感,避开针对个人与部门的攻击,减轻防卫性的心理状态。研讨会不要在公司里,封闭式效果更好,座位的安排不要依照组织位阶,围成圆圈马蹄型较佳。
  3. 定义挑战: 清楚提出挑战,并指出期望的结果。例如∶公司已经投入3亿开发高新科技项目,至今尚无成果,我们的目标是找出问题的关键,并决定是否继续投入资金,如果要继续投入,未来该如何控制本项目,并如何确保成果。
  4. 展开脑力激荡: 人数如果在12人以下,可以集体操作,如果在12人以上,最好分成几个小组,每组约4-8人,将同部门的人,分散在不同的小组,以便能互相交流。此阶段主要将所有问题现象详细列出,并将问题写在N次贴的贴纸上,每张贴纸只写一个问题,时间约为30-90分钟。如果问题太多,可以延长时间,但中间需要休息。
  5. 汇集问题: 脑力激荡结束,集合各小组成员,由各小组轮流上台发表脑力激荡结果,并将N次贴一一贴在事先准备好的大海报纸上,如果有相同点,便将该问题贴在一起,当全部发表完后,所有可能的问题已经全部呈现在大家眼前。一般问题会在数十个左右,特别复杂的情况可能多达几百个。
  6. 分类整理: 此时由主持人引导大家将问题分成几个大类,分类完成后,经过检查一遍,便形成几大类的问题了。
  7. 排出顺序: 将每一大类的问题,根据其严重性排列顺序,如果问题甚多,可以分成A、B、C三组,A组是最重要的,B组是一般重要,C组是次要的。
  8. 责任划分: 将各类问题牵涉的部门,以矩阵图的方式列出,并标示出主要负责部门与参与解决部门。
  9. 构思方案: 由主要负责部门带头,举办小型研讨会,并提出建议方案,经由决策小组同意后,形成决策,同时交付执行。
  10. 效果确认与跟进: 根据执行计划,定期与不定期的检讨成果与进度,并做适当的调整与修正,直到问题解决完毕。
  11. 标准化: 如果此问题将来还会遇到,必需将此次的经验,变成标准化的流程,并将相关的资料形成书面化,以利未来的参考,不仅能节省时间与成本,更能促成组织的学习能力,这也是未来组织的重要核心能力-知识管理的能力。如果公司有内联网,应该将此信息公布于网上,以便将此经验转化为全公司的技能。

什么是爬虫和反爬虫?

  • 爬虫:使用技术手段,批量获取网站信息。关键在于批量。
  • 反爬虫:使用技术手段,阻止别人批量获取自己的网站信息。关键也在于批量。
  • 误伤:在反爬虫的过程中,错误的将普通用户识别为爬虫。误伤率高的反爬虫策略,效果再好也不能用。
  • 拦截:成功地阻止爬虫访问。这里会有拦截率的概念。通常来说,拦截率越高的反爬虫策略,误伤的可能性就越高。因此需要做个权衡。
  • 成本:机器成本与人力成本的总和。

注意:人力成本也是资源,而且比机器更重要。因为,根据摩尔定律,机器越来越便宜。而根据IT行业的发展趋势,程序员工资越来越贵。因此,让对方加班才是王道,机器成本并不是特别值钱。

传统反爬虫手段

  • 封IP:后台对访问进行统计,如果单个IP访问超过阈值,予以封锁。
    这个虽然效果还不错,但是其实有两个缺陷,一个是非常容易误伤普通用户,另一个就是,IP其实不值钱,几十块钱甚至有可能买到几十万个IP。所以总体来说是比较亏的。不过针对三月份呢爬虫,这点还是非常有用的。
  • 封session:后台对访问进行统计,如果单个session访问超过阈值,予以封锁。
    session即账号。这个看起来更高级了一些,但是其实效果更差,因为session完全不值钱,重新申请一个就可以了。
  • 封UA:后台对访问进行统计,如果单个UserAgent访问超过阈值,予以封锁。
    这个是大招,类似于抗生素之类的,效果出奇的好,但是杀伤力过大,误伤非常严重,使用的时候要非常小心。至今为止我们也就只短暂封杀过mac下的火狐。(因为爬虫通常使用火狐的UserAgent居多)

注意:组合起来能力变大,误伤率下降,在遇到低级爬虫的时候,还是比较好用的。

纯JAVASCRIPT反爬虫示例

  • 更改连接地址:让对方抓取到错误数据。这种方法简单,但是如果对方针对性的来查看,十分容易被发现。
  • 静态更改密钥:手工操作,做法简单,不易被发现。key即是密钥,通过有意爬取错误数据的方式来迷惑,实际数据已经下来用计算拿到。
  • 动态更改密钥:程序操作,做法简单,不易被发现,代价更低。将静态更改密钥的代码变为0
  • 复合更改密钥:让对方很难分析,如果加了浏览器检测,更难被爬取。

我抓到你了——该怎么办

  • 不会引发生产事件 —— 直接拦截
  • 可能引发生产事件 —— 给假数据(投毒)

注意:一旦发现,技术压制心理战放水……

一些想法

  • 越是低级的爬虫,越容易被封锁,但是性能好,成本低。越是高级的爬虫,越难被封锁,但是性能低,成本也越高。
  • 当成本高到一定程度,我们就可以无需再对爬虫进行封锁。因为考虑边际效应,应该寻找黄金点,该放则放,超过这个点,那就让它爬好了。毕竟我们反爬虫不是为了面子,而是为了商业因素。

更多内容参看: 关于反爬虫,看这一篇就够了 & 缓存图
关注一下技术:PhantomJS & Selenium

Copyright © 2020 阿C的博客

Theme by AC.AsiaUp ↑