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

如何通过筛选高质量爬虫IP提升爬虫效率?

前言

对于做数据抓取的技术员来说,如何稳定高效的爬取数据ip库池起到决定性作用,对于爬虫ip池的维护,可以从以下几个方面入手:

目录

  • 一、验证爬虫ip的可用性
    • 二、更新爬虫ip池
      • 三、维护爬虫ip的质量
        • 四、监控爬虫ip的使用情况

一、验证爬虫ip的可用性

可以通过requests库向目标网站发送请求,判断爬虫ip是否能够成功返回响应。如果返回成功,则说明爬虫ip可用,否则说明爬虫ip已失效。可以在代码中设置超时时间,避免长时间等待无响应的爬虫ip。

import requests
def check_proxy(proxy):try:response = requests.get(url, proxies=proxy, timeout=3)if response.status_code == 200:return Trueexcept:passreturn False

二、更新爬虫ip池

可以通过定期爬取爬虫ip网站或者购买付费爬虫ip服务来获取新的爬虫ip。可以使用requests库向爬虫ip网站发送请求,获取HTML页面,并使用BeautifulSoup库解析HTML页面,从而获取爬虫ip信息。通过一定的筛选规则,可以将新获取的爬虫ip加入到自有库池中。

import requests
from bs4 import BeautifulSoup
def get_proxies():url = 'http://jshk.com.cn/'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'}response = requests.get(url, headers=headers)soup = BeautifulSoup(response.text, 'html.parser')table = soup.find('table', {'id': 'ip_list'})tr_list = table.find_all('tr')proxies = []for tr in tr_list[1:]:td_list = tr.find_all('td')ip = td_list[1].textport = td_list[2].textprotocol = td_list[5].text.lower()proxy = '{}://{}:{}'.format(protocol, ip, port)proxies.append(proxy)return proxies

三、维护爬虫ip的质量

可以通过一些指标来衡量爬虫ip的质量,比如连接速度、响应时间、访问成功率等。可以定时对爬虫ip进行评估,筛选出质量较好的IP,并从爬虫ip池中删除质量较差的IP。

import requests
from multiprocessing import Pool
from functools import partial
def check_proxy_quality(proxy):try:response = requests.get(url, proxies=proxy, timeout=3)if response.status_code == 200:return True, response.elapsed.total_seconds()except:passreturn False, Nonedef evaluate_proxies(proxies):pool = Pool(processes=8)results = pool.map(partial(check_proxy_quality), proxies)pool.close()pool.join()quality_proxies = []for proxy, result in zip(proxies, results):is_valid, response_time = resultif is_valid:quality_proxies.append((proxy, response_time))return quality_proxies

四、监控爬虫ip的使用情况

对于监控爬虫ip的使用情况,一种比较简单的方法是记录每个爬虫ip的使用次数和成功率,以便及时发现哪些爬虫ip不再可用或者质量较差。

可以使用Python内置的shelve模块,将爬虫ip的使用情况保存在一个本地文件中。shelve模块可以提供类似字典的数据存储方式,方便快捷地读取和写入数据。

import shelve
class ProxyManager:def __init__(self, filename='proxies.db'):self.filename = filenameself.proxies = shelve.open(filename, writeback=True)if not self.proxies.get('used_proxies'):self.proxies['used_proxies'] = {}def mark_as_used(self, proxy):if proxy in self.proxies:self.proxies[proxy]['used_times'] += 1self.proxies[proxy]['success_rate'] = self.proxies[proxy]['success_times'] / self.proxies[proxy]['used_times']else:self.proxies[proxy] = {'used_times': 1, 'success_times': 0, 'success_rate': 0}self.proxies['used_proxies'][proxy] = Truedef mark_as_success(self, proxy):if proxy in self.proxies:self.proxies[proxy]['success_times'] += 1self.proxies[proxy]['success_rate'] = self.proxies[proxy]['success_times'] / self.proxies[proxy]['used_times']else:self.proxies[proxy] = {'used_times': 1, 'success_times': 1, 'success_rate': 1}self.proxies['used_proxies'][proxy] = Truedef is_used(self, proxy):return self.proxies['used_proxies'].get(proxy)def close(self):self.proxies.close()

在使用爬虫ip进行网络请求时,可以先检查该爬虫ip是否已被使用过。如果该爬虫ip已被使用过,则不再使用该爬虫ip。如果该爬虫ip未被使用过,则使用该爬虫ip进行网络请求,并在请求成功或失败后,更新该爬虫ip的使用情况。

def get_page(url, proxy_manager):for i in range(3):proxy = get_proxy(proxy_manager)if proxy:try:response = requests.get(url, proxies={'http': proxy, 'https': proxy}, timeout=3)if response.status_code == 200:proxy_manager.mark_as_success(proxy)return response.textexcept:passproxy_manager.mark_as_used(proxy)return None
def get_proxy(proxy_manager):proxies = list(proxy_manager.proxies.keys())for proxy in proxies:if not proxy_manager.is_used(proxy):return proxyreturn None

