Scrapy如何设置iP,并实现IP重用, IP代理池重用

前置知识

1/3乐观锁

这是我学Redis时的笔记

2/3 Scrapy流程(非全部)

在这里插入图片描述

3/3 关于付费代理

我用的"快代理", 1000个ip, 每个ip1min的有效期, 你用的时候, 把你的链接, 用户名填上去就行

设置代理IP 🔒

  • & 帮助文档: ①meta ②meta#proxy
  • $ 语法: ①proxy的设置: Request对象中有个meta属性, 其下有个proxy属性, request.meta['proxy']="http://2.2.3.3:4324" ②download-timeout属性
  • ! 卡点: Scrapy的异步是, 将所有的请求(近乎)同一时刻发出, 所以需要一个"版本锁"/"乐观锁"的思想(Redis的锁)

1.不可重用, 同步的思路

# Version_1: 因为异步延迟问题, 导致的ip复用失败
class IpDownloaderMiddleware:def __init__(self):# self.current_proxy_ip = self.get_proxy_ip()  # 初始化当前代理IPself.current_proxy_ip = "http://3.3.3.3:3333"  # 模拟ip失效@classmethoddef from_crawler(cls, crawler):s = cls()return sdef process_request(self, request: Request, spider):request.meta['proxy'] = self.current_proxy_ip  # 使用当前代理IPrequest.meta['download_timeout'] = 1  # 1s内没有返回就超时return Nonedef process_response(self, request: Request, response: Response, spider):if response.status != 200:print(f"请求失败: {request.url}, 状态码: {response.status}")self.current_proxy_ip = self.get_proxy_ip()  # 获取新的代理IPrequest.meta['proxy'] = self.current_proxy_ip  # 更新请求的代理IPreturn request  # 返回请求以重试return responsedef process_exception(self, request, exception, spider):print(f"请求 {request.url} 发生异常: {exception}")self.current_proxy_ip = self.get_proxy_ip()  # 获取新的代理IPrequest.meta['proxy'] = self.current_proxy_ip  # 更新请求的代理IPreturn request  # 返回请求以重试def get_proxy_ip(self):api_url = "换成你的付费ip代理地址"proxy_ip = requests.get(api_url).textusername = "你的账号"password = "你的密码"return f"http://{username}:{password}@{proxy_ip}/"

2. 可重用单ip版本

# Version_2: 采用类似"版本锁"的思想, 构建复用单ip
#   大体思路: 一个ip就是一个版本, ①版本相同+报错=ip失效(需要获取新ip) ②版本不同+报错=ip未及时更新(更新版本即可,无需获取新ip)
class IpDownloaderMiddleware_V2:def __init__(self):# self.current_proxy_ip = self.get_proxy_ip()  # 初始化当前代理IPself.current_proxy_ip = "http://3.3.3.3:8923"  # 模拟ip失效@classmethoddef from_crawler(cls, crawler):s = cls()return sdef process_request(self, request: Request, spider):request.meta['proxy'] = self.current_proxy_ip  # 使用当前代理IPrequest.meta['download_timeout'] = 1  # 1s内没有返回就超时request.meta['max_retry_times'] = 3  # 最多尝试0次# 打印当前是第几次tryif "retry_times" not in request.meta:request.meta['retry_times'] = 1print(f"url:{request.url}, {request.meta['retry_times']}/{request.meta['max_retry_times']}")return Nonedef process_response(self, request: Request, response: Response, spider):if response.status != 200:self.check_version(request)return requestreturn responsedef process_exception(self, request, exception, spider):if isinstance(exception, twisted.internet.error.TimeoutError):self.check_version(request)return requestdef check_version(self, request):# 检测版本# case1:版本相同,意味着ip失效, 需要新的ipif request.meta['proxy'] == self.current_proxy_ip:self.current_proxy_ip = self.get_proxy_ip()  # 更新iprequest.meta['proxy'] = self.current_proxy_ipprint("获取新ip成功!!!")# case2: 版本不同,意味着未及时更新ipelse:print("ip未及时更新,已正确赋值新ip")request.meta['proxy'] = self.current_proxy_ipdef get_proxy_ip(self):api_url = "换成你的付费ip代理地址"proxy_ip = requests.get(api_url).textusername = "你的账号"password = "你的密码"return f"http://{username}:{password}@{proxy_ip}/"

3. 可复用ip代理池

