Python爬虫:制作一个属于自己的IP代理模块
前言
在Python爬虫过程中,为了避免被网站的反爬虫机制干扰,我们需要使用IP代理。所谓IP代理,就是通过修改网络请求中的IP地址,来达到隐藏真实IP地址的效果。本文将教你如何制作一个自己的IP代理模块,让你的爬虫更加稳定、安全。

1. 理解IP代理的原理
在网络请求中,我们通常会使用requests库的get()或者post()方法来发送GET或者POST请求。其中,get()方法使用的是HTTP协议,在发送请求的同时,会将本机IP地址作为请求的来源地址附加到HTTP报文头中。而post()方法则使用的是HTTPS协议,在发送请求的时候,会先建立一条TLS连接,然后再发送请求。在TCP协议层面,它的报文头中也会包含本机IP地址等信息。
在这种情况下,如果我们在短时间内频繁发送请求,很容易被网站的反爬虫机制锁定IP地址,从而导致爬虫无法正常运行。为了避免这种情况的发生,我们可以使用IP代理,利用代理服务器的IP地址来代替本机IP地址,从而达到伪装的效果。
2. 实现代理IP池
要使用IP代理,首先我们需要获取到可用的代理IP地址。这里我们可以使用一些免费的代理IP网站来获取可用的代理IP地址,比如国内的代理66、快代理等。
我们可以使用requests库来获取代理IP地址列表:
import requests# 获取代理IP地址列表
def get_ip_list(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}web_data = requests.get(url, headers=headers)ip_list = web_data.text.split('\r\n')return ip_list
接下来,我们需要使用这些代理IP地址来构建一个IP池。IP池可以看作是一个存放可用代理IP地址的列表,当我们发送网络请求的时候,就可以从池中随机选取一个IP地址来使用。如果该IP地址无法使用(比如请求超时或者返回状态码不是200),就应该从IP池中将该IP地址删除,并选取下一个IP地址作为代理。
import random# 构造IP池
def get_random_ip(ip_list):proxy_list = []for ip in ip_list:proxy_list.append('http://' + ip)proxy_ip = random.choice(proxy_list)proxies = {'http': proxy_ip}return proxies
3. 使用代理IP发送网络请求
有了可用的代理IP池之后,我们就可以开始使用代理IP来发送网络请求了。这里我们还是使用requests库来发送请求,只是在发送请求之前,我们需要先从IP池中随机选取一个IP地址,并设置requests库的proxies参数。
# 使用代理IP发送网络请求
def use_proxy(url, ip_list):while True:proxies = get_random_ip(ip_list)print('Use proxy:', proxies)try:response = requests.get(url, proxies=proxies, timeout=3)if response.status_code == 200:return response.textexcept Exception:pass
在这个例子中,我们设置了请求超时时间为3秒钟,如果在请求超时时间内没有得到正确的返回结果,就会跳过当前代理IP地址,从IP池中选取下一个IP地址来尝试。
4. 添加IP代理模块
将上述代码整合起来,我们可以得到一个完整的IP代理模块。这个模块包括以下几个部分:
- 从代理IP网站获取代理IP地址列表
- 构造IP池
- 使用代理IP发送网络请求
import requests
import random# 获取代理IP地址列表
def get_ip_list(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}web_data = requests.get(url, headers=headers)ip_list = web_data.text.split('\r\n')return ip_list# 构造IP池
def get_random_ip(ip_list):proxy_list = []for ip in ip_list:proxy_list.append('http://' + ip)proxy_ip = random.choice(proxy_list)proxies = {'http': proxy_ip}return proxies# 使用代理IP发送网络请求
def use_proxy(url, ip_list):while True:proxies = get_random_ip(ip_list)print('Use proxy:', proxies)try:response = requests.get(url, proxies=proxies, timeout=3)if response.status_code == 200:return response.textexcept Exception:pass
使用这个模块非常简单,只需要传入代理IP的URL地址和目标网站的URL地址就可以了:
ip_url = 'http://www.zdaye.com/nn/'
target_url = 'http://httpbin.org/ip'
ip_list = get_ip_list(ip_url)
content = use_proxy(target_url, ip_list)
print(content)
总结
通过上述步骤,我们就成功地制作了一个属于自己的IP代理模块。使用这个模块,我们可以轻松地获取可用的代理IP地址,并在发送网络请求的时候使用代理IP地址,从而避免因为频繁请求而被反爬虫机制锁定IP地址的情况发生。当然,这个模块只是一个简单的示例,如果要在实际应用中使用的话,还需要根据不同的爬虫需求进行相应的改进和优化。
相关文章:
Python爬虫:制作一个属于自己的IP代理模块
前言 在Python爬虫过程中,为了避免被网站的反爬虫机制干扰,我们需要使用IP代理。所谓IP代理,就是通过修改网络请求中的IP地址,来达到隐藏真实IP地址的效果。本文将教你如何制作一个自己的IP代理模块,让你的爬虫更加稳…...
解决QT中文乱码
选中文本带有中文字符的文件,然后按如下点击 弹出对话框,选择当前操作系统的编码格式,选择Save with Encoding 中文字符前用u8进行标识...
GPIO基本原理
名词解释 高低电平:GPIO引脚电平范围:0V~3.3V(部分引脚可容忍5V)数据0就是0V,代表低电平;数据1就是3.3V,代表高电平; STM32是32位的单片机,所以内部寄存器也都是32位的…...
算法通过村第十五关-超大规模|青铜笔记|海量找数
文章目录 前言用4KB内存寻找重复数总结 前言 提示:并不是所有黑暗的地方,都需要光明。 --珍妮特温特森《句子不是唯一的水果》 在大部分算法中,默认给点给的数据量都是很小的,例如只有几个或者十几个元素,但是如果遇到…...
TCP、IP和HTTP的区别和联系
TCP(Transmission Control Protocol) TCP是一种面向连接的协议,负责数据的可靠性传输。它提供了错误检测和纠正、数据分段和重新组装、流量控制和拥塞控制等功能,最终确保数据可靠滴从一个端点传输到另一个端点。 TCP建立连接、传…...
【4】c++11新特性(稳定性和兼容性)—>final关键字
c中增加了final关键字来限制某个类不能被继承,或者某个虚函数不能被重写。如果使用final修饰函数,只能修饰虚函数,并且放在类或者函数的后面。 修饰函数 #include <iostream> using namespace std;class Base { public:virtual void t…...
23基于MATLAB的小波降噪,默认阈值消噪,强制消噪,给定软阈值消噪方法,数据直接替换后就可以跑。
基于MATLAB的小波降噪,默认阈值消噪,强制消噪,给定软阈值消噪方法,数据直接替换后就可以跑。 https://www.xiaohongshu.com/explore/652d57c600000...
蓝桥杯 常用STL (C++) 未完待续
动态数组 有些时候想开一个数组,但是却不知道应该开多大长度的数组合适,因为我们需要用到的数组可能会根据情况变动。 这时候我们就需要用到动态数组。所谓动态数组,也就是不定长数组,数组的长度是可以根据我们的需要动态改变的。…...
class id
在HTML和CSS中,"class" 和 "id" 是用于标识和定制元素的两种重要属性。 Class(类): "class" 属性用于标识一个或多个HTML元素,允许你为它们应用相同的样式规则。可以将相同的类应用于多个不同元素。…...
Qt (QInputDialog 、QMessageBox、QMessageBox)对话框实战
目录 一、QInputDialog 类(输入对话框) 二、QMessageBox 类(消息框) 三、QMessageBox 类(自定义消息框) 一、QInputDialog 类(输入对话框) QInputDialog 是一个提供输入对话框的 Qt 类。它允许用户输入文本,并提供给用户选择可用选项的选项列表。QInputDialog 可…...
Java 解析 cURL(bash) 命令
解析 cURL(bash) 命令 1. 主要用于解析从浏览器复制来的 cURL(bash)2. 废话不多说,都在🍻代码里了。参考资料 1. 主要用于解析从浏览器复制来的 cURL(bash) curl https://eva2.csdn.net/v3/06981375190026432f77c01bfca33e32/lts/…...
JDK21的虚拟线程是什么?和平台线程什么关系?
虚拟线程(Virtual Thread)是 JDK 而不是 OS 实现的轻量级线程(Lightweight Process,LWP),由 JVM 调度。许多虚拟线程共享同一个操作系统线程,虚拟线程的数量可以远大于操作系统线程的数量。 在引入虚拟线程…...
Unity DOTS Component概述
最近DOTS终于发布了正式的版本, 我们来分享以下DOTS里面地几个关键概念,方便大家上手学习掌握Unity DOTS开发。 Unity DOTS 中Entity作为实体不直接去存放数据,而是将数据以一个个的组件为载体来存放起来。每个Entity会得到一些不同的ComponentData的组…...
element ui 下拉框 选择月份和天数
一、背景 目前做的管理系统项目,期望实现功能为:设置出账周期和出账日,考虑使用element ui下拉框实现功能 二、所用技术 vue2element ui 三、实现效果 四、具体代码 <template><popup-frame :title"批量设置出账日" …...
用Java包com.sun.net.httpserver下面的类实现一个简单的http服务器demo
java的com.sun.net.httpserver包下的类提供了一个高层级的http服务器API,可以用来构建内嵌的http服务器。支持http和https。这些API提供了一个RFC 2616 (HTTP 1.1)和RFC 2818 (HTTP over TLS)的部分实现。 https://docs.oracle.com/en/java/javase/19/docs/api/jdk.…...
unity 浏览器插件【embedded browser(原zfbrowser)】简单教程,使unity支持web h5页面,附软件下载链接
一 简介 这是个在项目中使用了很久的浏览器插件。 很负责任的说这是在pc平台上最好用的浏览器插件 商业付费价格78刀,相比3d webview等插件动不动就178、368的价格就显得很良心 最新版下载链接(请勿商用) 1.1 功能概述 基本和普通浏览器无…...
LeetCode算法位运算—只出现一次的数字
目录 136. 只出现一次的数字 - 力扣(LeetCode) 解题思路: 代码: 运行结果: 补充 异或的重要性质 136. 只出现一次的数字 - 力扣(LeetCode) 给你一个 非空 整数数组 nums ,除了某…...
vcpkg manifest 的使用
最近项目上要使用 CMakeLists 管理,由于 Windows 版本有依赖到 vcpkg 提供的库,所以需要使用 vcpkg manifest 来统一设置库的版本,方便后续维护 推荐一个文章,介绍的可以说是非常全面了 VCPKG 特性 - Versioning 不过里面也有一些…...
选择什么电容笔比较好?平板手写笔推荐
由于苹果Pencil的热销,让华国内市场上,也出现了不少的平替式电容笔,这些产品,有好有坏,价格也很公道。不过,也有很多产品的价格都很平价。我是一个拥有多年经验的数码发烧友,在前几年就开始用上…...
pdf转二维码怎么做?pdf二维码制作简单技巧
pdf是一种很常见的文件储存格式,一般通知、发票、简历都会保存为这种格式来使用,那么需要将pdf格式文件做成二维码,该用什么方式来制作呢?下面给大家分享一个pdf转二维码的在线工具,可以通过上传文件一键生成二维码&am…...
Comsol模拟土壤中冰的融化过程:奇妙的微观世界之旅
comsol模拟土壤中冰的融化过程模型 在天气升温过程中,土壤表层的冰融化,深入土壤中,同时随着水流的渗入,土壤中的冰夹杂物融化,采用达西定律与包含相变的“多孔介质传热”接口相耦合,可以模拟土壤中冰夹杂物…...
3分钟彻底掌握:Windows Defender永久禁用工具defender-control完全指南 [特殊字符]️➡️[特殊字符]
3分钟彻底掌握:Windows Defender永久禁用工具defender-control完全指南 🛡️➡️🚫 【免费下载链接】defender-control An open-source windows defender manager. Now you can disable windows defender permanently. 项目地址: https://…...
推进军民融合标准化建设,超导磁探测军民应用前景广阔
作为首都科技创新与产业融合核心,北京市正以标准化为抓手,推进军民融合深度发展,重点落实军民融合标准化试点任务,探索建设军民通用标准信息化平台,打通“军标—民标”转化堵点。依托首都科研、企业集聚优势࿰…...
记录一次bug:不可见字符/零宽字符
1. 现象在处理 CSV 文件导入时,你可能遇到过这种“灵异事件”:CSV 文件第一列叫 tag_id。程序用 encoding/csv 读进 Map 后,尝试用 mp["tag_id"] 取值。结果: 永远返回空值,但打印整个 Map 时,肉…...
PyTorch 3.0静态图分布式训练全链路解析(含NCCL拓扑感知、Graph Partitioning与梯度同步优化)
第一章:PyTorch 3.0静态图分布式训练概览与演进脉络PyTorch 3.0标志着框架在可扩展性与编译优化方向的重大跃迁——其核心变化之一是将TorchDynamo Inductor后端深度整合为默认的静态图编译通道,并原生支持跨设备、跨节点的分布式静态图训练。这一演进并…...
GetQzonehistory:3步轻松永久备份QQ空间所有历史说说
GetQzonehistory:3步轻松永久备份QQ空间所有历史说说 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 还在担心QQ空间里那些承载青春记忆的说说会突然消失吗?GetQ…...
书匠策AI:学术江湖里的“论文剑客”,助你披荆斩棘!
书匠策AI官网:www.shujiangce.com | 微信公众号搜一搜:书匠策AI 在学术的江湖里,写期刊论文就像是一场“闯关游戏”——选题、查文献、搭框架、写内容、调格式……每一关都充满挑战,稍有不慎就可能“Game Over”。但别怕…...
openclaw 配置教程:本地安装、网关接入与模型 API 配置完整说明
如果你在折腾 openclaw 配置,通常会发现真正影响使用体验的,不是把程序装上去,而是后面的模型来源怎么接、网关怎么起、控制面板怎么进,以及默认模型如何切换。只要这些环节没有理顺,就算安装完成,后续也很…...
Qwen3-14B二次开发入门:基于内置Transformers接口扩展自定义功能
Qwen3-14B二次开发入门:基于内置Transformers接口扩展自定义功能 1. 为什么需要二次开发Qwen3-14B Qwen3-14B作为通义千问系列的最新大语言模型,在通用任务上表现出色。但在实际业务场景中,我们往往需要针对特定需求进行功能扩展。比如&…...
Phi-4-mini-reasoning GPU算力极致利用:单卡并发16路推理压测报告
Phi-4-mini-reasoning GPU算力极致利用:单卡并发16路推理压测报告 1. 模型简介 Phi-4-mini-reasoning是一个轻量级开源模型,专注于高质量推理任务。作为Phi-4模型家族成员,它具备以下核心特点: 推理能力优化:基于合…...
