python建立ip代理池_Python搭建代理IP池实现存储IP的方法

上一文写了如何从代理服务网站提取 IP,本文就讲解如何存储 IP,毕竟代理池还是要有一定量的 IP 数量才行。存储的方式有很多,直接一点的可以放在一个文本文件中,但操作起来不太灵活,而我选择的是 MySQL 数据库,因为数据库便于管理而且功能强大,当然你还可以选择其他数据库,比如 MongoDB、Redis 等。

另外三篇:

使用的库:pymysql

定义规则

数据库存储的主要对象是各个 IP,首先需要保证不重复,另外还需要标 IP 的可用情况,而且需要动态实时处理每个 IP,因此还需要定义一个分数字段,分数是可以重复的,最好是整数类型,每个 IP 都有一个分数,表现其可用性

对于代理池来说,分数可以作为我们判断一个代理可用不可用的标志,我们将设置一个最高分(满分,值由自己设置),代表可用,0 设为最低分,代表不可用。从代理池中获取代理的时候会先从满分 IP 中随机获取一个,注意这里是随机,这样可以保证每个可用 IP 都会被调用到,如果没有满分的就从所有 IP 从随机选一个

分数规则如下:

满分为可用,检测器会定时循环检测每个 IP 的可用情况,一旦检测到有可用的 IP 就立即置为满分,检测到不可用就将分数减 1,减至 0 后移除。

新获取的代理添加时将分数置为 10,当测试可行立即置 100,不可行分数减 1,减至 0 后移除

添加设置

先在一个文件中定义一些配置信息,如数据库的设置、一些不变量如满分的数值等

setting.py

# 数据库地址

HOST = '127.0.0.1'

# MySql端口

MYSQL_PORT = 3306

# MySQl用户名、密码

MYSQL_USERNAME = '***'

MYSQL_PASSWORD = '***'

# 数据库名

SQL_NAME = 'test'

# 代理等级

MAX_SCORE = 30

MIN_SCORE = 0

INITIAL_SCORE = 10

# 代理池数量界限

POOL_UPPER_THRESHOLD = 1000

MAX_SCORE、MIN_SCORE、INITIAL_SCORE 分别代表最大分数、最小分数、初始分数

定义方法

定义一个类来操作数据库的有序集合,内含一些方法来实现分数的设置、代理的获取等

db.py

import pymysql

from error import PoolEmptyError

from setting import *

from random import choice

import re

class MySqlClient(object):

# 初始化

def __init__(self, host=HOST, port=MYSQL_PORT, username=MYSQL_USERNAME, password=MYSQL_PASSWORD, sqlname=SQL_NAME):

self.db = pymysql.connect(host=host, user=username, password=password, port=port, db=sqlname)

self.cursor = self.db.cursor()

# 添加代理IP

def add(self, ip, score=INITIAL_SCORE):

sql_add = "INSERT INTO PROXY (IP,SCORE) VALUES ('%s', %s)" % (ip, score)

if not re.match('\d+\.\d+\.\d+\.\d+\:\d+', ip):

print('代理不符合规范', ip, '丢弃')

return

if not self.exists(ip):

self.cursor.execute(sql_add)

self.db.commit()

# 减少代理分数

def decrease(self, ip):

sql_get = "SELECT * FROM PROXY WHERE IP='%s'" % (ip)

self.cursor.execute(sql_get)

score = self.cursor.fetchone()[1]

print(score)

if score and score > MIN_SCORE:

print('代理', ip, '当前分数', score, '减1')

sql_change = "UPDATE PROXY SET SCORE = %s WHERE IP = '%s'" % (score-1, ip)

else:

print('代理', ip, '当前分数', score, '移除')

sql_change = "DELETE FROM PROXY WHERE IP = %s" % (ip)

self.cursor.execute(sql_change)

self.db.commit()

# 分数最大化

def max(self, ip):

print('代理', ip, '可用,设置为', MAX_SCORE)

sql_max = "UPDATE PROXY SET SCORE = %s WHERE IP = '%s'" % (MAX_SCORE, ip)

self.cursor.execute(sql_max)

self.db.commit()

# 随机获取有效代理

def random(self):

# 先从满分中随机选一个

sql_max = "SELECT * FROM PROXY WHERE SCORE=%s" % (MAX_SCORE)

if self.cursor.execute(sql_max):

results = self.cursor.fetchall()

return choice(results)[0]

# 没有满分则随机选一个

else:

sql_all = "SELECT * FROM PROXY WHERE SCORE BETWEEN %s AND %s" % (MIN_SCORE, MAX_SCORE)

if self.cursor.execute(sql_all):

results = self.cursor.fetchall()

return choice(results)[0]

else:

raise PoolEmptyError

# 判断是否存在

def exists(self, ip):

