当前位置: 首页 > news >正文

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关键字来限制某个类不能被继承&#xff0c;或者某个虚函数不能被重写。如果使用final修饰函数&#xff0c;只能修饰虚函数&#xff0c;并且放在类或者函数的后面。 修饰函数 #include <iostream> using namespace std;class Base { public:virtual void t…...

23基于MATLAB的小波降噪,默认阈值消噪,强制消噪,给定软阈值消噪方法,数据直接替换后就可以跑。

基于MATLAB的小波降噪&#xff0c;默认阈值消噪&#xff0c;强制消噪&#xff0c;给定软阈值消噪方法&#xff0c;数据直接替换后就可以跑。 https://www.xiaohongshu.com/explore/652d57c600000...

蓝桥杯 常用STL (C++) 未完待续

动态数组 有些时候想开一个数组&#xff0c;但是却不知道应该开多大长度的数组合适&#xff0c;因为我们需要用到的数组可能会根据情况变动。 这时候我们就需要用到动态数组。所谓动态数组&#xff0c;也就是不定长数组&#xff0c;数组的长度是可以根据我们的需要动态改变的。…...

class id

在HTML和CSS中&#xff0c;"class" 和 "id" 是用于标识和定制元素的两种重要属性。 Class&#xff08;类&#xff09;: "class" 属性用于标识一个或多个HTML元素&#xff0c;允许你为它们应用相同的样式规则。可以将相同的类应用于多个不同元素。…...

Qt (QInputDialog 、QMessageBox、QMessageBox)对话框实战

目录 一、QInputDialog 类(输入对话框) 二、QMessageBox 类(消息框) 三、QMessageBox 类(自定义消息框) 一、QInputDialog 类(输入对话框) QInputDialog 是一个提供输入对话框的 Qt 类。它允许用户输入文本&#xff0c;并提供给用户选择可用选项的选项列表。QInputDialog 可…...

Java 解析 cURL(bash) 命令

解析 cURL&#xff08;bash&#xff09; 命令 1. 主要用于解析从浏览器复制来的 cURL(bash)2. 废话不多说&#xff0c;都在&#x1f37b;代码里了。参考资料 1. 主要用于解析从浏览器复制来的 cURL(bash) curl https://eva2.csdn.net/v3/06981375190026432f77c01bfca33e32/lts/…...

JDK21的虚拟线程是什么?和平台线程什么关系?

虚拟线程&#xff08;Virtual Thread&#xff09;是 JDK 而不是 OS 实现的轻量级线程(Lightweight Process&#xff0c;LWP&#xff09;&#xff0c;由 JVM 调度。许多虚拟线程共享同一个操作系统线程&#xff0c;虚拟线程的数量可以远大于操作系统线程的数量。 在引入虚拟线程…...

Unity DOTS Component概述

最近DOTS终于发布了正式的版本, 我们来分享以下DOTS里面地几个关键概念&#xff0c;方便大家上手学习掌握Unity DOTS开发。 Unity DOTS 中Entity作为实体不直接去存放数据&#xff0c;而是将数据以一个个的组件为载体来存放起来。每个Entity会得到一些不同的ComponentData的组…...

element ui 下拉框 选择月份和天数

一、背景 目前做的管理系统项目&#xff0c;期望实现功能为&#xff1a;设置出账周期和出账日&#xff0c;考虑使用element ui下拉框实现功能 二、所用技术 vue2element ui 三、实现效果 四、具体代码 <template><popup-frame :title"批量设置出账日" …...

用Java包com.sun.net.httpserver下面的类实现一个简单的http服务器demo

java的com.sun.net.httpserver包下的类提供了一个高层级的http服务器API&#xff0c;可以用来构建内嵌的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刀&#xff0c;相比3d webview等插件动不动就178、368的价格就显得很良心 最新版下载链接&#xff08;请勿商用&#xff09; 1.1 功能概述 基本和普通浏览器无…...

LeetCode算法位运算—只出现一次的数字

目录 136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 代码&#xff1a; 运行结果&#xff1a; 补充 异或的重要性质 136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 给你一个 非空 整数数组 nums &#xff0c;除了某…...

vcpkg manifest 的使用

最近项目上要使用 CMakeLists 管理&#xff0c;由于 Windows 版本有依赖到 vcpkg 提供的库&#xff0c;所以需要使用 vcpkg manifest 来统一设置库的版本&#xff0c;方便后续维护 推荐一个文章&#xff0c;介绍的可以说是非常全面了 VCPKG 特性 - Versioning 不过里面也有一些…...

选择什么电容笔比较好?平板手写笔推荐

由于苹果Pencil的热销&#xff0c;让华国内市场上&#xff0c;也出现了不少的平替式电容笔&#xff0c;这些产品&#xff0c;有好有坏&#xff0c;价格也很公道。不过&#xff0c;也有很多产品的价格都很平价。我是一个拥有多年经验的数码发烧友&#xff0c;在前几年就开始用上…...

