【Python爬虫笔记】爬虫代理IP与访问控制
一、前言
在进行网络爬虫的开发过程中,有许多限制因素阻碍着爬虫程序的正常运行,其中最主要的一点就是反爬虫机制。为了防止爬虫程序在短时间内大量地请求同一个网站,网站管理者会使用一些方式进行限制。这时候,代理IP就是解决方案之一。

本文主要介绍如何在爬虫程序中使用代理IP以应对反爬虫机制,以及如何进行访问控制,保障程序的正常运行。
二、什么是代理IP
代理IP即为代理服务器的IP地址,在爬虫程序中,我们可以使用代理IP来隐藏真实的IP地址,从而达到访问网站的目的。使用代理IP可以解决以下问题:
- 突破访问限制:有些网站会限制某些地区的访问,使用代理IP可以突破这些限制。
- 绕过反爬虫机制:有些网站会根据同一IP访问频率的高低来判断是否为爬虫行为,使用代理IP可以隐藏真实IP地址,从而防止被封禁或检测。
- 提高访问速度:使用代理IP可以使得请求被代理服务器缓存,从而提高访问速度。
三、如何获取代理IP
有许多免费或收费的代理IP提供商,我们可以在这些网站上获取代理IP,这里推荐一个:
站大爷代理ip:https://www.zdaye.com
获取代理IP后,我们需要进行有效性检测、筛选和存储,以确保代理IP的可用性。
下面是一个Python代码示例,可以实现对代理IP的有效性检测并存储可用的代理IP:
import requests
import timedef check_proxy(proxy):"""检测代理IP的有效性:param proxy: 代理IP:return: True or False"""proxies = {'http': proxy,'https': proxy,}try:response = requests.get('https://www.baidu.com/', proxies=proxies, timeout=5)if response.status_code == 200:return Trueelse:return Falseexcept:return Falsedef save_proxy(ip, port, protocol='http'):"""存储可用代理IP:param ip: IP地址:param port: 端口号:param protocol: 协议类型:return: None"""with open('proxies.txt', 'a+', encoding='utf-8') as f:f.write('{}://{}:{}\n'.format(protocol, ip, port))def main():for page in range(1, 11): # 获取前10页的代理IPurl = 'https://www.zdaye.com/nn/{}'.format(page)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/89.0.4389.82 Safari/537.36'}response = requests.get(url, headers=headers)if response.status_code == 200:html = response.textproxy_list = html.split('\n')for proxy in proxy_list:if proxy:ip = proxy.split(':')[0]port = proxy.split(':')[1]if check_proxy(proxy):save_proxy(ip, port)if __name__ == '__main__':main()print('Done!')
上述代码使用了requests库来请求代理IP网站,获取到代理IP后进行有效性检测,并将可用的代理IP存储到本地文件中。
四、如何应用代理IP
在爬虫程序中使用代理IP,可以使用requests库提供的proxies参数,示例代码如下:
import requestsdef get_page(url, proxy):"""使用代理IP请求网页:param url: 网页url:param proxy: 代理IP:return: 网页内容"""proxies = {'http': proxy,'https': proxy,}headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/89.0.4389.82 Safari/537.36'}try:response = requests.get(url, headers=headers, proxies=proxies, timeout=10)if response.status_code == 200:return response.textelse:return Noneexcept:return Nonedef main():url = 'https://www.baidu.com/'proxy = 'http://121.69.46.218:9000'page = get_page(url, proxy)print(page)if __name__ == '__main__':main()
上述代码使用了requests库提供的proxies参数,将代理IP传入访问请求中,从而实现了使用代理IP请求网页的功能。
五、如何进行访问控制
在使用代理IP进行访问时,我们需要进行访问控制,以确保程序的正常运行。具体来说,我们可以通过以下方式进行访问控制:
- 控制请求频率:通过设置时间间隔、请求次数等方式,控制爬虫的访问速度,避免给网站带来过大的压力。
- 轮流使用代理IP:通过存储多个可用的代理IP,并轮流使用它们,以分散访问压力。
- 随机使用代理IP:从可用代理IP池中随机选择一个进行使用,增加反爬虫的难度。
下面是一个Python代码示例,可以实现访问控制并轮流使用代理IP:
import requests
import timedef get_proxy():"""从代理IP池中取出一个代理IP:return: 代理IP"""proxy_list = []with open('proxies.txt', 'r', encoding='utf-8') as f:for line in f:proxy = line.strip()proxy_list.append(proxy)return proxy_list[0]def check_proxy(proxy):"""检测代理IP的有效性:param proxy: 代理IP:return: True or False"""proxies = {'http': proxy,'https': proxy,}try:response = requests.get('https://www.baidu.com/', proxies=proxies, timeout=5)if response.status_code == 200:return Trueelse:return Falseexcept:return Falsedef save_proxy(ip, port, protocol='http'):"""存储可用代理IP:param ip: IP地址:param port: 端口号:param protocol: 协议类型:return: None"""with open('proxies.txt', 'a+', encoding='utf-8') as f:f.write('{}://{}:{}\n'.format(protocol, ip, port))def rotate_proxy():"""从代理IP池中轮流取出一个代理IP:return: 代理IP"""proxy_list = []with open('proxies.txt', 'r', encoding='utf-8') as f:for line in f:proxy = line.strip()proxy_list.append(proxy)while True:for proxy in proxy_list:yield proxydef main():proxy_generator = rotate_proxy()headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/89.0.4389.82 Safari/537.36'}for i in range(10): # 控制访问次数proxy = next(proxy_generator)while not check_proxy(proxy): # 检测代理IP是否可用proxy = next(proxy_generator)try:url = 'https://www.baidu.com/'response = requests.get(url, headers=headers, proxies={'http': proxy, 'https': proxy}, timeout=10)if response.status_code == 200:print(response.text)except:passtime.sleep(1) # 控制请求间隔if __name__ == '__main__':main()print('Done!')
上述代码使用了生成器和yield语句实现了轮流取出可用代理IP的功能,并增加了时间间隔控制,确保爬虫程序不会过于频繁地请求。同时,代码也实现了对代理IP的有效性检测,确保使用的代理IP都是可用的。
六、总结
本文主要介绍了如何在爬虫程序中使用代理IP进行反爬虫机制的应对,以及如何进行访问控制,保障程序的正常运行。实现代理IP使用和访问控制需要理解网络爬虫的原理和反爬虫机制,同时应当遵守网站的访问规则,以确保不会对网站造成过大的负担。
相关文章:
【Python爬虫笔记】爬虫代理IP与访问控制
一、前言 在进行网络爬虫的开发过程中,有许多限制因素阻碍着爬虫程序的正常运行,其中最主要的一点就是反爬虫机制。为了防止爬虫程序在短时间内大量地请求同一个网站,网站管理者会使用一些方式进行限制。这时候,代理IP就是解决方…...
50、Spring WebFlux 的 自动配置 的一些介绍,与 Spring MVC 的一些对比
Spring WebFlux Spring WebFlux 简称 WebFlux ,是 spring5.0 新引入的一个框架。 SpringBoot 同样为 WebFlux 提供了自动配置。 Spring WebFlux 和 Spring MVC 是属于竞争关系,都是框架。在一个项目中两个也可以同时存在。 SpringMVC 是基于 Servlet A…...
【算法专题突破】双指针 - 和为s的两个数字(6)
目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 1. 题目解析 题目链接:剑指 Offer 57. 和为s的两个数字 - 力扣(Leetcode) 这道题题目就一句话但是也是有信息可以提取的, 最重要的就是开始的那句话&#…...
Redis7入门概述
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Java从入门到精通 ✨特色专栏…...
SQL sever命名规范
目录 一、标识符 二、表名(Table): 三、字段名(fields): 四、约束(Constraint): 五、索引(Index): 六、存储过程(Stored Proced…...
BCSP-玄子Share-Java框基础_工厂模式/代理模式
三、设计模式 3.1 设计模式简介 软件设计中的三十六计是人们在长期的软件开发中的经验总结是对某些特定问题的经过实践检验的特定解决方法被广泛运用在 Java 框架技术中 3.1.1 设计模式的优点 设计模式是可复用的面向对象软件的基础可以更加简单方便地复用成功的设计和体系…...
【数据结构】2015统考真题 6
题目描述 【2015统考真题】求下面的带权图的最小(代价)生成树时,可能是Kruskal算法第2次选中但不是Prim算法(从v4开始)第2次选中的边是(C) A. (V1, V3) B. (V1, V4) C. (V2, V3) D. (V3, V4) …...
HTML <track> 标签
实例 播放带有字幕的视频: <video width="320" height="240" controls="controls"><source src="forrest_gump.mp4" type="video/mp4" /><source src="forrest_gump.ogg" type="video/ogg…...
php中识别url被篡改并阻止访问的实现方式是什么
在 PHP 中,可以通过多种方式来识别并阻止 URL 被篡改的访问。以下是一些常见的方法: 基本身份验证:使用 PHP 的 $_SERVER[PHP_AUTH_USER] 和 $_SERVER[PHP_AUTH_PW] 变量可以实施基本的 HTTP 身份验证。在访问受保护的页面之前,可…...
c++ 学习 之 const,constexpr,volatile
前言 const、constexpr 和 volatile 是 C 中用于修饰变量和类型的关键字 正文 它们分别用于不同的用途: const(常量): const 用于声明常量,表示变量的值不能被修改。 它可以应用于变量、指针、引用、成员函数以及类…...
【Flink】关于jvm元空间溢出,mysql binlog冲突的问题解决
问题一:7张表是同一个mysql中的,我们进行增量同步时分别用不同的flink任务读取,造成mysql server-id冲突问题,如下: Caused by: io.debezium.DebeziumException: A slave with the same server_uuid/server_id as this…...
C#常用多线程(线程同步,事件触发,信号量,互斥锁,共享内存,消息队列)
using System; using System.Threading; using System.Windows.Forms; using UtilForm.Util;namespace UtilForm {// 线程同步,事件触发,信号量,互斥锁,共享内存,消息队列public partial class frmUIThread : Form{ Sy…...
OpenWrt系统开发笔记
openWrt英文官网: https://openwrt.org/ 中文官网: http://www.openwrt.org.cn/ 一、开发环境及编译 在github上有两个源码使用的比较多 一个是lede,地址为:https://github.com/coolsnowwolf/lede 另一个为OpenWrt的官方源码&#…...
实战 - Restful APi 格式规范
文章目录 1. 特征2. 优点3. 动作1. GET 获取资源2. POST 创建资源3. PUT 整体替换4. PATCH 部分替换5. DELETE 删除资源 4. 示例 RESTful是一种API的设计风格,他和GraphQL ,JSON-RPC,WebService类似,用于定义在CS、BS架构下暴露服…...
《Linux从练气到飞升》No.21 Linux简单实现一个shell
🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…...
【iVX】iVX的低代码未来发展趋势:加速应用开发的创新之路
简介: 随着数字化转型的飞速发展,企业和组织对快速开发和交付高质量应用的需求越来越迫切。低代码开发平台作为一种创新的解决方案,极大地简化了应用程序的开发过程。在这一领域,iVX低代码平台作为领先的创业公司,正在…...
zookee 安装
1、下载安装包 weget https://downloads.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz 方案1:wget是一个下载指令,后面可以跟下载连接去从服务器上下载东西。 方案2:也可以先下载到windows上,再通…...
OpenWrt编译自己的应用程序
编译OpenWrt的应用程序可以参考OpenWrt内部其他应用程序的例程,来编写成自己的应用程序 一、OpenWrt源代码获取与编译 1.1、搭建环境 下载OpenWrt的官方源码: git clone https://github.com/openwrt/openwrt.git1.2、安装编译依赖项 sudo apt update…...
MySQL 50 题。
MySQL 50 题。 文章目录 MySQL 50 题。数据库。sql。 数据库。 CREATE SCHEMA new_schema DEFAULT CHARACTER SET utf8mb4 ;Operation failed: There was an error while applying the SQL script to the database. Executing: CREATE SCHEMA new_schema DEFAULT CHARACTER SE…...
强化学习算法总结 (1)
强化学习算法总结 (1) 1.综述 强化学习是通过与环境进行交互,来实现目标的一种计算方法。 s − a 1 − r − s ′ s - a_1 - r- s s−a1−r−s′ 1.1强化学习优化目标 p o l i c y a r g m a x p o l i c y E ( a , s ) [ r e w a r d ( s , a ) ] policy ar…...
Granite TimeSeries FlowState R1电商销量预测实战:Vue前端可视化大屏
Granite TimeSeries FlowState R1电商销量预测实战:Vue前端可视化大屏 最近和几个做电商的朋友聊天,他们都在头疼同一个问题:备货。备多了怕压库存,备少了又怕错过销售高峰,眼睁睁看着流量来了却没货可发。传统的经验…...
无数据库版Mirror照妖镜源码解析:如何安全改造为个人图片鉴黄工具
无数据库版Mirror照妖镜源码解析:如何安全改造为个人图片鉴黄工具 在当今内容爆炸的时代,图片审核成为许多个人开发者和内容创作者的刚需。传统解决方案往往依赖复杂的数据库系统和第三方API,而Mirror照妖镜的无数据库设计为轻量级图片审核提…...
SEO_从零开始,手把手教你制定SEO优化方案(126 )
<h2>SEO优化的基本概念</h2> <p>SEO,全称Search Engine Optimization,是搜索引擎优化的简称,旨在提高网站在搜索引擎中的自然排名,从而增加网站的可见度和流量。对于初学者来说,SEO可能听起来有点复…...
解析 C++ 中的‘生存期保护’:利用生命周期注解规避 99% 的悬挂指针风险
解析 C 中的“生存期保护”:利用生命周期注解规避 99% 的悬挂指针风险尊敬的各位开发者,各位对 C 内存安全孜孜不倦的探索者们,大家好!在 C 的广阔世界中,指针和引用以其强大的能力,赋予了我们对内存的直接…...
LangGraph实战:从零构建并部署一个多功能智能体
1. LangGraph框架概述:新一代智能体开发范式 在人工智能应用开发领域,智能体(Agent)技术正经历着从简单问答到复杂任务执行的进化。LangGraph作为LangChain生态中的新一代开发框架,彻底改变了传统链式结构的局限性。我…...
Windows下BERTopic安装避坑指南:解决hdbscan报错(附Python 3.8环境配置)
Windows下BERTopic安装避坑指南:解决hdbscan报错(附Python 3.8环境配置) 第一次在Windows上安装BERTopic时,那个红色的hdbscan报错信息让我盯着屏幕发了十分钟呆。作为一款强大的主题建模工具,BERTopic的安装本不该如此…...
天津专业的阀门厂排名
在天津,阀门行业发展态势良好,众多阀门厂各有特色与优势。中国通用机械工业协会最新发布的《2026年阀门行业高质量发展白皮书》显示,天津的阀门产业在技术创新、产品质量和市场份额等方面都有不错的表现。下面为大家介绍几家天津比较知名的阀…...
如何高效使用AsrTools:快速上手指南与实用功能详解
如何高效使用AsrTools:快速上手指南与实用功能详解 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate tex…...
别再只用Set5了!超分辨率模型训练,这5个开源数据集(DIV2K、Flickr2K等)的实战配置与对比
超分辨率模型训练:5个开源数据集的深度实战指南 在超分辨率研究领域,数据集的选择往往决定了模型性能的上限。许多开发者习惯性地使用Set5、Set14等小型数据集,却忽略了更丰富的数据资源可能带来的性能突破。本文将深入解析DIV2K、Flickr2K、…...
ArduPilot电机控制逻辑与PWM输出机制剖析
1. ArduPilot电机控制基础概念 当你第一次接触无人机飞控时,最让人困惑的莫过于电机控制逻辑了。想象一下,你手里拿着遥控器,轻轻推动摇杆,无人机就能平稳地上升、下降或者转向。这背后到底发生了什么?让我用最直白的…...
