最近一直在弄爬虫,也爬取了知名网站的一些数据(这里只是个人学习使用,不是商用!!!),大家都知道,爬虫和反爬虫一直以来都是相爱相杀的,爬虫程序员希望破解反爬虫手段,反爬虫程序员希望建立更加有效的反爬虫方式与之抗衡。

由于在这阶段进行的爬虫学习中,经常中招,所以今天就简单的总结一下反爬虫的方式。

一.BAN IP

网页的运维人员通过分析日志发现最近某一个IP访问量特别特别大,某一段时间内访问了无数次的网页,则运维人员判断此种访问行为并非正常人的行为,于是直接在服务器上封杀了此人IP(我刚爬取的网站的维护人员可能对我实施了这种手段...)。

解决方法:此种方法极其容易误伤其他正常用户,因为某一片区域的其他用户可能有着相同的IP,导致服务器少了许多正常用户的访问,所以一般运维人员不会通过此种方法来限制爬虫。不过面对许多大量的访问,服务器还是会偶尔把该IP放入黑名单,过一段时间再将其放出来,但我们可以通过分布式爬虫以及购买代理IP也能很好的解决,只不过爬虫的成本提高了。

二.BAN USERAGENT

很多的爬虫请求头就是默认的一些很明显的爬虫头python-requests/2.18.4,诸如此类,当运维人员发现携带有这类headers的数据包,直接拒绝访问,返回403错误

解决方法:直接r=requests.get(url,headers={'User-Agent':'XXXspider'})把爬虫请求headers伪装成其他爬虫或者其他浏览器头就行了。

案例:雪球网

三.BAN COOKIES

服务器对每一个访问网页的人都set-cookie,给其一个cookies,当该cookies访问超过某一个阀值时就BAN掉该COOKIE,过一段时间再放出来,当然一般爬虫都是不带COOKIE进行访问的,可是网页上有一部分内容如新浪微博是需要用户登录才能查看更多内容(我已经中招了)。

解决办法:控制访问速度,或者某些需要登录的如新浪微博,在某宝上买多个账号,生成多个cookies,在每一次访问时带上cookies

案例:蚂蜂窝

四.验证码验证

当某一用户访问次数过多后,就自动让请求跳转到一个验证码页面,只有在输入正确的验证码之后才能继续访问网站

解决办法:python可以通过一些第三方库如(pytesser,PIL)来对验证码进行处理,识别出正确的验证码,复杂的验证码可以通过机器学习让爬虫自动识别复杂验证码,让程序自动识别验证码并自动输入验证码继续抓取

案例:51Job  安全客

五.javascript渲染

网页开发者将重要信息放在网页中但不写入html标签中,而浏览器会自动渲染<script>标签的js代码将信息展现在浏览器当中,而爬虫是不具备执行js代码的能力,所以无法将js事件产生的信息读取出来

解决办法:通过分析提取script中的js代码来通过正则匹配提取信息内容或通过webdriver+phantomjs直接进行无头浏览器渲染网页。

案例:前程无忧网

随便打开一个前程无忧工作界面,直接用requests.get对其进行访问,可以得到一页的20个左右数据,显然得到的不全,而用webdriver访问同样的页面可以得到50个完整的工作信息。

六.ajax异步传输

访问网页的时候服务器将网页框架返回给客户端,在与客户端交互的过程中通过异步ajax技术传输数据包到客户端,呈现在网页上,爬虫直接抓取的话信息为空

解决办法:通过fiddler或是wireshark抓包分析ajax请求的界面,然后自己通过规律仿造服务器构造一个请求访问服务器得到返回的真实数据包。

案例:拉勾网

打开拉勾网的某一个工作招聘页,可以看到许许多多的招聘信息数据,点击下一页后发现页面框架不变化,url地址不变,而其中的每个招聘数据发生了变化,通过chrome开发者工具抓包找到了一个叫请求了一个叫做http://www.lagou.com/zhaopin/Java/2/?filterOption=3的网页,打开改网页发现为第二页真正的数据源,通过仿造请求可以抓取每一页的数据。

七.加速乐

有些网站使用了加速乐的服务,在访问之前先判断客户端的cookie正不正确。如果不正确,返回521状态码,set-cookie并且返回一段js代码通过浏览器执行后又可以生成一个cookie,只有这两个cookie一起发送给服务器,才会返回正确的网页内容。

解决办法 :将浏览器返回的js代码放在一个字符串中,然后利用nodejs对这段代码进行反压缩,然后对局部的信息进行解密,得到关键信息放入下一次访问请求的头部中。

案例:加速乐

这样的一个交互过程仅仅用python的requests库是解决不了的,经过查阅资料,有两种解决办法:

1.将返回的set-cookie获取到之后再通过脚本执行返回的eval加密的js代码,将代码中生成的cookie与之前set-cookie联合发送给服务器就可以返回正确的内容,即状态码从521变成了200。