# Version_3: 同Version_2的思想, 构建ip池
class IpDownloaderMiddleware_V3:def __init__(self):self.pool_size = 5self.proxy_ip_pool = [f"http://3.3.3.3:333{i}" for i in range(self.pool_size)]  # 模拟失效ip# self.proxy_ip_pool = [self.get_proxy_ip() for _ in range(self.pool_size)]  # 初始化当前代理IP@classmethoddef from_crawler(cls, crawler):s = cls()return sdef process_request(self, request: Request, spider):request.meta['proxy'] = random.choice(self.proxy_ip_pool)  # 使用当前代理IPrequest.meta['download_timeout'] = 1  # 1s内没有返回就超时request.meta['max_retry_times'] = 3  # 最多尝试0次# 打印当前是第几次tryif "retry_times" not in request.meta:request.meta['retry_times'] = 1print(f"url:{request.url}, {request.meta['retry_times']}/{request.meta['max_retry_times']}")return Nonedef process_response(self, request: Request, response: Response, spider):if response.status != 200:self.check_version(request)return requestreturn responsedef process_exception(self, request, exception, spider):if isinstance(exception, twisted.internet.error.TimeoutError):self.check_version(request)return requestdef check_version(self, request):# 检测版本# case1:版本相同[在ip池里有],意味着ip失效, 需要新的ipif request.meta['proxy'] in self.proxy_ip_pool:# 更新ipself.proxy_ip_pool.remove(request.meta['proxy'])  # 删除错误版本self.proxy_ip_pool.append(self.get_proxy_ip())  # 相当于替换request.meta['proxy'] = random.choice(self.proxy_ip_pool)print("获取新ip成功!!!")# case2: 版本不同,意味着未及时更新ipelse:request.meta['proxy'] = random.choice(self.proxy_ip_pool)print("ip未及时更新,已正确赋值新ip")print(f"当前代理池:{self.proxy_ip_pool}")def get_proxy_ip(self):api_url = "换成你的付费ip代理地址"proxy_ip = requests.get(api_url).textusername = "你的账号"password = "你的密码"return f"http://{username}:{password}@{proxy_ip}/"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/8332.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

渗透测试-WAF是什么以及原理解释 waf功能详解

目录 waf功能介绍 waf出现的地点: 什么是waf 功能: 常见的系统攻击分为两类 一是利用Web服务器的漏洞进行攻击 二是利用网页自身的安全漏洞进行攻击 WAF主要功能: waf的特点1 waf主要功能2 网马木马主动防御及查杀 流量监控 网站漏洞防御功能 危险组件…

KF-GINS源码阅读

原始 Markdown文档、Visio流程图、XMind思维导图见:https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 一、KF-GINS 简介1、程序概述2、相关资料3、文件结构4、第三方库 二、编译、调试三、类型定义1、核心类:GIEngine2、文件读写类型3、配…

基础项目实战——3D赛车(c++)

目录 前言一、渲染引擎二、关闭事件三、梯形绘制四、轨道绘制五、边缘绘制六、草坪绘制七、前后移动八、左右移动​九、曲线轨道​十、课山坡轨道​十一、循环轨道​十二、背景展示​十三、引入速度​十四、物品绘制​十五、课数字路障​十六、分数展示​十七、重新生成​十八、…

探索与创新:DeepSeek R1与Ollama在深度研究中的应用

在当今信息爆炸的时代,获取和处理信息的能力变得至关重要。特别是在学术和研究领域,如何有效地进行深度研究是一个亟待解决的问题。最近,一个名为DeepSeek R1的模型结合Ollama平台提供了一种创新的解决方案。本文将分析并解构这一新兴的研究工…

【Linux】gdb——Linux调试器

gdb使用背景 程序的发布方式有两种,debug模式和release模式 Linux gcc/g出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项 gdb使用方法 首先进入gdb gdb test_glist显示代码 断点 b 行…

【单链表算法实战】解锁数据结构核心谜题——环形链表

题目如下: 解题过程如下: 环形链表:尾结点的next指针不为空,而是指向链表中的任一结点。 思路:快慢指针,慢指针每次走一步,快指针每次走两步。快慢指针在环中追逐相遇,那么这个链表…

56. 合并区间

【题目】&#xff1a;56. 合并区间 class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {// 按照左端点排序sort(intervals.begin(), intervals.end(), [&](vector<int> lhs, vector<int> rhs)…

01-硬件入门学习/嵌入式教程-CH340C使用教程

前言 CH340C广泛应用于DIY项目和嵌入式开发中&#xff0c;用于USB数据转换和串口通信。本文将详细介绍CH340C的基本功能、引脚接线及使用方法。 CH340C简介 CH340C是一款USB转TTL电平转换器&#xff0c;可以将电脑的USB数据转换成串口数据&#xff0c;方便与单片机&#xff…

深度学习|表示学习|卷积神经网络|详细推导每一层的维度变化|14