sql_exists = "SELECT 1 FROM PROXY WHERE IP='%s' limit 1" % ip

return self.cursor.execute(sql_exists)

# 获取数量

def count(self):

sql_count = "SELECT * FROM PROXY"

return self.cursor.execute(sql_count)

# 获取全部

def all(self):

self.count()

return self.cursor.fetchall()

# 批量获取

def batch(self, start, stop):

sql_batch = "SELECT * FROM PROXY LIMIT %s, %s" % (start, stop - start)

self.cursor.execute(sql_batch)

return self.cursor.fetchall()

方法作用:

init():初始化的方法,参数是 MySQL 的连接信息,默认的连接信息已经定义为常量,在 init() 方法中初始化建立 MySQL 连接。这样当 MySqlClient 类初始化的时候就建立了 MySQL 的连接

add():向数据库添加代理并设置分数,默认的分数是 INITIAL_SCORE 也就是 10,返回结果是添加的结果

decrease():在 检测无效的时候设置分数减 1 的方法,传入代理,然后将此代理的分数减 1,如果达到最低值就删除

max():将代理的分数设置为 MAX_SCORE,也就是当 IP 有效时的设置

random():随机获取 IP 的方法,首先获取满分的 IP,然后随机选择一个返回,如果不存在满分的 IP,则随机选择一个返回,否则抛出异常

exists():判断 IP 是否存在于数据库中

count():返回当前 IP个数

all():返回所有的 IP,供检测使用

batch():返回数据库中从第 start 行开始(从0开始数)的共 stop-start 行数据

抓取保存

当数据库设置好了之后,就可以直接把抓取的 IP 直接放在数据库中了

直接把前面用到的抓取代码更改一下就行了

getter.py

from crawler import Crawler

from db import MySqlClient

from setting import *

import sys

class Getter():

def __init__(self):

self.mysql = MySqlClient()

self.crawler = Crawler()

# 判断数量是否足够

def is_over_threshold(self):

if self.mysql.count() >= POOL_UPPER_THRESHOLD:

return True

else:

return False

def run(self):

print('获取器开始执行')

if not self.is_over_threshold():

for callback_label in range(self.crawler.__CrawlFuncCount__):

callback = self.crawler.__CrawlFunc__[callback_label]

# 获取代理

all_ip = self.crawler.get_proxies(callback)

sys.stdout.flush()

for ip in all_ip:

self.mysql.add(ip)

if __name__ == '__main__':

get = Getter()

get.run()

结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

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

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

相关文章

低秩矩阵分解 matlab,低秩分解的matlab代码看不懂,分解的两个矩阵在哪呀??...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼有四个文件:demo.mfunction [] demo()%This routine demonstrates an example of using LRR to do subspace segmentation. We cosntruct 5 independent subspaces, each of which has a rank of 10,%sample 200 point…

python深度神经网络算法_02.深度神经网络算法之Python基础与数据分析

资源内容:02.深度神经网络算法之Python基础与数据分析|____2016最新python基础篇视频教程22课|____Python学习手册(第4版).pdf|____Python程序入门与进阶|____基础篇01-福利课python先入为主上篇|____基础篇02-福利课python先入为主下篇|____基础篇03-虚拟机安装xub…

我们为什么要用MVC?ASP.NET MVC模式的优点?

1.关注点分离:每个功能最少会被切分为M-V-C三个部分,让开发者一次只需要关注一个部分,进而降低复杂难度,提高开发效率2.分层负责:明确切割,M-V-C三个部分并行开发3.自由操控HTML:在ASP.Net MVC中…

python 英语词频统计软件_Python实现统计英文文章词频的方法分析

本文实例讲述了Python实现统计英文文章词频的方法。分享给大家供大家参考,具体如下:应用介绍:统计英文文章词频是很常见的需求,本文利用python实现。思路分析:1、把英文文章的每个单词放到列表里,并统计列表…

mysql磁盘无法挂载,linux – 无法挂载磁盘(VFS:找不到ext4文件系统)

试图挂载磁盘(硬件raid)但失败了.#mount -t ext4 /dev/sda /datamount: wrong fs type,bad option,bad superblock on /dev/sda,missing codepage or helper program,or other errorIn some cases useful info is found in syslog - trydmesg | tail or so#dmesg | tail -1EXT4…

程序中的内存分配

栈由操作系统自动分配释放 ,用于存放函数的参数值、局部变量等,其操作方式类似于数据结构中的栈 1. 函数中定义的局部变量按照先后定义的顺序依次压入栈中,也就是说相邻变量的地址之间不会存在其它变量。 2. 栈的内存地址生长方向与堆相反,由…

python传中文参数_解决Python传递中文参数的问题

