阿C的博客

Tag: Anti-spider

本文主题-规避反爬虫 什么是反爬虫?参看 # 反爬虫(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

什么是爬虫和反爬虫?

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

注意:人力成本也是资源,而且比机器更重要。因为,根据摩尔定律,机器越来越便宜。而根据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 ↑