在scrapy 项目中,主要可以通过以下方法来避免被禁止:
1)禁止cookies
2)设置下载延时
3)使用ip池
4)使用用户代理;
5)其他方法,比如进行分布式爬取等(这个就不介绍了)
1.禁止cookies
如果我们要禁止使用cookies,可以在对应scrapy爬虫项目中的settings.py文件进行相应的设置。打开settings.py文件找到一下 两行代码:
只需要把COOKIES_ENABLED=False的注释去掉即可。这样就可以禁用本地的cookie,
2.设置下载延迟时
有的网站会通过我们队网页的访问频率进行分析,如果爬取频率过快,则判断为爬虫自动爬取行为。
我们只需要控制一下爬行时间间隔即可。
打开settings.py文件,会发现如下几行代码:
只要解除这一行的代码注释即可,3代表3秒,如果想将爬虫下载网页的间隔修改,在这里修改就可以。
3.使用ip池
首先在项目核心目录创建下载中间件文件,文件可以自定义,也可以原本的中间件,只需要配置好即可。
在这里我使用创建项目自动生成的中间件。middlewares.py
1)代理ip,大家可以在网上自行搜索,免费ip。 直接在settings.py文件里面,添加如下信息:
此时,IPPOOL就是对应的代理服务器的IP池,外层通过列表形式存储,里面通过字典形式存储。
2)设置好ip池,现在编写中间件。
在scrapy中,与代理服务器相关的下载中间件是HttpProxyMiddleware,在scrapy官方文档中,HttpProxyMiddleware对 应类为:
from scrapy.contrib.downloadermiddleware.httpproxy import HttpProxyMiddleware
所以我们在中间件middleware.py中编写程序实现代码
编写好下载中间件,
3)需要在settings.py文件中进行相应配置,在settings.py文件中,与下载中间件相关的配置默认如下:
上述代码中,第一行根据官方文档配置,必填,
第二行,格式为:下载中间件所在的目录.下载中间件文件名.下载中间件内容要使用的类
"myproject.middlewares.IPPOOLS",myproject为中间件所在目录,middleware为下载中间件文件名,IPPOOL为下 载 中间件内部要使用的类。
现在使用scapy crawl 项目名称 --nolog 显示一下内容,说明使用代理成功:
4.使用用户代理池
1)方法跟上几乎一样,先在setting.py文件设置用户代理池
创建好之后,现在编辑中间件文件中的代码来实现对应功能。
2) 在scrapy中,ua用户代理中使用的下载中间件类型为UserAgentMiddleware,对应的类为:
class scrapy.contrib.downloadermiddleware.usergent.UserAgentMiddleware
可以在下载中间件文件中需要从
from scrapy.contrib.downloadermiddleware.usergent import UserAgentMiddleware
在中间件文件中写如下代码:
3)随后,需要在settings.py文件中该python文件设置为scrapy中的下载中间件,打开settings.py文件,找到有关下载中间件 设置的地方,如下代码:
设置好之后,我们可以运行scrapy项目下的爬虫文件,运行结果如下:
可以看到,此时会通过下载中间件自动随机切换用户代理进行网页爬取。