需要注意的是,shelve模块的写入操作可能比较耗时,如果爬虫ip池较大,可以考虑每隔一段时间将爬虫ip使用情况保存在本地文件中,以提高性能。同时,如果爬虫ip池中存在较多已失效的爬虫ip,证明这个池子的IP可用率已经极低了,还是会更建议大家伙使用优质厂商提供的爬虫ip。

正常情况下,很多人会说随着经济下行,能有使用的就已经不错了,还谈什么自行车,且不谈免费的爬虫ip的连通性,实际上只要选对爬虫ip,采购的成本也会在我们的承受范围内的。

相关文章:

如何通过筛选高质量爬虫IP提升爬虫效率?

前言 对于做数据抓取的技术员来说,如何稳定高效的爬取数据ip库池起到决定性作用,对于爬虫ip池的维护,可以从以下几个方面入手: 目录 一、验证爬虫ip的可用性二、更新爬虫ip池三、维护爬虫ip的质量四、监控爬虫ip的使用情况 一、验…...

C#中定义数组--字符串及数组操作

C#中定义数组–字符串及数组操作 以前用VB的时候经常使用数组&#xff0c;不过C#用习惯后数组基本上用的不多了。 像用List<>&#xff0c;ArrayList&#xff0c;Dirctionary<,>都比较好用。 一、一维&#xff1a; int[] numbers new int[]{1,2,3,4,5,6}; //不…...

嵌入式就业怎么样?

嵌入式就业怎么样? 现在的IT行业,嵌入式是大热门&#xff0c;下面也要来给大家介绍下学习嵌入式之后的发展以及就业怎么样。 首先是好找工作。嵌入式人才目前是处于供不应求的状态中&#xff0c;据权威统计机构统计在所有软件开发类人才的需求中&#xff0c;对嵌入式工程师的…...

用户订阅付费如何拆解分析?看这篇就够了

会员制的订阅付费在影音娱乐行业中已相当普及&#xff0c;近几年&#xff0c;不少游戏厂商也开始尝试订阅收费模式。在分析具体的用户订阅偏好以及订阅付费模式带来的增长效果时&#xff0c;我们常常会有这些疑问&#xff1a; 如何从用户的整体付费行为中具体拆解订阅付费事件…...

智能合约中如何调用其他智能合约

智能合约是区块链技术中的一项关键功能&#xff0c;它可以让开发者编写代码来自动执行一系列的操作&#xff0c;从而实现各种复杂的业务逻辑。在许多应用场景中&#xff0c;一个智能合约可能需要调用另一个智能合约来完成某些任务。本文将介绍智能合约如何调用其他智能合约&…...

python的多任务处理

在现代计算机系统中&#xff0c;多任务处理是一项重要的技术&#xff0c;可以大幅提高程序的运行效率。Python语言提供了多种多任务处理的方式&#xff0c;本文将介绍其中几种常见的方式&#xff0c;包括多进程、多线程和协程。 多进程 进程是计算机中运行程序的实例&#xf…...

Vue收集表单数据学习笔记

收集表单数据 v-model双向数据绑定&#xff0c;收集的是input框的value&#xff0c;单选按钮不存在value&#xff0c;就像代码中的男女选项&#xff0c;即使绑定性别v-model“sex”&#xff0c;控制台依然不能接收性别的值&#xff0c;因为没有value值&#xff0c;&#xff0c…...

Linux搭建GitLab私有仓库,并内网穿透实现公网访问

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 转载自远控源码文章&#xff1a;Linux搭建GitLab私有仓库&#xff0c;并内网穿透实现公网访问 …...

SpringBoot项目防重复提交注解开发

背景 在实际开发过程中&#xff0c;防重复提交的操作很常见。有细分配置针对某一些路径进行拦截&#xff0c;也有基于注解去实现的指定方法拦截的。 分析 实现原理 实现防重复提交&#xff0c;我们很容易想到就是用过滤器或者拦截器来实现。 使用拦截器就是继承HandlerInt…...

从软件哲学角度谈 Amazon SageMaker

如果你喜欢哲学并且你是一个 IT 从业者&#xff0c;那么你很可能对软件哲学感兴趣&#xff0c;你能发现存在于软件领域的哲学之美。本文我们就从软件哲学的角度来了解一下亚马逊云科技的拳头级产品 Amazon SageMaker&#xff0c;有两个出发点&#xff1a;一是 SageMaker 本身设…...

C++内联函数

目录 一、常规函数和内联函数的对比 二、如何使用 三、内联函数的特性 四、内联函数与宏 五、如何查看内联函数 六、【面试题】 前言-----内联函数是C中为程序运行速度所做的一项该进。常规函数和内联函数之间的主要区别不在于编写方式&#xff0c;而在于C编译器如何将他…...

JAVA大师的秘籍:轻松掌握高质量代码之道

