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.mzph.cn/pingmian/68519.shtml

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

相关文章

gesp(C++六级)(7)洛谷:P10376:[GESP202403 六级] 游戏

gesp(C六级)(7)洛谷:P10376:[GESP202403 六级] 游戏 题目描述 你有四个正整数 n , a , b , c n,a,b,c n,a,b,c,并准备用它们玩一个简单的小游戏。 在一轮游戏操作中,你可以选择将 n n n 减去 a a a&am…

【16届蓝桥杯寒假刷题营】第2期DAY5

5.变变数组 - 蓝桥云课 给定一个长度为 n 的整数数组 A,A 中第 i 个元素为 Ai​(1≤i≤n),你只能在 A 中选择一个元素 a,将 A 中所有数值等于 a 的元素变为 a2,请问变化后 A 中所有元素和的最大为多少。 …

论文阅读(十五):DNA甲基化水平分析的潜变量模型

1.论文链接:Latent Variable Models for Analyzing DNA Methylation 摘要: 脱氧核糖核酸(DNA)甲基化与细胞分化密切相关。例如,已经观察到肿瘤细胞中的DNA甲基化编码关于肿瘤的表型信息。因此,通过研究DNA…

SpringBoot+Electron教务管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.查询课程表代码2.保存学生信息代码3.用户登录代码 一、项目演示 项目演示地址: 视频地址 二、项目介绍 项目描述:这是一个基于SpringBootElectron框架开发的教务管理系统。首先&#xff…

STM32 LED呼吸灯

接线图: 这里将正极接到PA0引脚上,负极接到GND,这样就高电平点亮LED,低电平熄灭。 占空比越大,LED越亮,占空比越小,LED越暗 PWM初始化配置 输出比较函数介绍: 用这四个函数配置输…

RAG是否被取代(缓存增强生成-CAG)吗?

引言: 本文深入研究一种名为缓存增强生成(CAG)的新技术如何工作并减少/消除检索增强生成(RAG)弱点和瓶颈。 LLMs 可以根据输入给他的信息给出对应的输出,但是这样的工作方式很快就不能满足应用的需要: 因…

docker 部署 java 项目详解

在平常的开发工作中,我们经常需要部署项目,开发测试完成后,最关键的一步就是部署。今天我们以若依项目为例,总结下部署项目的整体流程。简单来说,第一步:安装项目所需的中间件;第二步&#xff1…

【C++】STL介绍 + string类使用介绍 + 模拟实现string类

目录 前言 一、STL简介 二、string类 1.为什么学习string类 2.标准库中的string类 3.auto和范围for 4.迭代器 5.string类的常用接口说明 三、模拟实现 string类 前言 本文带大家入坑STL,学习第一个容器string。 一、STL简介 在学习C数据结构和算法前,我…

使用 MSYS2 qemu 尝鲜Arm64架构国产Linux系统

近期,我的师弟咨询我关于Arm64架构的国产CPU国产OS开发工具链问题。他们公司因为接手了一个国企的单子,需要在这类环境下开发程序。说实在的我也没有用过这个平台,但是基于常识,推测只要基于C和Qt,应该问题不大。 1. …

电路研究9.2.3——合宙Air780EP中FTP——FTPGET 命令使用方法研究

怎么说呢,之前也是看的,但是也很迷茫,感觉上虽然是对的,但是无法联系到应用里面,今天研究一下FTP 命令使用方法吧。 15.29 使用方法举例 这里发现下面那些看的不懂呢,于是就返回FTP的应用了。 9.5.4 FTP 应…

单细胞分析基础-第一节 数据质控、降维聚类

scRNA_pipeline\1.Seurat 生物技能树 可进官网查询 添加链接描述 分析流程 准备:R包安装 options("repos"="https://mirrors.ustc.edu.cn/CRAN/") if(!require("BiocManager")) install.packages("BiocManager",update = F,ask =…

【数组OJ】两数之和

两数之和 题目 思路 暴力枚举:逐一遍历,将当前数与之后的数个个相加、判断其相加后是否等于target 代码实现 /*** Note: The returned array must be malloced, assume caller calls free().*///暴力枚举: int* twoSum(int* nums, int nu…

ResNeSt: Split-Attention Networks 参考论文

参考文献 [1] Tensorflow Efficientnet. https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet. Accessed: 2020-03-04. 中文翻译:[1] TensorFlow EfficientNet. https://github.com/tensorflow/tpu/tree/master/models/official/efficien…

Java后端之AOP

AOP&#xff1a;面向切面编程&#xff0c;本质是面向特定方法编程 引入依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>示例&#xff1a;记录…

51单片机开发:独立键盘实验

实验目的&#xff1a;按下键盘1时&#xff0c;点亮LED灯1。 键盘原理图如下图所示&#xff0c;可见&#xff0c;由于接GND&#xff0c;当键盘按下时&#xff0c;P3相应的端口为低电平。 键盘按下时会出现抖动&#xff0c;时间通常为5-10ms&#xff0c;代码中通过延时函数delay…

java求职学习day18

常用的设计原则和设计模式 1 常用的设计原则&#xff08;记住&#xff09; 1.1 软件开发的流程 需求分析文档、概要设计文档、详细设计文档、编码和测试、安装和调试、维护和升级 1.2 常用的设计原则 &#xff08;1&#xff09;开闭原则&#xff08;Open Close Principle…

c++ 定点 new

&#xff08;1&#xff09; 代码距离&#xff1a; #include <new> // 需要包含这个头文件 #include <iostream>int main() {char buffer[sizeof(int)]; // 分配一个足够大的字符数组作为内存池int* p new(&buffer) int(42); // 使用 placement new…

本地部署 DeepSeek-R1 大模型指南:基于 Ollama 的完整流程

Ollama是什么 Ollama 是一个开源的大语言模型本地化部署与管理工具&#xff0c;支持&#xff1a; 一键式模型下载与版本管理 本地化模型推理服务部署 REST API 接口提供 多平台客户端接入支持 整体步骤 安装 OllamaOllama服务配置部署模型客户端配置&#xff08;Page Ass…

Git Bash 配置 zsh

博客食用更佳 博客链接 安装 zsh 安装 Zsh 安装 Oh-my-zsh github仓库 sh -c "$(curl -fsSL https://install.ohmyz.sh/)"让 zsh 成为 git bash 默认终端 vi ~/.bashrc写入&#xff1a; if [ -t 1 ]; thenexec zsh fisource ~/.bashrc再重启即可。 更换主题 …

Controller 层优化四步曲

Controller 层优化四步曲 前言 在开发过程中&#xff0c;Controller 层作为系统与外界交互的桥梁&#xff0c;承担着接收请求、解析参数、调用业务逻辑、处理异常等职责。 然而&#xff0c;随着业务复杂度的增加&#xff0c;Controller 层的代码往往会变得臃肿且难以维护。 …