2.将返回的set-cookie获取到之后再通过脚本执行返回的eval加密的js代码,将代码中生成的cookie与之前set-cookie联合发送给服务器就可以返回正确的内容,即状态码从521变成了200。

大家一起学习,一起进步。

Scrapy爬虫教程二 浅析最烦人的反爬虫手段相关推荐

  1. Scrapy定向爬虫教程(二)——提取网页内容

    本节内容 在这一小结,我将介绍如何使用Scrapy通过Selector选择器从网页中提取出我们想要的内容,并将这些内容存放到本地文件. 我们的目标网页是http://www.heartsong.top ...

  2. python爬虫教程-Python教父|廖雪峰老师官方爬虫教程,13个案例带你全面入门!

    原标题:Python教父|廖雪峰老师官方爬虫教程,13个案例带你全面入门! Python简直就是万能的,你用Python都做过哪些事? 用网页看各大网站的VIP视频,用python下载? 用Pytho ...

  3. 使用scrapy做爬虫遇到的一些坑:网站常用的反爬虫策略,如何机智的躲过反爬虫Crawled (403)

    在这幅图中我们可以很清晰地看到爬虫与反爬虫是如何进行斗智斗勇的. 在学习使用爬虫时,我们制作出来的爬虫往往是在"裸奔",非常的简单. 简单低级的爬虫有一个很大的优点:速度快,伪装度 ...

  4. 「爬虫教程」吐血整理,最详细的爬虫入门教程

    初识爬虫 学习爬虫之前,我们首先得了解什么是爬虫.来自于百度百科的解释: 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息 ...

  5. 【爬虫教程】吐血整理,最详细的爬虫入门教程~

    初识爬虫 学习爬虫之前,我们首先得了解什么是爬虫. 来自于百度百科的解释: 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信 ...

  6. python爬虫教程视频-13天搞定Python分布爬虫

    1. 什么是爬虫? 网络爬虫也叫网络蜘蛛,如果把互联网比喻成一个蜘蛛网,那么蜘蛛就是在网上爬来爬去的蜘蛛,爬虫程序通过请求url地址,根据响应的内容进行解析采集数据, 比如:如果响应内容是html,分 ...

  7. python实战爬虫有道翻译与解决{“errorCode”:50}反爬虫问题

    title: python实战爬虫有道翻译与解决有道翻译反爬虫问题 date: 2020-03-22 20:21:12 description: 最近在学Python,一直没有尝试过实战.于是昨天试了 ...

  8. 秒拨动态ip切换技术python_Python爬虫如何通过更换IP避开网站的反爬虫机制(一)...

    爬取网站的时候经常会遇到网站上都部署了反爬虫机制,当服务器检测到一段时间内同一个 IP 持续密集的访问网站,则将其判定为爬虫程序,在一段时间内不允许该 IP 地址访问服务器. 这种情况其实可以写个延迟 ...

  9. Python 爬虫工程师必看,深入解读字体反爬虫

    字体反爬虫开篇概述 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深的知识. 那么针对这 ...

最新文章

  1. python相似图片聚类分类
  2. System.arraycopy 和Arrays.copyOf
  3. mysql 忘记root密码 进行重置
  4. 读取oracle注释
  5. BLE-NRF51822教程13-连接时触发配对
  6. jquery ajax设置头部,jQuery Ajax 设置请求头
  7. #react 之ant design Pro 学习研究#----启动项目
  8. SpringBoot精通系列-Spring Boot中如何配置Https
  9. UI素材模板|App搜索页UI界面设计版式
  10. java批量导入和批量删除_MyBatis 实现批量插入和删除中双层循环的写法案例
  11. 工程linux下创建svn仓库目录结构
  12. 3.2 Hadoop生态
  13. PyQt5简单的例子
  14. (转)“版本上线延时”问题与对策的探讨
  15. LeetCode Array 最长回文子串-数组和string题目
  16. android之StorageManager介绍
  17. 【Redis】Redis入门详解(一)
  18. 浅谈IDEA Scratch files万能的临时文件功能
  19. 联想HINKPAD X220安装MacOS Mojave
  20. shell脚本复制文件

热门文章

  1. java 覆盖_Java 方法覆盖
  2. 一文带你搞懂Go语言函数选项模式,Go函数一等公民。
  3. Unknown column '××' in 'where clause',出现这个问题,如何处理?
  4. 补天 公益src 爬虫
  5. 商品分享--图片分享
  6. HTML实现表格rowspan、colspan操作
  7. 那些黄金交易平台可以进行黄金模拟交易
  8. CESS 与企业家们的见面:去中心化云存储如何助力企业进入 Web3?
  9. ccd相机图像处理思考
  10. 两种计算Java对象大小的方法