Scrapy爬虫项目中避免被禁止爬虫的几种方法

        现在网站的安全性越来越高,并会通过分析用户的行为以及相关信息来判断该用户是否是自动爬虫并会将爬虫行为禁止。不同的网站判断依据也不同,有的根据ip、有的根据用户信息、有的根据访问频率等。因此,本文将具有针对性地介绍几种方法应对不同的情况。

1.禁止Cookie

        有的网站会通过用户的Cookie信息堆用户进行识别和分析,如果将本地的Cookie信息让对方网站无法识别出会话信息,从而无法禁止爬取。对于Scrapy项目来说,可以通过在settings.py文件中进行相应的设置来实现禁用Cookie。如下图所示,默认将COOKIES_ENABLED属性注释了。

        我们可以将注释取消,如下图所示,即可实现禁止Cookie。

 2.设置DOWNLOAD_DELAY

        有的网站会通过用户对网页访问的频率进行分析来判断是否为爬虫自动爬取行为,识别为爬虫行为后便会禁止爬取行为。面对这种情况,可以控制爬虫时间间隔,可以设置DOWNLOAD_DELAY属性来使爬取行为与正常访问无异。如下图所示,settings.py中将DOWNLOAD_DELAY属性注释了。

        将注释取消,并设置需要的值。如下图所示:

3.使用用户代理池

        在前面介绍手写爬虫的时候,强调爬虫时需要模拟浏览器进行爬虫,即对headers的User-Agent属性进行设置。有的网站会分析用户的User-Agent进行反爬虫。我们可以建立一个User-Agent Pool来避免这种情况,用户代理池存放不同的User-Agent,可以 通过随机选用User-Agent从而避免禁止。

1.在settings.py文件中设置用户代理池

#用户代理池设置
UAPOOL=["Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chorome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0",
        "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0",
        "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5"]

 2.在下载中间件文件代码中添加用户代理池相关的代码


#编写下载中间件之用户代理池
class UAPOOLS(UserAgentMiddleware):
    def __init__(self,ua=''):
        self.ua=ua

    def process_request(self, request, spider):
        choiceua=random.choice(UAPOOL)
        print("当前使用的user-agent是:"+choiceua)
        request.headers.setdefault("User-Agent",choiceua)

其中,该类继承scrapy.downloadermiddlewares.useragent.UserAgentMiddleware类,然后实现process_request(self,request,spider)方法,该方法中将请求的User-Agent设置成随机在用户代理池中选中的用户代理。

3.再次在settings.py文件中配置下载中间件:DOWNLOADER_MIDDLEWARES

DOWNLOADER_MIDDLEWARES = {
#    'firstproject.middlewares.FirstprojectDownloaderMiddleware': 543,
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':121,
    'firstproject.middlewares.UAPOOLS':123
    #项目名.中间件文件名.用户代理类
}

用户代理池配置下载中间件时,需要设置两个值,一个是用户代理池需要继承的基类,一个是用户代理池类,两个类都是完全路径。

4.运行爬虫文件,如下图所示。

4.使用IP池

        在手写爬虫时,常会碰到IP禁用的问题,之前手写爬虫常会使用代理IP来解决问题,而在Scrapy通过IP池来解决这类问题,使用的是同样的原理。

1.在settings.py文件中设置IP池

可以在https://www.kuaidaili.com/free/inha/13/或者https://www.xicidaili.com/上找一些代理IP写入IP池,如下所示:

#IP池设置
IPPOOL=[{"ipaddr":"118.187.10.11:80"},
        {"ipaddr":"60.13.42.238:9999"},
        {"ipaddr":"121.33.226.167:3128"},
        {"ipaddr":"123.56.245.138:808"},
        {"ipaddr": "114.67.237.32:808"},
        {"ipaddr": "111.177.170.31:9999"},
        {"ipaddr": "119.101.113.153:9999"},
        {"ipaddr": "116.209.54.10:9999"},
        {"ipaddr": "121.232.148.131:9000"},
        {"ipaddr": "121.232.194.238:9000"},
        {"ipaddr":"116.209.53.196:9999"}]

 2.在下载中间件文件代码中添加用户代理池相关的代码


#编写下载中间件之IP池
class IPPOOLS(HttpProxyMiddleware):
    def __init__(self,ip=''):
        self.ip=ip
    #process_request(),主要进行请求处理
    def process_request(self, request, spider):
        #先随机选择ip
        choiceip=random.choice(IPPOOL)
        print("当前使用的ip是:"+choiceip["ipaddr"])
        #将对应的IP实际添加为具体的代理,用该ip进行爬取
        request.meta["proxy"]="http://"+choiceip["ipaddr"]

        该类继承scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware类,实现process_request(self,request,spider)。通过代码request.meta["proxy"]="http://"+choiceip["ipaddr"]将随机选择的代理ip设置成使用的ip。

3.再次在settings.py文件中配置ip池相关的下载中间件

DOWNLOADER_MIDDLEWARES = {
#    'firstproject.middlewares.FirstprojectDownloaderMiddleware': 543,
    #'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':121,
    #'firstproject.middlewares.UAPOOLS':123
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware':123,
    'firstproject.middlewares.IPPOOLS':125
}

4.运行爬虫程序

        运行爬虫程序,运行结果如下所示:

 

        以上便是Scrapy项目几种避免被禁止的方法。 本文所涉及的代码见github:https://github.com/carson0408/WebCrawler.git 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值