如果你想写出高质量的代码,那掌握编写技巧可是必不可少哦!这不仅能让你的代码变得更加易读易维护,还可以让你的应用程序性能更强、稳定性更高!所以,别怕麻烦,多花些时间和心思在代码上,相信你一定能成为优秀的JAVA开发者! 要想让代码易读易维护、性能稳定,得拿出耐心和…...

OpenGL入门教程之 变换

引言 这是一个闪耀的时刻&#xff0c;因为我们即将能生产出令人惊叹的3D效果&#xff01; 变换 向量和矩阵变换包括太多内容&#xff0c;但由于学过线性代数和GAMES101&#xff0c;因此不在此做过多阐述。仅阐述包括代码的GLM内容。 GLM的使用 &#xff08;1&#xff09;GLM…...

ASPICE详细介绍-4.车载项目为什么要符合ASPICE标准?

目录 车载项目为什么要符合ASPICE标准&#xff1f;ASPICE与功能安全的关系、区别&#xff1f;各大车厂对软件体系的要求 车载项目为什么要符合ASPICE标准&#xff1f; ASPICE&#xff08;Automotive Software Process Improvement and Capability Determination&#xff09;最…...

一文彻底理解Java 17中的新特性密封类

密封类的作用 在面向对象语言中&#xff0c;我们可以通过继承&#xff08;extend&#xff09;来实现类的能力复用、扩展与增强。但有的时候&#xff0c;有些能力我们不希望被继承了去做一些不可预知的扩展。所以&#xff0c;我们需要对继承关系有一些限制的控制手段。而密封类…...

【Git 入门教程】第四节、Git冲突:如何解决版本控制的矛盾

Git是目前最流行的版本控制系统之一&#xff0c;它为团队协作开发提供了方便和高效的方式。然而&#xff0c;在多人同时修改同一个文件时&#xff0c;可能会出现代码冲突&#xff08;conflict&#xff09;&#xff0c;导致代码无法正确合并。那么&#xff0c;如何解决Git冲突呢…...

c++验证用户输入合法性的示例代码

c验证用户输入合法性的示例代码 本文介绍c验证用户输入合法性&#xff0c;用于检测限定用户输入值。包括&#xff1a;1、限定用户输入为整数&#xff08;正负整数&#xff09;&#xff1b;2、限定用户输入为正整数&#xff1b;3、限定用户输入为正数&#xff08;可以含有小数&…...

ctfshow web入门phpcve web311-315

1.web311 通过抓包发现php版本时为PHP/7.1.33dev 漏洞cve2019-11043 远程代码执行漏洞 利用条件&#xff1a; nginx配置了fastcgi_split_path_info 受影响系统&#xff1a; PHP 5.6-7.x&#xff0c;Nginx>0.7.31 下载工具进行利用 需要安装go环境 yum install golang -y …...

gpt.4.0-gpt 国内版

gpt 使用 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种预训练的语言模型&#xff0c;可用于多种自然语言处理任务&#xff0c;如情感分析、文本分类、文本生成等。下面是使用GPT的一些步骤和建议&#xff1a; 确定任务和数据集&#xff1a;首先&…...

放弃手动测试,快来了解JMeter压测神器的安装和使用吧~~

目录&#xff1a;导读 引言 jmeter的安装 JMeter是干什么的 JMeter都可以做那些测试 JMeter的使用和组件介绍 下面我们进行XML格式的实战练习 jmeter与postman的区别 JSON的插件 另附视频教程资源 引言 你是否曾经为手动测试而苦恼&#xff1f;是不是觉得手动测试太费…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

C++ 类基础:封装、继承、多态与多线程模板实现

前言 C 是一门强大的面向对象编程语言&#xff0c;而类&#xff08;Class&#xff09;作为其核心特性之一&#xff0c;是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性&#xff0c;包括封装、继承和多态&#xff0c;同时讨论类中的权限控制&#xff0c;并展示如何使用类…...

EEG-fNIRS联合成像在跨频率耦合研究中的创新应用

摘要 神经影像技术对医学科学产生了深远的影响&#xff0c;推动了许多神经系统疾病研究的进展并改善了其诊断方法。在此背景下&#xff0c;基于神经血管耦合现象的多模态神经影像方法&#xff0c;通过融合各自优势来提供有关大脑皮层神经活动的互补信息。在这里&#xff0c;本研…...

python读取SQLite表个并生成pdf文件

代码用于创建含50列的SQLite数据库并插入500行随机浮点数据&#xff0c;随后读取数据&#xff0c;通过ReportLab生成横向PDF表格&#xff0c;包含格式化&#xff08;两位小数&#xff09;及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...

react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)

之前都是使用react-pdf来渲染pdf文件&#xff0c;这次有个需求是要兼容xp环境&#xff0c;xp上chrome最高支持到49&#xff0c;虽然说iframe或者embed都可以实现预览pdf&#xff0c;但为了后续的定制化需求&#xff0c;还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...