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

news/2024/7/19 11:12:27 标签: 爬虫, tcp/ip, python

前言

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

目录

  • 一、验证爬虫ip的可用性

一、验证爬虫ip的可用性

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

python">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加入到自有库池中。

python">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].text
        port = td_list[2].text
        protocol = td_list[5].text.lower()
        proxy = '{}://{}:{}'.format(protocol, ip, port)
        proxies.append(proxy)
    return proxies

三、维护爬虫ip的质量

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

python">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 = result
        if is_valid:
            quality_proxies.append((proxy, response_time))
    return quality_proxies

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

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

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

python">import shelve
class ProxyManager:
    def __init__(self, filename='proxies.db'):
        self.filename = filename
        self.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'] += 1
            self.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] = True
    def mark_as_success(self, proxy):
        if proxy in self.proxies:
            self.proxies[proxy]['success_times'] += 1
            self.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] = True
    def is_used(self, proxy):
        return self.proxies['used_proxies'].get(proxy)
    def close(self):
        self.proxies.close()

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

python">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.text
            except:
                pass
            proxy_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 proxy
    return None

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

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


http://www.niftyadmin.cn/n/272639.html

相关文章

[nesbot/carbon]轻松优雅的驾驭时间处理

简介 这个库的名字其实就很有意思:“carbon”,是化学元素的名字“碳”,为什么叫这个名字呢?在科学界,有一个"放射性碳定年法"的东西,是一种利用碳的同位素14C的放射性来对含有有机物质的物品进行…

操作系统——概述

目录 1.1初识操作系统 思考题: 1.2操作系统的功能和定义 思考题: 1.3操作系统发展史 思考题: 1.4分时技术 思考题: 1.5典型操作系统类型 1.1初识操作系统 常见桌面级别的四大操作系统:Windows、Mac OS、Linu…

jvm之字节码

写在前面 java字节码由单字节的指令(也叫做操作码)组成,但一个 byte 最多能够存储 256 个指令,够用吗?截止到目前是够的,因为指令的个数是200多一点,指令分为如下四类: 1:栈操作指令&#xff…

【电商必学】 WhatsApp 全新攻略:什么是交互式消息模板

网购与WhatsApp等社交通讯平台有着密不可分的关系,为什么这么说呢?因为基本上所有的网购的平台都会提供查询、下单方式给客户,而WhatsApp是全世界使用率最高的通讯平台,所以大部分电子商户都会选择WhatsApp Business与电子商务连接…

打造一个基于低代码的无代码平台,愿满足非专业人士的需求

一、开源项目简介 摸鱼低代码平台希望打造一个基于低代码的无代码平台。即能给程序员使用,也能满足非专业人士的需求。 后端基于Spring Cloud Alibaba注册中心、配置中心采用nacos当前版本完成oauth2统一认证接入持续进行功能完善 二、开源协议 使用Apache-2.0开…

nodejs+vue+springboot+python电影放映厅购票网站

(结合完成了以上的基本目标之后,能够帮助管理人员对系统的方便管理,从而能够为管理员节省时间,给了用户极大的方便。系统中的数据要存储于数据库当中,能够通过SQL代码把数据库中的数据取出,映射到实体类中&…

vue3+ts+vite自适应项目——搭建项目

系列文章目录 第一章:搭建项目 目录 系列文章目录 前言 一、搭建项目 二、安装sass 1.安装依赖 2.测试 三、引入element-plus 1.引入库 1.1 安装 2.2引入插件 2.3测试 2.自定义主题 四、实现自适应 1.安装 2.引入 总结 前言 本项目主要目的是熟练…

图片人群计数模型代码运行指南

PaperWithCode 八大数据集模型排名:https://paperswithcode.com/task/crowd-counting 搜索关键词 “人群计数”(crowd counting,crowd指的是人而不是拥挤的人;Counting People);“人流计数”;“人流量统计”(&#x…