反爬虫机制

一、headers反爬虫 

1.U-A校验

最简单的反爬虫机制应该是U-A校验了。浏览器在发送请求的时候,会附带一部分浏览器及当前系统环境的参数给服务器,这部分数据放在HTTP请求的header部分。

 1.1设置U-A

  我们要做的就是通过requests库设置我们的爬虫U-A。可以用网页上的一个的U-A,也可以用其他电脑打开时的U-A。当然我们如果反复访问同一个网站,却一直使用同一个U-A,也是不行的。可以弄一个U-A池,然后每次访问时都从中随机抽取一个U-A。

1.2 代码实现

requests库设置U-A也很简单。

def download_page(url):

    headers={

          'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'

    }

    data = requests.get(url,headers=headers)

    return data

2.cookies

在headers里面的参数之一,cookies的不全会导致网页请求不到,禁止访问的问题。分析Cookie,可能会携带大量的随机哈希字符串,或者不同时间戳组合的字符串,并且会根据每次访问更新domain的值。

2.1 cookies的添加

一般网站首页的cookies是各分网站的cookies要全,不同的分网站cookies会不一样。cookies也可以建立一个text。

2.2代码实现

def download_page(url):

    headers={

   'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'

'Cookies''signin_redirect=https://www.jianshu.com/p/ da57da18570b;_m7e_session_core=389083a168ea530114d84896cf83016c; locale=zh-CN'

    }

    data = requests.get(url,headers=headers)

    return data

3.referer等字段

还有一部分网站为了防盗链,还会校验请求Headers中的Referer字段。

如果遇到了这类反爬虫机制,可以直接在自己写的爬虫中添加Headers。

  • 代理ip

1.用户userclientip

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

1.1ip查找

网站请求返回后的ip值。同一个ip要想用得久,可以尝试降低请求频率。例如每个一个时间段请求一次或者请求若干次之后sleep一段时间。由于网站获取到的ip是一个区域网的ip,该ip被区域内的所有人共享,因此这个间隔时间并不需要特别长。我们可以在每次访问完网站之后就设置一个time.sleep,限制访问速度。最好是用一台机器从慢到快访问,找到被封的阈值,然后以稍微低一点的速度进行访问。

1.2 代理ip

例如可以专门写一个在网上抓取可用代理ip的脚本,然后将抓取到的代理ip维护到代理池*爬虫使用,当然,实际上抓取的ip不论是免费的还是付费的,通常的使用效果都极为一般,如果需要抓取高价值数据的话也可以考虑购买宽带adsl拨号的VPS,如果ip被目标网站被封掉,重新拨号即可。

proxies = {"http": "http://42.228.3.155:8080",}

requests.get(url, proxies=proxies)

三、访问频率限制

一般来说,真人浏览网页的速度相对程序是很慢的,但是爬虫不一样。如果有人一秒钟访问了100次同一个网站,那几乎毫无疑问,这就是爬虫。一般来说,面对这种情况,我们有两种办法来解决。

第一种办法很简单。既然访问太快会被禁,那我访问慢点就好了啊。第二种方法就是换ip。

  • 验证

1.登陆验证

有些网站,不管你做什么,登录还是访问页面,都需要输入验证码进行验证。在这种情况下,我们必须识别出验证码,才能爬取网站内容。需要输入用户名、验证码等信息。

2.滑块验证

爬虫通过设置连续动作,实现点击、输入、提交、选择、悬浮、滚屏等浏览行为,完整地模拟人浏览网页的操作。

1). 获取验证图片:通过访问登录页面,分析源码找到完整图片和带滑块缺口的图片 ,通过 selenium 键入登录信息。2). 获取缺口位置:通过对比原始的图片和带滑块缺口的图片的像素,计算出滑块缺口的位置,得到所需要滑动的距离。3).模拟拖动:利用selenium进行对滑块的拖拽,注意模仿人的行为:先快后慢,有个对准过程。

3. 图片内文字/图片顺序

这是一个相当古老但却不失有效性的反爬虫策略。更早的时候,这种验证码可以通过OCR技术进行简单的图像识别破解,但是现在来说,验证码的干扰线,噪点已经多到肉眼都无法轻易识别的地步。所以目前而言,由于OCR技术发展不力,验证码技术反而成为了许多网站最有效的手段之一。

五、Ajax(异步加载)

 1.异步加载

上述的几种情况大多都是出现在静态页面,但是对于动态网页,我们需要爬取的数据是通过ajax请求得到,或者通过JavaScript生成的。首先用Firebug或者HttpFox对网络请求进行分析。如果能够找到ajax请求,也能分析出具体的参数和响应的具体含义,我们就能采用上面的方法,直接利用requests或者urllib2模拟ajax请求,对响应的json进行分析得到需要的数据。

能够直接模拟ajax请求获取数据固然是极好的,但是有些网站把ajax请求的所有参数全部加密了。我们根本没办法构造自己所需要的数据的请求。还有一些严防死守的网站,除了加密ajax参数,它还把一些基本的功能都封装了,全部都是在调用自己的接口,而接口参数都是加密的。

2.解决异步加载

遇到这样的网站,我们就不能用上面的方法了,通过selenium+seleuinm框架,调用浏览器内核,并利用seleuinm执行js来模拟人为操作以及触发页面中的js脚本。从填写表单到点击按钮再到滚动页面,全部都可以模拟,不考虑具体的请求和响应过程,只是完完整整的把人浏览页面获取数据的过程模拟一遍。用这套框架几乎能绕过大多数的反爬虫,因为它不是在伪装成浏览器来获取数据。

上一篇:Python3中关于下划线变量和命名的总结


下一篇:【提升自己系列】,Redis性能测试还能这样做