【Python爬虫笔记】爬虫代理IP与访问控制

一、前言

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

本文主要介绍如何在爬虫程序中使用代理IP以应对反爬虫机制,以及如何进行访问控制,保障程序的正常运行。

二、什么是代理IP

代理IP即为代理服务器的IP地址,在爬虫程序中,我们可以使用代理IP来隐藏真实的IP地址,从而达到访问网站的目的。使用代理IP可以解决以下问题:

  1. 突破访问限制:有些网站会限制某些地区的访问,使用代理IP可以突破这些限制。
  2. 绕过反爬虫机制:有些网站会根据同一IP访问频率的高低来判断是否为爬虫行为,使用代理IP可以隐藏真实IP地址,从而防止被封禁或检测。
  3. 提高访问速度:使用代理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进行访问时,我们需要进行访问控制,以确保程序的正常运行。具体来说,我们可以通过以下方式进行访问控制:

  1. 控制请求频率:通过设置时间间隔、请求次数等方式,控制爬虫的访问速度,避免给网站带来过大的压力。
  2. 轮流使用代理IP:通过存储多个可用的代理IP,并轮流使用它们,以分散访问压力。
  3. 随机使用代理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使用和访问控制需要理解网络爬虫的原理和反爬虫机制,同时应当遵守网站的访问规则,以确保不会对网站造成过大的负担。

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

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

相关文章

成集云 | 金蝶云星空即时库存明细同步到多维表格 | 解决方案

源系统成集云目标系统 方案介绍 金蝶云星空是金蝶软件推出的新一代成长型企业SaaS管理软件,基于可组装低代码PaaS平台,构建了财务、供应链、采购管理、销售管理、生产管理、成本、税务、零售、电商、人力资源、协同办公等三十多个领域的一体化企业管理…

模型的保存加载、模型微调、GPU使用及Pytorch常见报错

序列化与反序列化 序列化就是说内存中的某一个对象保存到硬盘当中,以二进制序列的形式存储下来,这就是一个序列化的过程。 而反序列化,就是将硬盘中存储的二进制的数,反序列化到内存当中,得到一个相应的对象&#xff…

uniapp 处理 分页请求

我的需求是手机上一个动态滚动列表,下拉到底部时,触发分页数据请求 uniapp上处理分页解决方案 主要看你是如何写出滚动条的。我想到的目前有三种 (1)页面滚动:直接使用onReachBottom方法,可以监听到达底部…

文件读取漏洞复现(Metinfo 6.0.0)

文章目录 安装环境启动环境漏洞复现代码审计 安装环境 安装phpstudy,下载MetInfo 6.0.0版本软件,复制到phpstudy目录下的www目录中。 打开phpstudy,访问浏览器127.0.0.1/MetInfo6.0.0/install/index.php,打开Meinfo 6.0.0主页&a…

Vue+Element-ui实现表格本地导入

表格文件存储在前端 如图,表格文件template.xlsx存储在public下的static文件夹下 注意这里的路径容易报错 a链接下载文件失败的问题(未发现文件) a.href ‘./static/template.xlsx’ 写的时候不能带public,直接这么写就可以 DownloadTemp…

leetcode每日一练-第53题-最大子数组和

一、思路 动态规划 二、解题方法 使用了两个变量 maxSum 和 currentSum 来分别记录全局的最大和和当前连续子数组的和。遍历数组时,我们不断更新 currentSum,并比较是否需要更新 maxSum。最后,maxSum 就是最大的连续子数组和。 三、code …

质量属性案例-架构真题(二十一)

试题一 某电子商务公司升级会员与促销管理系统,向用户提交个性化服务,提高用户粘性。在项目建立之初,公司领导人一致认为目标是提升会员管理方式的灵活性,由于当前用户规模不大,用户简单,系统方面不需要做…

【算法与数据结构】700、LeetCode二叉搜索树中的搜索

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;二叉搜索树的性质&#xff1a;左节点键值 < 中间节点键值 < 右节点键值。那么我们根据此性质&am…

seata1.4.2版本配置总结

