在scrapy框架中如何设置开放代理池达到反爬的目的

我们在随机爬取某个网站的时候,比如对网站发出成千上万次的请求,如果每次访问的ip都是一样的,就很容易被服务器识别出你是一个爬虫。因此在发送请求多了之后我们就要设置ip代理池来随机更换我们的ip地址,使服务器不那么容易去识别。那么如何在scrapy框架中如何设置ip代理池呢?
事先声明:在阅读本文之前,要对python爬虫和scrapy框架有一定的了解!!!

本篇文章是在我之前写过的一篇名为《在scrapy框架中如何随机更换请求头达到反爬的目的》(https://blog.csdn.net/liumengqi11/article/details/112929481)的基础上写的,这两篇文章都是针对scrapy框架下反爬的,最好是先看那篇文章再来看这个!!!

  • 首先,我们先了解一下比较有名的几家代理服务商:
    * 芝麻代理:http://h.zhimaruanjian.com/getapi/
    * 太阳代理:http://http.taiyangruanjian.com/
    * 快代理:http://www.kuaidaili.com/
    * 讯代理:http://www.xdaili.cn/
    * 蚂蚁代理:http://www.mayidaili.com/
    * 极光代理:http://www.jiguangdaili.com/
    这里我们以芝麻代理为例,登陆芝麻代理官网,注册账户每天即可领取20个免费代理,选择提取数量,ip协议选择HTTPS,数据格式选择json,选择属性为ip port,城市任意,端口位数选择端口位数随机,ip去重选择360天去重,运营商选择不限,最后生成api链接。复制链接在新的浏览器窗口打开,可看到的形式类似如下(这里我选择了两个代理ip,后面在middlewares.py中会用到):
    {"code":0,"data":[{"ip":"27.42.209.154","port":4234},{"ip":"119.115.97.140","port":4245}],"msg":"0","success":true}

  • 上篇文章是用以下三条命令在cmd中执行,建立名为downloadmiddleware的scrapy框架,里面包含一个名为httpbin的Spider:
    scrapy startproject downloadmiddleware
    cd downloadmiddleware
    scrapy genspider httpbin httpbin.org
    这次我们多建立一个名为ipproxy的Spider,命令如下:
    scrapy genspider ipproxy httpbin.org

  • 用pycharm打开此文件,可看到文件的框架如图片左侧(这里我又建立一个run.py文件,代码如图片右侧,方便整个框架的运行,这节课主要是测试ip代理池,所以我就把更换user-agent的给注释掉了):
    在这里插入图片描述

  • ipproxy.py代码如下:

    import scrapy
    class IpproxySpider(scrapy.Spider):
        name = 'ipproxy'
        allowed_domains = ['httpbin.org']
        start_urls = ['http://httpbin.org/ip']
    
        def parse(self, response):
            print('=' * 30)
            print(response.text)
            print('='*30)
            yield scrapy.Request(self.start_urls[0], dont_filter=True)
    
  • middlewares.py的代码如下:

    from scrapy import signals
    from itemadapter import is_item, ItemAdapter
    from fake_useragent import UserAgent
    import random
    
    class UserAgentDownloadMiddleware(object): # UserAgent的
        def process_request(self,request,spider):
            ua = UserAgent()
            # print(ua.random)
            user_agent_str = ua.random
            # print(user_agent_str)
            request.headers['User-Agent'] = user_agent_str
    
    class IPProxyDownloadMiddleware(object): # ip代理池的
        PROXIES = [
            {"ip": "27.42.209.154", "port": 4234}, {"ip": "119.115.97.140", "port": 4245}
        ] # 这个就是ip代理复制过来的
        def process_request(self,request,spider):
            proxy = random.choice(self.PROXIES)
            proxy_url = "http://" + proxy["ip"] + ":" + str(proxy["port"])
            request.meta['proxy'] = proxy_url
    
    
  • settings.py中依旧要更改机器人协议,延迟参数,设置user-agent,唯一不同的是对middlewares的设置需要加一条,具体如下:(参照左面的行数更容易找打对应位置哦):
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

  • 最后运行一下,可以看出现在使用的就是我们的代理ip:
    在这里插入图片描述
    ❤❤❤微博小白,希望大家批评指正❤❤❤

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值