爬虫之简单反爬虫措施和解决方法

news/2024/7/19 9:44:59 标签: pyhon, 爬虫

0x01 常见的反爬虫

  这几天在爬一个网站,网站做了很多反爬虫工作,爬起来有些艰难,花了一些时间才绕过反爬虫。在这里把我写爬虫以来遇到的各种反爬虫策略和应对的方法总结一下。

  从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。这里我们只讨论数据采集部分。

  一般网站从三个方面反爬虫:用户请求的Headers,用户行为,网站目录和数据加载方式。前两种比较容易遇到,大多数网站都从这些角度来反爬虫。第三种一些应用ajax的网站会采用,这样增大了爬取的难度。

 0x02 通过Headers反爬虫

  从用户请求的Headers反爬虫是最常见的反爬虫策略。很多网站都会对Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测(一些资源网站的防盗链就是检测Referer)。如果遇到了这类反爬虫机制,可以直接在爬虫中添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者将Referer值修改为目标网站域名。对于检测Headers的反爬虫,在爬虫中修改或者添加Headers就能很好的绕过。

 0x03 基于用户行为反爬虫

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

  大多数网站都是前一种情况,对于这种情况,使用IP代理就可以解决。可以专门写一个爬虫,爬取网上公开的代理ip,检测后全部保存起来。这样的代理ip爬虫经常会用到,最好自己准备一个。有了大量代理ip后可以每请求几次更换一个ip,这在requests或者urllib2中很容易做到,这样就能很容易的绕过第一种反爬虫

  对于第二种情况,可以在每次请求后随机间隔几秒再进行下一次请求。有些有逻辑漏洞的网站,可以通过请求几次,退出登录,重新登录,继续请求来绕过同一账号短时间内不能多次进行相同请求的限制。

 0x04 动态页面的反爬虫

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

  能够直接模拟ajax请求获取数据固然是极好的,但是有些网站把ajax请求的所有参数全部加密了。我们根本没办法构造自己所需要的数据的请求。我这几天爬的那个网站就是这样,除了加密ajax参数,它还把一些基本的功能都封装了,全部都是在调用自己的接口,而接口参数都是加密的。遇到这样的网站,我们就不能用上面的方法了,我用的是selenium+phantomJS框架,调用浏览器内核,并利用phantomJS执行js来模拟人为操作以及触发页面中的js脚本。从填写表单到点击按钮再到滚动页面,全部都可以模拟,不考虑具体的请求和响应过程,只是完完整整的把人浏览页面获取数据的过程模拟一遍。

  用这套框架几乎能绕过大多数的反爬虫,因为它不是在伪装成浏览器来获取数据(上述的通过添加 Headers一定程度上就是为了伪装成浏览器),它本身就是浏览器,phantomJS就是一个没有界面的浏览器,只是操控这个浏览器的不是人。利用 selenium+phantomJS能干很多事情,例如识别点触式(12306)或者滑动式的验证码,对页面表单进行暴力破解等等。它在自动化渗透中还 会大展身手,以后还会提到这个。


http://www.niftyadmin.cn/n/1435049.html

相关文章

爬虫之scrapy工作流程

Scrapy是什么? scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量代码,就能够快速的抓取到数据内容。Scrapy 使用了 Twisted[twɪstɪd](其主要对手是Tornado)异步网络框架来处理网络通讯&#…

关系型数据库和非关系型数据库的区别

关系数据库和NoSQL数据的区别 关系数据库,结构严谨、符合关系理论,可以存储结构化数据;支持比较复杂的数据关系关联查询;支持事务,可以保障数据安全;支持SQL语言做操作。 NoSQL: 结构简单、健值对关系&am…

迭代器,生成器,装饰器简述

装饰器 它是指对函数执行过程,做一些扩展,甚至可以更改本身函数的执行,它就是在不改变源码的情况下,给它添加新的功能 python提供的内置装饰器有? classmethod修饰类函数,可以由对象和类调用,…

非关系数据库的分类

NoSql的分类 键值(Key-Value)存储数据库 相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB 典型应用: 内容缓存,主要用于处理大量数据的高访问负载。 数据模型: 一系列键值对 优势: 快速查询 劣势…

redis 入门(更新中)

什么是redis Redis是使用c语言开发的一个高性能键值数据库。Redis可以通过一些键值类型来存储数据。 键值类型: String字符类型 map散列类型 list列表类型 set集合类型 sortedset有序集合类型 redis的应用场景 缓存(数据查询、短连接、新闻内容、…

大数据入门(一)

大数据入门 hadoopHDFSYARNSPARKhadoop hadoop生态圈包括以下各个组成部分: HDFS:用于分布式文件存储,切分成块,多副本存于多台机器。 YARN:用于资源管理和调度,job scheduling & cluster mangment Zookeeper…

计算机经典书籍推荐

这个列表包括了 100 多本经典技术书籍,涵盖:计算机系统与网络、系统架构、算法与数据结构、前端开发、后端开发、移动开发、数据库、测试、项目与团队、程序员职业修炼、求职面试 和 编程相关的经典书籍。 本列表综合了伯乐在线网站以往推荐经典书籍文章…

爬虫基础之Requests库入门

Requests库入门 import requests r requests.get("http://www.baidu.com") r.status_code r.encoding utf-8 r.text Requests库的7个主要方法 方法说明requests.request()构造一个请求,支持以下各方法的基础方法requests.get()获取HTML网页的主要方法…