如是我闻&#xff1a; 一个经典的卷积神经网络&#xff08;CNN&#xff09;架构&#xff0c;呈现的是输入图像通过多个卷积层、池化层以及全连接层&#xff0c;最终输出分类结果的过程。整个过程的核心是理解输入特征图的尺寸如何在每一层发生变化&#xff0c;我们可以通过卷积…

5.1.4 软件工具+开发环境

文章目录 软件工具软件开发环境 软件工具 软件工具是辅助软件工程实施的软件&#xff0c;也叫CASE工具。软件工具可分为支持软件开发过程的工具、软件维护工具、软件管理工具3类。 支持软件开发过程的工具 需求分析工具&#xff1a;从需求定义制定出功能规范&#xff0c;描述软…

ospf动态路由配置,cost路径调整,ospf认证实验

一、实验拓扑如图&#xff1a; 接口ip配置网络 &#xff1a;10.17.12.* 10.17.13.* &#xff0c;10.17.23.* 回环接口配置分别为 10.0.1.1 &#xff0c;10.0.1.2&#xff0c;10.0.1.3对应三台路由器 ar1配置接口ip interface GigabitEthernet0/0/0 ip address 10.17.12.1…

通过亚马逊云科技Bedrock打造自定义AI智能体Agent(上)

大家对于智能体代理Agent一定已经非常熟悉&#xff0c;自主代理&#xff08;Autonomous Agents&#xff09; 目前在AI行业极其热门并具有巨大的潜力&#xff0c;能够显著提升开发者日常的工作效率、自动化日常琐碎、重复性任务&#xff0c;并生成全新的内容。Agent可以理解用户…

Sklearn 中的逻辑回归

逻辑回归的数学模型 基本模型 逻辑回归主要用于处理二分类问题。二分类问题对于模型的输出包含 0 和 1&#xff0c;是一个不连续的值。分类问题的结果一般不能由线性函数求出。这里就需要一个特别的函数来求解&#xff0c;这里引入一个新的函数 Sigmoid 函数&#xff0c;也成…

基于STM32的循迹小车设计与实现

1 系统方案设计 根据系统设计功能&#xff0c;展开基于STM32的循迹小车设计&#xff0c;整体设计框图如图2.1所示。系统采用STM32单片机作为控制器,通过L298驱动器控制两个直流电机实现对小车的运动控制&#xff0c;两路红外模块实现黑线的检测&#xff0c;HC-SR04超声波模块实…

异或哈希总结

例题 例题1https://codeforces.com/problemset/problem/1175/Fhttps://codeforces.com/problemset/problem/1175/F 例题2https://codeforces.com/contest/2014/problem/Hhttps://codeforces.com/contest/2014/problem/H例题4https://codeforces.com/contest/1418/problem/Ght…

深入理解若依RuoYi-Vue数据字典设计与实现

深入理解若依数据字典设计与实现 一、Vue2版本主要文件目录 组件目录src/components&#xff1a;数据字典组件、字典标签组件 工具目录src/utils&#xff1a;字典工具类 store目录src/store&#xff1a;字典数据 main.js&#xff1a;字典数据初始化 页面使用字典例子&#xf…

Leecode刷题C语言之跳跃游戏②

执行结果:通过 执行用时和内存消耗如下&#xff1a; int jump(int* nums, int numsSize) {int position numsSize - 1;int steps 0;while (position > 0) {for (int i 0; i < position; i) {if (i nums[i] > position) {position i;steps;break;}}}return steps…

【C++数论】880. 索引处的解码字符串|2010

本文涉及知识点 数论&#xff1a;质数、最大公约数、菲蜀定理 LeetCode880. 索引处的解码字符串 给定一个编码字符串 s 。请你找出 解码字符串 并将其写入磁带。解码时&#xff0c;从编码字符串中 每次读取一个字符 &#xff0c;并采取以下步骤&#xff1a; 如果所读的字符是…

1月27(信息差)

&#x1f30d;喜大普奔&#xff0c;适用于 VS Code 的 GitHub Copilot 全新免费版本正式推出&#xff0c;GitHub 全球开发者突破1.5亿 &#x1f384;Kimi深夜炸场&#xff1a;满血版多模态o1级推理模型&#xff01;OpenAI外全球首次&#xff01;Jim Fan&#xff1a;同天两款国…

18款炫酷烟花合集

系列专栏 《Python趣味编程》《C/C趣味编程》《HTML趣味编程》《Java趣味编程》 写在前面 Python、C/C、HTML、Java等4种语言实现18款炫酷烟花的代码。 Python Python烟花① 完整代码&#xff1a;Python动漫烟花&#xff08;完整代码&#xff09;-CSDN博客 ​ Python烟…