从零开始构建自己的爬虫代理IP数据库并定期检验IP有效性

简介: 从零开始构建自己的代理IP池; 根据代理IP网址抓取新的代理IP; 对历史代理IP有效性验证; python实现

ProxyIPPool

从零开始构建自己的代理IP池;根据代理IP网址抓取新的代理IP;对历史代理IP有效性验证

源码地址:https://github.com/TOMO-CAT/ProxyIPPool

为什么要使用代理IP

在爬虫的过程中,很多网站会采取反爬虫技术,其中最经常使用的就是限制一个IP的访问次数。当你本地的IP地址被该网站封禁后,可能就需要换一个代理来爬虫。其中有很多网站提供免费的代理IP(如www.xicidaili.com ),我们需要做的就是从代理网站抓取代理IP,测试代理IP的有效性后将合适的代理IP加入数据库表中作为我们爬虫的代理IP池

开发思路

1、通过本地IP抓取第一批启动代理IP

我们从代理IP网站抓取代理IP的过程本身就是爬虫,如果短时间内请求次数过多会被网站禁止访问,因此我们需要利用本地IP去抓取第一批代理IP,然后使用代理IP去抓取新的代理IP。

2、对第一批启动的代理IP验证有效性后存入数据库

我们在数据库IP.db下建了两个表:proxy_ip_table(存储所有抓取的IP,用于查看抓取IP功能是否正常)和validation_ip_table(存储所有通过验证的IP,用于查看IP有效性)
第一步中获取的代理IP经检验后存入validation_ip_table,检验的实现如下:

def ip_validation(self, ip):
    #判断是否高匿:非高匿的ip仍会出卖你的真实ip
    anonymity_flag = False
    if "高匿" in str(ip):
        anonymity_flag = True

    IP = str(ip[0]) + ":" + str(ip[1]);IP
    url = "http://httpbin.org/get" ##测试代理IP功能的网站
    proxies = { "https" : "https://" + IP}   #为什么要用https而不用http我也不清楚
    headers = FakeHeaders().random_headers_for_validation()

    #判断是否可用
    validation_flag = True
    response = None

    try:
        response = requests.get(url = url, headers = headers, proxies = proxies, timeout = 5)
    except:
        validation_flag = False
    if response is None :
        validation_flag = False
        
    if anonymity_flag and validation_flag:
        return True
    else:
        return False

3、构建待访问的网址列表并循环抓取,每次抓取的ip_list经验证后存入数据库表

我们构建了待访问的网址列表(暂定100个容易跑完):

self.URLs = [ "https://www.xicidaili.com/nn/%d" % (index + 1) for index in range(100)] 

包含的模块

1、RandomHeaders.py

构造随机请求头,用于模拟不同的网络浏览器,调用方式:

from RandomHeaders import FakeHeaders
#返回请求xici代理网站的请求头
xici_headers = FakeHeaders().random_headers_for_xici

2、DatabaseTable.py

提供数据库的创建表和增删查功能,调用方式:

from DatabaseTable import IPPool
tablename = "proxy_ip_table"
#tablename也可以是validation_ip_table
IPPool(tablename).create() #创建表
IPPool(tablename).select(random_flag = False)
# random_flag = True时返回一条随机记录,否则返回全部记录
IPPool(table_name).delete(delete_all = True) #删除全部记录

3、GetProxyIP.py

核心代码,有几个函数可以实现不同的功能:

  • 从0开始完成建表、抓取IP和存入数据库的功能
from GetProxyIP import Carwl
Crawl().original_run()
  • 当代理IP个数不够的时候,根据url_list列表进行抓取,将合适的IP存入列表
from GetProxyIP import Carwl
#其他提供代理IP的网站
url_kuaidaili = ["https://www.kuaidaili.com/free/inha/%d" % (index + 1) for index in range(10,20)]
Crawl().get_more_run(url_list)

  • 当IP池太久没用时,需要对IP有效性进行验证,不符合要求的IP需要删除
from GetProxyIP import Carwl
Crawl().proxy_ip_validation()