文章目录 环境准备&#xff1a;seata-server配置registry.conf创建数据库表 nacos配置client配置seata_orderseata_storageseata_account 注意点 创建项目seata-order-service2001pom.xml文件application.yml 实体类CommonResultOrder DaoOrderDaoOrderMapper.xml config配置类…

文件上传漏洞全面渗透姿势

0x00 文件上传场景 (本文档只做技术交流) 文件上传的场景真的随处可见&#xff0c;不加防范小心&#xff0c;容易造成漏洞&#xff0c;造成信息泄露&#xff0c;甚至更为严重的灾难。 比如某博客网站评论编辑模块&#xff0c;右上角就有支持上传图片的功能&#xff0c;提交带…

指令系统(408)

一、拓展操作码指令格式 【2017 统考】某计算机按字节编址&#xff0c;指令字长固定且只有两种指令格式&#xff0c;其中三地址指令29条、二地址指令107条&#xff0c;每个地址字段6位&#xff0c;则指令字长至少应该是&#xff08; A&#xff09; A、24位 B、26位 …

Springboot + Sqlite实战(离线部署成功)

最近有个需求&#xff0c;是手机软件离线使用&#xff0c; 用的springboot mybatis-plus mysql&#xff0c;无法实现&#xff0c;于是考虑使用内嵌式轻量级的数据库SQLlite 引入依赖 <dependency><groupId>org.xerial</groupId><artifactId>sqlite-…

清理docker镜像方法

首先stop ps -a里的容器&#xff0c;然后rm容器&#xff0c;最后再rmi镜像 先停止容器 rm容器 docker rmi 镜像 删除后可以发现已经不存在

论文复现--VideoTo3dPoseAndBvh(视频转BVH和3D关键点开源项目)

分类&#xff1a;动作捕捉 github地址&#xff1a;https://github.com/HW140701/VideoTo3dPoseAndBvh 所需环境&#xff1a; Windows10&#xff0c;CUDA11.6&#xff0c;conda 4.13.0&#xff1b; 目录 环境搭建conda list配置内容演示生成文件说明 环境搭建 # 创建环境 conda…

uniapp 配置并使用 VueX

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 uni-app 内置了 VueX 1、创建需要的文件 右键点击 根目录【我的是 uni-shop】&#xff0c;然后新建 目录&a…

网络安全-IP地址信息收集

本文为作者学习文章&#xff0c;按作者习惯写成&#xff0c;如有错误或需要追加内容请留言&#xff08;不喜勿喷&#xff09; 本文为追加文章&#xff0c;后期慢慢追加 IP反查域名 http://stool.chinaz.com/same https://tools.ipip.net/ipdomain.php 如果渗透目标为虚拟主机…

【力扣每日一题】2023.9.4 序列化和反序列化二叉搜索树

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一棵搜索二叉树&#xff0c;要我们将这棵二叉树转变为字符串&#xff0c;同时我们需要根据字符串再变回二叉树&#xff0c;具体…

基于单片机的万年历温度无线传输控制系统系统

一、系统方案 本设计采用DS1302采集年月日时分秒&#xff0c;DS18B20采集温度值&#xff0c;按键设置温度报警上下限&#xff0c;实际测量温度低于下限或高于上限&#xff0c;蜂鸣器报警&#xff0c;同时将测量温度上传到蓝牙助手。 二、硬件设计 原理图如下&#xff1a; 三…

基于Matlab实现频谱分析(附上源码+数据集)

Matlab是一个功能强大的数值计算和科学计算软件&#xff0c;可以用于频谱分析。频谱分析是一种信号处理技术&#xff0c;用于将时域信号转换为频域信号&#xff0c;以便更好地理解信号的频率特性。本文将介绍使用Matlab实现频谱分析的方法。 文章目录 部分源码完整源码数据集下…

Mysql高阶语句(二)

一、设置别名&#xff08;alias ——>as&#xff09; 在 MySQL 查询时&#xff0c;当表的名字比较长或者表内某些字段比较长时&#xff0c;为了方便书写或者 多次使用相同的表&#xff0c;可以给字段列或表设置别名。使用的时候直接使用别名&#xff0c;简洁明了&#xff0…