【python】python开源代理ip池
一、前言
随着互联网的不断发展,越来越多的应用需要使用高匿代理IP才能访问目标网站,而代理IP作为一种能够隐藏本机真实IP地址的工具,在网络抓取、搜索引擎排名、广告投放、反爬虫等方面有着广泛的应用场景。但是,由于代理IP的稳定性难以保证,而且容易被反爬虫机制识别和封杀,为解决这些问题,我们可以通过构建一个代理IP池来实现代理IP的有效管理和使用。
本文将介绍如何使用Python语言和开源爬虫框架Scrapy,构建一个高匿代理IP池,并提供完整的代码和案例。
二、代理IP池的构建流程
构建代理IP池的大致流程如下:
1.爬取代理IP数据
2.验证代理IP的有效性和匿名性
3.将有效的代理IP保存到代理IP池中
4.从代理IP池中随机获取一个代理IP并使用
接下来,我们将详细介绍每个步骤的实现方式。
2.1、爬取代理IP数据
在构建代理IP池之前,我们需要先收集一些代理IP数据。这里我们可以使用一些代理IP网站上的API接口或者直接爬取网站上的代理IP数据。
以爬取站大爷代理网站为例,其网站上提供了一个可以直接访问的代理IP列表页面,我们可以从该页面中提取出代理IP地址和端口号等信息。
以下为爬取站大爷代理网站的代理IP数据的代码实现:
import scrapy
class XiciSpider(scrapy.Spider):
name = 'xici'
allowed_domains = ['www.zdaye.com']
start_urls = ['http://www.zdaye.com/']
def parse(self, response):
item_list = response.xpath('//table[@id="ip_list"]//tr')[1:]
for item in item_list:
ip = item.xpath('.//td[2]/text()').get()
port = item.xpath('.//td[3]/text()').get()
yield {
'ip': ip,
'port': port
}
以上代码中,我们使用Scrapy框架爬取西刺代理网站,爬取其网页上的代理IP地址和端口号,并以字典的格式保存到内存中。
2.2、验证代理IP的有效性和匿名性
由于代理IP的可用性和匿名性是不稳定的,我们需要定期验证其有效性和匿名性。验证代理IP可用性的方法是通过访问目标网站并获取目标网页的数据,如果获取到了数据,则说明该代理IP可用;否则,则说明该代理IP不可用。
验证代理IP匿名性的方法是通过访问代理IP网站上的检测页面,检测代理IP是否真正地隐藏了客户端的真实IP地址。我们可以使用Python的requests库发起HTTP请求和获取HTTP响应,判断目标网站的状态码和返回的内容是否符合要求。
以下为验证代理IP有效性和匿名性的代码实现:
import requests
def validate_proxy(proxy):
url = 'http://httpbin.org/get'
proxies = {
'http': 'http://{ip}:{port}'.format(**proxy),
'https': 'https://{ip}:{port}'.format(**proxy)
}
try:
response = requests.get(url, proxies=proxies, timeout=10)
if response.status_code == 200 and response.json().get('origin'):
return True
except:
pass
return False
def check_anonymous(proxy):
url = 'https://www.baidu.com/'
headers = {
'User-Agent': 'Mozilla/5.0'
}
proxies = {
'http': 'http://{ip}:{port}'.format(**proxy),
'https': 'https://{ip}:{port}'.format(**proxy)
}
try:
response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
if response.status_code == 200 and 'baidu' in response.text:
return True
except:
pass
return False
以上代码中,我们定义了两个函数validate_proxy和check_anonymous,用于验证代理IP的有效性和匿名性。其中,validate_proxy函数会访问httpbin.org网站,并从响应数据中获取客户端的ip地址,如果获取到了数据,则说明该代理IP可用;否则,则说明不可用。check_anonymous函数会访问百度首页,并判断访问结果是否为正常页面,如果是,则说明代理IP匿名性高;否则,则说明代理IP匿名性低。
2.3、将有效的代理IP保存到代理IP池中
当我们验证出一批有效的代理IP时,可以将其保存到代理IP池中,以便于后续使用。
以下为将代理IP保存到代理IP池中的代码实现:
import redis
class ProxyPool(object):
def __init__(self):
self.client = redis.Redis(host='localhost', port=6379, db=0, password='')
def add(self, proxy):
self.client.sadd('proxy_pool', str(proxy))
def remove(self, proxy):
self.client.srem('proxy_pool', str(proxy))
def random(self):
return eval(self.client.srandmember('proxy_pool'))
def all(self):
return [eval(p) for p in self.client.smembers('proxy_pool')]
以上代码中,我们使用Redis数据库作为代理IP池的存储工具,通过在Redis中创建一个set类型的key值proxy_pool,来存储所有可用的代理IP。在这里,我们定义了一个名为ProxyPool的类,用于对代理IP池进行增删改查的操作。
2.4、从代理IP池中随机获取一个代理IP并使用
当我们需要使用代理IP访问目标网站时,可以从代理IP池中随机获取一个代理IP,并将其添加到requests库的代理参数proxies中,以便于使用代理IP来访问目标网站。
以下为从代理IP池中随机获取一个代理IP的代码实现:
def get_random_proxy():
proxy_pool = ProxyPool()
proxy = proxy_pool.random()
while not validate_proxy(proxy):
proxy_pool.remove(proxy)
proxy = proxy_pool.random()
return proxy
def download(url):
proxy = get_random_proxy()
proxies = {
'http': 'http://{ip}:{port}'.format(**proxy),
'https': 'https://{ip}:{port}'.format(**proxy)
}
headers = {
'User-Agent': 'Mozilla/5.0'
}
try:
response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
if response.status_code == 200:
return response.text
except:
pass
return None
以上代码中,我们使用get_random_proxy随机获取一个代理IP,并使用validate_proxy函数验证该代理IP是否可用,如果该代理IP不可用,则从代理IP池中删除该代理IP,并重新获取。当获取到可用的代理IP后,我们将其添加到requests库的参数proxies中,并使用requests库来访问目标网站。
三、完整代码实现
将以上代码整合到一个文件中,得到完整的高匿代理IP池的实现方式,代码如下:
import scrapy
import requests
import redis
class XiciSpider(scrapy.Spider):
name = 'xici'
allowed_domains = ['www.xicidaili.com']
start_urls = ['http://www.xicidaili.com/']
def parse(self, response):
item_list = response.xpath('//table[@id="ip_list"]//tr')[1:]
for item in item_list:
ip = item.xpath('.//td[2]/text()').get()
port = item.xpath('.//td[3]/text()').get()
proxy = {
'ip': ip,
'port': port
}
if validate_proxy(proxy) and check_anonymous(proxy):
add_proxy(proxy)
def validate_proxy(proxy):
url = 'http://httpbin.org/get'
proxies = {
'http': 'http://{ip}:{port}'.format(**proxy),
'https': 'https://{ip}:{port}'.format(**proxy)
}
try:
response = requests.get(url, proxies=proxies, timeout=10)
if response.status_code == 200 and response.json().get('origin'):
return True
except:
pass
return False
def check_anonymous(proxy):
url = 'https://www.baidu.com/'
headers = {
'User-Agent': 'Mozilla/5.0'
}
proxies = {
'http': 'http://{ip}:{port}'.format(**proxy),
'https': 'https://{ip}:{port}'.format(**proxy)
}
try:
response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
if response.status_code == 200 and 'baidu' in response.text:
return True
except:
pass
return False
class ProxyPool(object):
def __init__(self):
self.client = redis.Redis(host='localhost', port=6379, db=0, password='')
def add(self, proxy):
self.client.sadd('proxy_pool', str(proxy))
def remove(self, proxy):
self.client.srem('proxy_pool', str(proxy))
def random(self):
return eval(self.client.srandmember('proxy_pool'))
def all(self):
return [eval(p) for p in self.client.smembers('proxy_pool')]
def add_proxy(proxy):
proxy_pool = ProxyPool()
proxy_pool.add(proxy)
def get_random_proxy():
proxy_pool = ProxyPool()
proxy = proxy_pool.random()
while not validate_proxy(proxy):
proxy_pool.remove(proxy)
proxy = proxy_pool.random()
return proxy
def download(url):
proxy = get_random_proxy()
proxies = {
'http': 'http://{ip}:{port}'.format(**proxy),
'https': 'https://{ip}:{port}'.format(**proxy)
}
headers = {
'User-Agent': 'Mozilla/5.0'
}
try:
response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
if response.status_code == 200:
return response.text
except:
pass
return None
if __name__ == '__main__':
from multiprocessing import Process
spider_process = Process(target=scrapy.cmdline.execute, args=('scrapy crawl xici',))
spider_process.start()
while True:
url = input('请输入需要访问的URL:')
print(download(url))
spider_process.join()
在代码中,我们首先定义了XiciSpider类,用于爬取西刺代理网站上的代理IP数据。然后,我们使用requests库对代理IP进行验证,并使用Redis来保存可用的代理IP。最后,我们定义了get_random_proxy函数,从代理IP池中随机获取一个代理IP,并使用requests库来访问目标网站。
总结
Python开源代理IP池是一个非常有用的工具,它可以帮助我们自动爬取和验证代理IP,并将可用的代理IP保存到一个池中,供我们在爬虫或其他需要访问目标网站时使用,可以有效地避免IP被封杀的问题。
【python】python开源代理ip池的更多相关文章
- python爬虫构建代理ip池抓取数据库的示例代码
爬虫的小伙伴,肯定经常遇到ip被封的情况,而现在网络上的代理ip免费的已经很难找了,那么现在就用python的requests库从爬取代理ip,创建一个ip代理池,以备使用. 本代码包括ip的爬取,检 ...
- python多线程建立代理ip池
之前有写过用单线程建立代理ip池,但是大家很快就会发现,用单线程来一个个测试代理ip实在是太慢了,跑一次要很久才能结束,完全无法忍受.所以这篇文章就是换用多线程来建立ip池,会比用单线程快很多.之所以 ...
- Python爬虫代理IP池
目录[-] 1.问题 2.代理池设计 3.代码模块 4.安装 5.使用 6.最后 在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代 ...
- Python 爬虫的代理 IP 设置方法汇总
本文转载自:Python 爬虫的代理 IP 设置方法汇总 https://www.makcyun.top/web_scraping_withpython15.html 需要学习的地方:如何在爬虫中使用 ...
- 利用代理IP池(proxy pool)搭建免费ip代理和api
先看这里!!!---->转载:Python爬虫代理IP池(proxy pool) WIIN10安装中遇到的问题: 一.先安装Microsoft Visual C++ Compiler for P ...
- 自建免费的代理ip池
00x01--- 前言 因为爬虫被禁ip这样的反扒真的很凶,但自从建了一个代理ip池以后,反反扒就可以跟的上节奏.当然你也可以上网上各种代理平台自己付费.这些平台当然很方便提供api调用,还不用自己验 ...
- 【python3】如何建立爬虫代理ip池
一.为什么需要建立爬虫代理ip池 在众多的网站防爬措施中,有一种是根据ip的访问频率进行限制的,在某段时间内,当某个ip的访问量达到一定的阀值时,该ip会被拉黑.在一段时间内被禁止访问. 这种时候,可 ...
- 建立爬虫代理IP池
单线程构建爬虫代理IP池 #!/usr/bin/python3.5 # -*- coding:utf-8 -*- import time import tempfile from lxml impor ...
- 做了一个动态代理IP池项目,邀请大家免费测试~
现在出来创业了,目前公司在深圳. 做了啥呢, 做了一个动态代理 IP 池项目 现在邀请大家免费测试体验! 免费激活码:关注微信公众号:2808proxy (每人每天限领一次噢~) 网站:https:/ ...
- springboot实现java代理IP池 Proxy Pool,提供可用率达到95%以上的代理IP
一.背景 前段时间,写java爬虫来爬网易云音乐的评论.不料,爬了一段时间后ip被封禁了.由此,想到了使用ip代理,但是找了很多的ip代理网站,很少有可以用的代理ip.于是,抱着边学习的心态,自己开发 ...
随机推荐
- R 语言绘制环状热图
作者:佳名来源:简书 - R 语言文集 1. 读取并处理基因表达数据 这是我的基因表达量数据: 图 Fig 1 > myfiles <- list.files(pattern = &quo ...
- Hive执行计划之只有map阶段SQL性能分析和解读
目录 目录 概述 1.不带函数操作的select-from-where型简单SQL 1.1执行示例 1.2 运行逻辑分析 1.3 伪代码解释 2.带普通函数和运行操作符的普通型SQL执行计划解读 2. ...
- TLS详解(原理和实践)
主页 个人微信公众号:密码应用技术实战 个人博客园首页:https://www.cnblogs.com/informatics/ 引言 本文主要内容涉及到TLS协议发展历程.TLS协议原理以及在HTT ...
- 1. Spring 简介
1. Spring 概述 官网地址:https://spring.io/ Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用 Spring 框 ...
- 知识图谱之《海贼王-ONEPICE》领域图谱项目实战(含码源):数据采集、知识存储、知识抽取、知识计算、知识应用、图谱可视化、问答系统(KBQA)等
知识图谱之<海贼王-ONEPICE>领域图谱项目实战(含码源):数据采集.知识存储.知识抽取.知识计算.知识应用.图谱可视化.问答系统(KBQA)等 实体关系可视化页面可视化页面尝鲜 1. ...
- Unity iOS Guideline 1.3 - Safety - Kids Category 被拒
解决办法: 不使用unity 的分析SDK //关闭unity信息收集服务 UnityEngine.Analytics.Analytics.enabled = false; UnityEngine.A ...
- msyql的基本操作(增删改查)
一.SQL 语法要点 1.SQL 语句不区分大小写,但是数据库表名.列名和值是否区分,依赖于具体的 DBMS 以及配置. 例如:SELECT 与 select .Select 是相同的. 2.多条 S ...
- Dubbo的高级特性:服务治理篇
王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 上一篇中,我们已经在Spring Boot应用中集成了Dubbo,并注册了一个服务提供方和一个服务使用方 ...
- LEA: Improving Sentence Similarity Robustness to Typos Using Lexical Attention Bias 论文阅读
LEA: Improving Sentence Similarity Robustness to Typos Using Lexical Attention Bias 论文阅读 KDD 2023 原文 ...
- 【转载】Linux虚拟化KVM-Qemu分析(一)
原文信息 作者:LoyenWang 出处:https://www.cnblogs.com/LoyenWang/ 公众号:LoyenWang 版权:本文版权归作者和博客园共有 转载:欢迎转载,但未经作者 ...