简单的代理池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给打开