pdf转二维码怎么做?pdf二维码制作简单技巧

pdf是一种很常见的文件储存格式&#xff0c;一般通知、发票、简历都会保存为这种格式来使用&#xff0c;那么需要将pdf格式文件做成二维码&#xff0c;该用什么方式来制作呢&#xff1f;下面给大家分享一个pdf转二维码的在线工具&#xff0c;可以通过上传文件一键生成二维码&am…...

Comsol模拟土壤中冰的融化过程:奇妙的微观世界之旅

comsol模拟土壤中冰的融化过程模型 在天气升温过程中&#xff0c;土壤表层的冰融化&#xff0c;深入土壤中&#xff0c;同时随着水流的渗入&#xff0c;土壤中的冰夹杂物融化&#xff0c;采用达西定律与包含相变的“多孔介质传热”接口相耦合&#xff0c;可以模拟土壤中冰夹杂物…...

3分钟彻底掌握:Windows Defender永久禁用工具defender-control完全指南 [特殊字符]️➡️[特殊字符]

3分钟彻底掌握&#xff1a;Windows Defender永久禁用工具defender-control完全指南 &#x1f6e1;️➡️&#x1f6ab; 【免费下载链接】defender-control An open-source windows defender manager. Now you can disable windows defender permanently. 项目地址: https://…...

推进军民融合标准化建设,超导磁探测军民应用前景广阔

作为首都科技创新与产业融合核心&#xff0c;北京市正以标准化为抓手&#xff0c;推进军民融合深度发展&#xff0c;重点落实军民融合标准化试点任务&#xff0c;探索建设军民通用标准信息化平台&#xff0c;打通“军标—民标”转化堵点。依托首都科研、企业集聚优势&#xff0…...

记录一次bug:不可见字符/零宽字符

1. 现象在处理 CSV 文件导入时&#xff0c;你可能遇到过这种“灵异事件”&#xff1a;CSV 文件第一列叫 tag_id。程序用 encoding/csv 读进 Map 后&#xff0c;尝试用 mp["tag_id"] 取值。结果&#xff1a; 永远返回空值&#xff0c;但打印整个 Map 时&#xff0c;肉…...

PyTorch 3.0静态图分布式训练全链路解析(含NCCL拓扑感知、Graph Partitioning与梯度同步优化)

第一章&#xff1a;PyTorch 3.0静态图分布式训练概览与演进脉络PyTorch 3.0标志着框架在可扩展性与编译优化方向的重大跃迁——其核心变化之一是将TorchDynamo Inductor后端深度整合为默认的静态图编译通道&#xff0c;并原生支持跨设备、跨节点的分布式静态图训练。这一演进并…...

GetQzonehistory:3步轻松永久备份QQ空间所有历史说说

GetQzonehistory&#xff1a;3步轻松永久备份QQ空间所有历史说说 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 还在担心QQ空间里那些承载青春记忆的说说会突然消失吗&#xff1f;GetQ…...

书匠策AI:学术江湖里的“论文剑客”,助你披荆斩棘!

书匠策AI官网&#xff1a;www.shujiangce.com | 微信公众号搜一搜&#xff1a;书匠策AI 在学术的江湖里&#xff0c;写期刊论文就像是一场“闯关游戏”——选题、查文献、搭框架、写内容、调格式……每一关都充满挑战&#xff0c;稍有不慎就可能“Game Over”。但别怕&#xf…...

openclaw 配置教程:本地安装、网关接入与模型 API 配置完整说明

如果你在折腾 openclaw 配置&#xff0c;通常会发现真正影响使用体验的&#xff0c;不是把程序装上去&#xff0c;而是后面的模型来源怎么接、网关怎么起、控制面板怎么进&#xff0c;以及默认模型如何切换。只要这些环节没有理顺&#xff0c;就算安装完成&#xff0c;后续也很…...

Qwen3-14B二次开发入门:基于内置Transformers接口扩展自定义功能

Qwen3-14B二次开发入门&#xff1a;基于内置Transformers接口扩展自定义功能 1. 为什么需要二次开发Qwen3-14B Qwen3-14B作为通义千问系列的最新大语言模型&#xff0c;在通用任务上表现出色。但在实际业务场景中&#xff0c;我们往往需要针对特定需求进行功能扩展。比如&…...

Phi-4-mini-reasoning GPU算力极致利用:单卡并发16路推理压测报告

Phi-4-mini-reasoning GPU算力极致利用&#xff1a;单卡并发16路推理压测报告 1. 模型简介 Phi-4-mini-reasoning是一个轻量级开源模型&#xff0c;专注于高质量推理任务。作为Phi-4模型家族成员&#xff0c;它具备以下核心特点&#xff1a; 推理能力优化&#xff1a;基于合…...