Scrapy 爬取旅游景点相关数据(八)重用代理

本期学习:代理的使用与代理池的更新

1 代理IP提取

Scrapy 爬取旅游景点相关数据(六)已经讲到了代理的使用,可以先学习这一期再来看本期内容,

第一步是代理IP提取,下面代码就是在中间件初始化的时候去更新代理池,后面这个2是一次更新的代理服务器的数量,可以看到,代理池是一个列表:

python 复制代码
 class ProxyMiddleware:
    def __init__(self):
        self.proxies = []  #代理池
        self.user = '***'
        self.passw = '***'
        self.update_proxies()  #初始化的时候更新代理池
        self.logger = logging.getLogger(__name__)

    def update_proxies(self):
        self.proxies = get_proxy(self.user, 2)  #这个方法要根据你使用的代理服务自己定制

2 代理使用

使用方式很简单,就是在process_request里加到request.meta里面,注意到,这边先判断了代理池是否是空的,如果是空的,也会触发更新代理池的操作。

python 复制代码
    def process_request(self, request, spider):
        if not self.proxies:
            self.update_proxies()
        proxy = random.choice(self.proxies)
        # print(f"目前使用的代理是:http://{proxy}")
        request.meta['proxy'] = f"http://{self.user}:{self.passw}@{proxy}"
        user_agent_list = [
           ....
        ]
        request.headers['User-Agent'] = random.choice(user_agent_list)

3 异常处理

代理服务器可能存在问题,比如生命期过了,或者被目标网站禁掉了,所以必须要增加异常处理机制,这边特别要说的是这个 TunnelError ,我使用的代理在服务器过期的情况下会抛这个异常,所以异常处理里面需要处理的异常要根据自己的实际情况来写写,下面代码只是给一个参考:

python 复制代码
 # 如果请求过程中发生异常(如网络错误或连接错误),process_exception 方法被调用。
    def process_exception(self, request, exception, spider):
        self.logger.error(f'请求过程中发生异常{type(exception).__name__}' )
        if isinstance(exception, (MaxRetryError, ConnectionError, TunnelError,
                                  ConnectionRefusedError, ResponseNeverReceived)):
            self.logger.warning('出现连接异常,清除代理..')
            self.logger.warning(request.meta.get('proxy'))
            self.remove_proxy(request.meta.get('proxy'))
            return self.retry_request(request)
        return request
        
        
  # 是否要根据异常删除代理池中的代理,也请根据实际测试下来的结果加以修改
   def remove_proxy(self, proxy):
        ip_port = proxy.replace("http://", "")
        self.logger.warning(f'删除代理: {ip_port}')
        self.logger.info(self.proxies)
        self.proxies = [p for p in self.proxies if f"{p}" != ip_port]
        self.logger.info(self.proxies)
        
  # 重试
  def retry_request(self, request):
        if not self.proxies:
            self.update_proxies()
        proxy = random.choice(self.proxies)
        self.logger.info(f"重试,目前使用的代理是: http://{proxy}")
        self.logger.info(self.proxies)

        request.meta['proxy'] = f"http://{self.user}:{self.passw}@{proxy}"
        user_agent_list = [
            ...
        ]
        request.headers['User-Agent'] = random.choice(user_agent_list)

        return request

remove_proxy 会删除指定的代理地址

retry_request 会重发请求

4 测试

小结

开发爬虫是一个非常考验耐心和细心的工作,需要投入大量时间研究,如果对其他内容感兴趣可以去我的专栏,里面还有其他【项目实战】文章。

相关推荐
南京兴帝文化传媒有限公司1 分钟前
本地生活服务商户GEO优化技术实践:AI大模型收录机制与地图POI权重算法拆解
大数据·人工智能·算法·生活·geo优化实操·csdn运营技巧·ai内容收录
投票竞赛5 分钟前
作品投票版权注意事项,线上评选上传图片视频须知
python·音视频
2601_962293538 分钟前
人工智能 & 神经网络完整入门路线(零基础可走,分阶段)
人工智能·python·深度学习·神经网络·机器学习
“AI国潮设计-小江”36 分钟前
【Python/SDXL实战】潮汕国潮IP视觉落地:普宁英歌舞猫IP & 创意甜品设计(附ComfyUI工作流与商业授权说明)
开发语言·人工智能·python·prompt·aigc
529宝宝起名网44 分钟前
用 Python 分析汉字字源与起名用字的关联规律:从六书结构到文化寓意的起名偏好洞察
开发语言·python
一只旭宝1 小时前
Python 与 C/C++ 内存模型对比总结
c语言·c++·python
数字新视界1 小时前
U位资产管理系统助力数字化资产监管与提升效率
大数据·人工智能·数据中心·微模块机房·模块化机房
砚底藏山河1 小时前
容错重试与指数退避:网络抖动手抖不再丢数据(魔码量化实战 #04)
java·数据库·python·金融
梨涡泥窝2 小时前
JavaWeb——基于 Spring Boot + Vue 的图书管理系统的设计与实现
vue.js·spring boot·后端
今儿敲了吗2 小时前
02词云生成器
笔记·python