Python Scrapy反爬虫常见解决方案(包含5种方法)
爬虫的本质就是“抓取”第二方网站中有价值的数据,因此,每个网站都会或多或少地采用一些反爬虫技术来防范爬虫。比如前面介绍的通过 User-Agent 请求头验证是否为浏览器、使用 JavaScript 动态加载资源等,这些都是常规的反爬虫手段。
下面针对更强的反爬虫技术提供一些解决方案。
IP 地址验证
有些网站会使用 IP 地址验证进行反爬虫处理,程序会检查客户端的 IP 地址,如果发现同一个 IP 地址的客户端频繁地请求数据, 该网站就会判断该客户端是爬虫程序。
针对这种情况,我们可以让 Scrapy 不断地随机更换代理服务器的 IP 地址,这样就可以欺骗目标网站了。
为了让 Scrapy 能随机更换代理服务器,可以自定义一个下载中间件,让该下载中间件随机更换代理服务器即可。
Scrapy 随机更换代理服务器只要两步:
- 打开 Scrapy 项目下的 middlewares.py 文件,在该文件中增加定义如下类
class RandomProxyMiddleware (object) :
#动态设置代理服务器的IP 地址
def process request (self, request, spider):
# get_random_proxy() 函数随机返回代理服务器的IP 地址和端口
request.meta["proxy"] = get_random_proxy()- 上面程序通过自定义的下载中间件为 Scrapy 设置了代理服务器。程序中的 get_random_proxy() 函数需要能随机返回代理服务器的 IP 地址和端口,这就需要开发者事先准备好一系列代理服务器,该函数能随机从这些代理服务器中选择一个。
- 通过 settings.py 文件设置启用自定义的下载中间件。在 settings.py 文件中增加如下配置代码:
#配置自定义的下载中间件
DOWNLOADER MIDDLEWARES = {
'ZhipinSpider.middlewares.RandomProxyMiddleware': 543,
}禁用Cookie
有些网站可以通过跟踪 Cookie 来识别是否是同一个客户端。Scrapy 默认开启了 Cookie,这样目标网站就可以根据 Cookie 来识别爬虫程序是同一个客户端。
目标网站可以判断,如果同一个客户端在单位时间内的请求过于频繁,则基本可以断定这个客户端不是正常用户,很有可能是程序操作(比如爬虫),此时目标网站就可以禁用该客户端的访问。
针对这种情况,可以让 Scrapy 禁用 Cookie(Scrapy 不需要登录时才可禁用 Cookie)。在 settings.py 文件中取消如下代码的注释即可禁用 Cookie:
COOKIES_ENABLED = False
违反爬虫规则文件
在很多 Web 站点目录下都会提供一个 robots.txt 文件,在该文件中制定了一系列爬虫规则。例如,Weibo.com 网站下的 robots.txt 文件的内容如下:
Sitemap: http://weibo.com/sitemap.xml User-Agent: Baiduspider Disallow : User-agent : 360Spider Disallow : User-agent : Googlebot Disallow : User-agent : Sogou web spider Disallow : User-agent:bingbot Disallow : User-agent : smspider Disallow : User-ageηt : HaosouSpider Disallow : User-agent : YisouSpider Disallow : User-agent : * Disallow : /
该规则文件指定该站点只接受 Baidu 的网络爬虫,不接受其他爬虫程序。
为了让爬虫程序违反爬虫规则文件的限制,强行爬取站点信息,可以在 settings 文件中取消如下代码的注释来违反站点制定的爬虫规则:
#指定不遵守爬虫规则
ROBOTSTXT OBEY = False限制访问频率
正如前面所提到的,当同一个 IP 地址、同一个客户端访问目标网站过于频繁时(正常用户的访问速度没那么快),其很可能会被当成机器程序(比如爬虫)禁止访问。
为了更好地模拟正常用户的访问速度,可以限制 Scrapy 的访问频率。在 settings 文件中取消如下代码的注释即可限制 Scrapy 的访问频率:
#开启访问频率限制
AUTOTHROTTLE ENABLED = True
#设置访问开始的延迟
AUTOTHROTTLE START DELAY = 5
#设置访问之间的最大延迟
AUTOTHROTTLE MAX DELAY = 60
#设置Scrapy 并行发给每台远程服务器的请求数量
AUTOTHROTTLE TARGET CONCURRENCY= 1.0
#设置下裁之后的自动延迟
DOWNLOAD DELAY = 3图形验证码
有些网站为了防止机器程序访问,会做一些很“变态”的设计,它会记录同一个客户端、同一个IP地址的访问次数,只要达到一定的访问次数(不管你是正常用户,还是机器程序),目标网站就会弹出一个图形验证码让你输入,只有成功输入了图形验证码才能继续访问。
为了让机器识别这些图形验证码,通常有两种解决方式:
- 使用 PIL、Libsvrn 等库自己开发程序来识别图形验证码。这种方式具有最大的灵活性,只是需要开发人员自己编码实现。
- 通过第三方打码平台识别。有不少图形验证码的在线识别网站,它们的识别率基本可以做到 90% 以上。但是识别率高的在线识别网站通常都要收费,而免费的往往识别率不高,还不如自己写程序来识别。
Python Scrapy反爬虫常见解决方案(包含5种方法)的更多相关文章
- python scrapy简单爬虫记录(实现简单爬取知乎)
之前写了个scrapy的学习记录,只是简单的介绍了下scrapy的一些内容,并没有实际的例子,现在开始记录例子 使用的环境是python2.7, scrapy1.2.0 首先创建项目 在要建立项目的目 ...
- Python中模拟enum枚举类型的5种方法分享
这篇文章主要介绍了Python中模拟enum枚举类型的5种方法分享,本文直接给出实现代码,需要的朋友可以参考下 以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码代码如下: # way1 ...
- Python执行系统命令并获得输出的几种方法
[root@a upfc]# ./ffmpeg-linux64-v3.3.1 -i a.mp3 ffmpeg version N-86111-ga441aa90e8-static http://joh ...
- Python+Selenium自动化-定位页面元素的八种方法
Python+Selenium自动化-定位页面元素的八种方法 本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子. 0.元素定位方法主要有: id定位:find_elemen ...
- Python并发编程之创建多线程的几种方法(二)
大家好,并发编程 进入第二篇. 今天的内容会比较基础,主要是为了让新手也能无障碍地阅读,所以还是要再巩固下基础.学完了基础,你们也就能很顺畅地跟着我的思路理解以后的文章. 本文目录 学会使用函数创建多 ...
- python将字符串转换成字典的几种方法
当我们遇到类似于{‘a’:1, 'b':2, 'c':3}这种字符串时,想要把它转换成字典进行处理,可以使用以下几种方法: 1. Python自带的eval函数(不安全) dictstr = '{&q ...
- 判断python字典中key是否存在的两种方法
今天来说一下如何判断字典中是否存在某个key,一般有两种通用做法,下面为大家来分别讲解一下: 第一种方法:使用自带函数实现. 在python的字典的属性方法里面有一个has_key()方法,这个方法使 ...
- 把swf反编译成fla的几种方法
2007年著 第一种方法: 利用IMPERATOR FLA1.63 ,这个软件有演示版 和正式版 , 演示版不能反编译Action Scropt,在利用正式版反编译的过程中有时会丢失Action Sc ...
- python scrapy框架爬虫遇到301
1.什么是状态码301 301 Moved Permanently(永久重定向) 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一.如果可能,拥有链接编 ...
随机推荐
- Python基础(解压序列)
解压序列: a,b=(1,2) # a,b=[1,2] print(a,b) #输出结果:1 2 #获取第一个值和最后一个值 a,*_,c=(1,2,3,4,5,6,7,8,9) print(a) p ...
- Spring之旅第五篇-AOP详解
一.什么是AOP? Aspect oritention programming(面向切面编程),AOP是一种思想,高度概括的话是“横向重复,纵向抽取”,如何理解呢?举个例子:访问页面时需要权限认证,如 ...
- service相关
本篇仍以问题为驱动 一.什么时Service? Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,只不过它没有UI界面,是在后台运行的组件.Ser ...
- ASP.NET Core - 开篇
由来 ASP.NET Core 是一个跨平台的高性能开源框架,ASP.NET Core第一次出现在我们眼前是以 ASP.NET vNext 命名的,然后又重新命名为ASP.NET 5,为了表明它并不是 ...
- 机器学习之KNN原理与代码实现
KNN原理与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/9670187.html 1. KNN原理 K ...
- 搞懂MySQL分区
一.InnoDB逻辑存储结构 首先要先介绍一下InnoDB逻辑存储结构和区的概念,它的所有数据都被逻辑地存放在表空间,表空间又由段,区,页组成. 段 段就是上图的segment区域,常见的段有数据段. ...
- stream,file,filestream,memorystream简单的整理
一.Stream 什么是stream?(https://www.cnblogs.com/JimmyZheng/archive/2012/03/17/2402814.html#no8) 定义:提供字节序 ...
- 如何将workerman部署到windows服务器上面
一直以来对php的即时通讯都很好奇,其实是不知道应该怎么来实现,后来了解到了swoole和workerman这两个神器,他们都可以实现即时通信的功能,其中swoole是C语言编写的php扩展,其配置起 ...
- 程序员50题(JS版本)(八)
程序36:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人推出圈子,问最后留下的是原来第几号的那位 var n=20; var arr=[]; for(var i=0;i& ...
- FreeNas搭建踩坑指南(二)
0x00 权限配置 FreeNas完成后配置用户组及权限,新建用户和用户组后添加Samba共享(Windows模式),无法准确控制权限,尝试在系统中修改权限提示"Operation not ...