问题&改进

  • 从代理IP网站抓取代理IP本质上也是爬虫,代理IP网站也设置了反爬机制,大概在xici获取4000个代理IP左右就会被封IP,从而需要使用代理来获取代理IP。
  • 和网上的经验不同,xici网前100页的代理IP可用率还是比较高的,基本上有九成。但是可能会有"检验有效的代理IP不一定能用"和"第一次检验失效的代理IP可能以后能用"的问题,这也是我将代理IP和有效的代理IP分别存储在两张表的原因。
  • 使用代理IP时,构建成http和https可能会导致截然不同的结果,同样,将目标url写成http或https可能会导致程序正常运行和报错两种结果。暂时我还不清楚原因。
  • 由于程序使用了网络,并且循环次数较多。因此我多次使用了continue跳出循环,但是获取有效的代理IP还是成功率比较高的。
  • 获取10000个代理IP的速度基本上需要五个小时,实在太慢了,后续如果改进程序的话可能会尝试多线程。
目录
相关文章
|
2月前
|
数据采集 机器学习/深度学习 边缘计算
Python爬虫动态IP代理报错全解析:从问题定位到实战优化
本文详解爬虫代理设置常见报错场景及解决方案,涵盖IP失效、403封禁、性能瓶颈等问题,提供动态IP代理的12种核心处理方案及完整代码实现,助力提升爬虫系统稳定性。
144 0
|
4月前
|
数据采集 人工智能 边缘计算
爬虫IP代理效率优化:策略解析与实战案例
本文深入探讨了分布式爬虫中代理池效率优化的关键问题。首先分析了代理效率瓶颈的根源,包括不同类型代理的特点、连接耗时及IP失效问题。接着提出了六大核心优化策略:智能IP轮换矩阵、连接复用优化、动态指纹伪装、智能重试机制等,并结合电商价格监控、社交媒体舆情分析和金融数据抓取三个实战案例,展示了优化效果。同时建立了三维效率评估体系,从质量、成本和稳定性全面衡量性能。最后展望了AI驱动调度、边缘计算融合等未来演进方向,帮助爬虫系统实现从“暴力采集”到“智能获取”的进化,大幅提升效率并降低成本。
135 0
|
5月前
|
监控 数据库
【YashanDB 知识库】ycm 托管数据库时报错 OM host ip:127.0.0.1 is not support join to YCM
在托管数据库时,若 OM 的 IP 被设置为 127.0.0.1,将导致无法托管至 YCM,并使数据库失去监控。此问题源于安装时修改了 OM 的监听 IP。解决方法包括:将 OM 的 IP 修改为本机实际 IP 或 0.0.0.0,同时更新 env 文件及 yasom 后台数据库中的相关配置。经验总结指出,应避免非必要的后台 IP 修改,且数据库安装需遵循规范,不使用仅限本机访问的 IP(如 127.0.0.1)。
|
6月前
|
监控 数据库
【YashanDB知识库】ycm托管数据库时报错OM host ip:127.0.0.1 is not support join to YCM
在托管数据库时,若OM的IP被设置为127.0.0.1,则不支持托管到YCM,导致数据库无法正常监控。此问题源于安装时修改了OM监听IP为127.0.0.1。解决方法为将OM的IP修改为本机实际IP或0.0.0.0,并更新yasom后台数据库中的相关配置。建议遵循规范安装,避免使用仅限本机访问的IP(如127.0.0.1),以减少潜在风险。
|
6月前
|
关系型数据库 Shell 网络安全
定期备份数据库:基于 Shell 脚本的自动化方案
本篇文章分享一个简单的 Shell 脚本,用于定期备份 MySQL 数据库,并自动将备份传输到远程服务器,帮助防止数据丢失。
|
6月前
|
监控 数据库
ycm托管数据库时报错OM host ip:127.0.0.1 is not support join to YCM-YashanDB
ycm托管数据库时报错OM host ip:127.0.0.1 is not support join to YCM-YashanDB
|
9月前
|
数据采集 安全 API
高级技术文章:使用 Kotlin 和 Unirest 构建高效的 Facebook 图像爬虫
高级技术文章:使用 Kotlin 和 Unirest 构建高效的 Facebook 图像爬虫
|
9月前
|
数据采集
动态代理与静态代理在爬虫解析的优缺点
随着科技和互联网的发展,越来越多企业需要使用代理进行数据抓取。本文介绍了HTTP动态代理与静态代理的区别,帮助您根据具体需求选择最佳方案。动态代理适合大规模、高效率的爬取任务,但稳定性较差;静态代理则适用于小规模、高稳定性和速度要求的场景。选择时需考虑目标、数据量及网站策略。
151 4
|
10月前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。
|
5月前
|
数据采集 测试技术 C++
无headers爬虫 vs 带headers爬虫:Python性能对比
无headers爬虫 vs 带headers爬虫:Python性能对比

热门文章

最新文章