python-代理池proxy-demo-以及scrapy中使用

简单的代理池demo

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# @Author : CZW
# @Contact :  czw011122@163.com
# 简单的代理池demo

import redis, requests

REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
REDIS_PARAMS = {
    'password': '',
}


class RandomPorxy:
    def __init__(self):
        # 连接redis
        redis_pool = redis.ConnectionPool(host=REDIS_HOST,
                                          port=REDIS_PORT,
                                          password=REDIS_PARAMS["password"],
                                          db=0,
                                          decode_responses=True)
        self.__redis_conn = redis.Redis(connection_pool=redis_pool)
        # 具体参数看博客:https://blog.csdn.net/czw0919/article/details/115063453

    def add(self, proxy):
        """
            添加代理到代理池里
        :param proxy:
        :return:
        """
        self.__redis_conn.lpush("proxy", proxy)

    def get_proxy(self):
        """
            如果代理个数大于0就pop出一个代理
            否则就往代理池里添加一个代理,然后再pop出来 SpiderProxy().get_proxy(1) 这个1可以改大一点无所谓
        :return:
        """
        if self.get_length() > 0:
            return self.__redis_conn.lpop("proxy")
        else:
            SpiderProxy().get_proxy(1)
            return self.__redis_conn.lpop("proxy")

    def get_length(self):
        """
            获取代理池的代理个数
        :return:
        """
        return self.__redis_conn.llen("porxy")


class SpiderProxy:
    # 获取代理
    def __init__(self):
        self.proxy_url = ""  # 代理服务商的请求api
        self.rp = RandomPorxy()

    def get_proxy(self, num):
        """

        :param num:此次请求获取多少个代理
        :return:
        """
        # 具体请求根据代理服务商给的请求文档修改
        resp = requests.get(url=self.proxy_url.format(num)).json()
        if resp.get('code') == 200:
            print("获取代理ip成功")
            # 一般会返回一个列表,只需要遍历列表,存入到redis的proxy里
            datas = resp.get('data')
            for data in datas:
                proxy = 'http://' + data.get('ip') + ':' + str(data.get('port'))
                print("获取到的代理", proxy)
                self.rp.add(proxy)

scrapy中的使用

# scrapy中使用代理--middlewares.py 文件 -- 整体核心就这样子,具体细节还要看代理服务商
class ProxyMiddleware(object):
    def __init__(self):
        self.proxy = RandomPorxy().get_proxy()
        self.count = 0

    def process_request(self, request, spider):
        if self.proxy:
            request.meta["proxy"] = self.proxy
        else:
            spider.logger.info("[代理已用完]   {}".format(self.proxy))
            spider.crawler.engine.close_spider(spider, "无代理关闭爬虫")
            

记得要去 settings.py 文件中把 DOWNLOADER_MIDDLEWARES给打开

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值