今天有个需要需要传递中文参数给URL但是在GBK环境下的脚本传递GBK的参数老是给我报UNICODE的解码错误。烦的很。所以我们果断选择用urlencode来处理中文,由于国内外网站编码不同,国内是GBK的,国外是UTF8的。>>> import sys>>&…

数据结构php语言,PHP语言做网页开发,会用到什么数据结构,算法?

回复讨论(解决方案)这个要根据项目而定的,PHP做开发,首先得会html javascript不是 会用到什么数据结构,算法而是你将 什么数据结构,算法 用到网页开发中去这个要根据项目而定的,PHP做开发,首先得会html jav…

pythonpptx 楷体_python-pptx 实践 4:添加形状、文本

1、添加流程箭头#加载库importosfrom pptx importPresentationfrom pptx.util importInches, Ptfrom pptx.enum.text importPP_ALIGNfrom pptx.enum.shapes importMSO_SHAPEfrom pptx.dml.color importRGBColor#设置路径work_path rE:\pyspace\tmp\pptxos.chdir(work_path)#实…

C# DevExpress XtraMessageBox自定义字体,字体大小,自定义按钮大小,自定义Icon

1.使用XtraMessageBoxForm,自定义Icon 2.重写XtraMessageBoxForm,自定义消息字体,标题字体 3.注册XtraMessageBoxForm的Showing事件,自定义按钮字体及按钮大小 具体代码如下,只写了简单两种方法,可自己扩展…

php维护页面,php – Symfony2中的“维护网站”页面

我跟着这个tutorial.这非常简单直接.这是我所需要的.您只需更改参数然后清除prod缓存,您仍然可以在dev或测试环境中访问该应用程序.在你的parameters.yml中添加:parameters:maintenance: false #turn it to true to enable maintenanceunderMaintenanceUntil: tomor…

批处理结束某个进程_进程调度

当计算机系统是多道程序设计系统时,常常会出现多个进程或线程竞争CPU的情况。如果有大于处理器数的进程(线程)处于就绪态时,就必须要选择下一个要执行的进程(线程)。在操作系统,用于选择接下来要执行的进程的程序称之为调度程序(Scheduler)&a…

[RN] 可播放视频的播放器版本

可播放视频的播放器版本 "react": "16.6.3", "react-native": "0.57.8", "react-native-orientation": "^3.1.0", "react-native-vector-icons": "^4.3.0", "react-native-video":…

有限元python编程流行吗_Python进行有限元分析

本博客主要是来讲述采用Python语言,利用直接刚度法,来编写求解《有限元方法基础教程》(第五版) 的例题2.1。(也许有的人认为商业软件已经和普及了,没有 必要再自己进行编程了,但是龙猪在这里建议大家还是去了解一下有限元的原理&a…

java用中根后根序列构造二叉树,106. 从中序与后序遍历序列构造二叉树

题目描述根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。示例:例如,给出中序遍历 inorder [9,3,15,20,7]后序遍历 postorder [9,15,7,20,3]返回如下的二叉树:3/ \9 20/ \15 7思路1.思路与105. 从前序与中序…

Python_selenium之获取当前页面的href属性,id属性,图片信息和截全屏

一、 获取当前页面的全部信息 1. 图片信息包括图片名称、图片大小等信息 2. 只需将图片信息打印出来(image.text image.size image.tag_name) 二、 获取页面元素的href属性(id同理) 1. 获取当前页面所有的链接信息&#xff0…

动态游标for循环_数据结构系列循环链表

前面留的一个问题,后文更跟新回答单链表可以表示任意的线性关系,有些线性关系是循环的,既没有队尾元素。将单链表中的终端结点指针端由空指针改为指向头结点,这时的单链表形成国恒一个环,改为循环链表。插入与删除与单链表的原理甚…

php对数组进行合成的函数,php合并数组函数array_merge()

array_merge()函数在php中是对数组进行合并的,可以把多个数组合成一个数组,并且不改变原数组的值了,但今天我在使用array_merge合并数组时碰到几个小细节上的问题,下面我举例子给各位朋友看看1.array_merge()合并$array array(a&…

Day01,python爬虫基础

今日内容: 爬虫课程: 一爬虫基本原理 二requests请求库 一爬虫基本原理 1、什么是爬虫? 爬虫就是爬取数据。 2、什么是互联网? 由一堆网络设备,把一台台的计算机互联到一起称之为互联网。 3、互联网建立的目的 数据的传递与数据的共享。 4、什么是数据? 例如: 电…

sas sql 读取最后一行数据_SAS基础编程和数据处理

前几天讲了数据分析中SQL的基本使用方法以及具体案例分析思路,接下来会继续讲统计基础以及在SAS软件内的应用,在这之前,本文先进行SAS基础使用编程的基础介绍,后续会主要阐述SAS软件内的统计数学的应用,如分析或初步建…