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

网站模板在线预览免费企业信息发布平台

网站模板在线预览,免费企业信息发布平台,现在从事网站开发如何,天猫商城网上购物正品下载上一文写了如何从代理服务网站提取 IP#xff0c;本文就讲解如何存储 IP#xff0c;毕竟代理池还是要有一定量的 IP 数量才行。存储的方式有很多#xff0c;直接一点的可以放在一个文本文件中#xff0c;但操作起来不太灵活#xff0c;而我选择的是 MySQL 数据库#xff…上一文写了如何从代理服务网站提取 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 30MIN_SCORE 0INITIAL_SCORE 10# 代理池数量界限POOL_UPPER_THRESHOLD 1000MAX_SCORE、MIN_SCORE、INITIAL_SCORE 分别代表最大分数、最小分数、初始分数定义方法定义一个类来操作数据库的有序集合内含一些方法来实现分数的设置、代理的获取等db.pyimport pymysqlfrom error import PoolEmptyErrorfrom setting import *from random import choiceimport reclass MySqlClient(object):# 初始化def __init__(self, hostHOST, portMYSQL_PORT, usernameMYSQL_USERNAME, passwordMYSQL_PASSWORD, sqlnameSQL_NAME):self.db pymysql.connect(hosthost, userusername, passwordpassword, portport, dbsqlname)self.cursor self.db.cursor()# 添加代理IPdef add(self, ip, scoreINITIAL_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, 丢弃)returnif 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 % ipreturn self.cursor.execute(sql_exists)# 获取数量def count(self):sql_count SELECT * FROM PROXYreturn 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.pyfrom crawler import Crawlerfrom db import MySqlClientfrom setting import *import sysclass Getter():def __init__(self):self.mysql MySqlClient()self.crawler Crawler()# 判断数量是否足够def is_over_threshold(self):if self.mysql.count() POOL_UPPER_THRESHOLD:return Trueelse:return Falsedef 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.sadfv.cn/news/342798/

相关文章:

  • 聊城做网站费用价位长沙官网seo收费标准
  • 网站备案和实际的不同网站做cdn怎么弄
  • php网站开发招聘需求分析定制网站开发报价单
  • 做网站为什么要钱微信网站建设开发
  • 聊城做网站的公司行情建设企业网银
  • 专业积分商城网站制作国内产品网站建设
  • 公司管理网站首页微信小程序在哪里找到
  • 进下加强新闻宣传网站建设泉州关键词搜索排名
  • 外贸公司的网站创新创意产品设计作业
  • 企业网站类型主要包括企业网站asp
  • 发外链的网站排名国外黑色背景网站
  • 做烘培的网站有哪些网站开发是什
  • 网站建设流程域名注册Wordpress文章数据
  • 沈阳网站关键词优化哪家好如何制作网址链接
  • 河间哪里有做网站的文成网站
  • 公司做网站 要准备哪些素材郴州网签查询系统
  • 中国有什么网站做跨境零售网络购物系统参考文献
  • Spring做网站和什么免费手机网站自助建站
  • 竞价网站和优化网站的区别棋牌app开发多少钱
  • 建地方的网站前景php网站开发软件编程
  • 常见的电子商务网站推广方式简易的建筑人才网
  • 礼品网站如何做作业设计模板
  • 做一家网站要多少钱外链提高网站权重
  • 建站网站教程网络顾问
  • 网站制作技术支持中国500强最新排名2021
  • 刚做的网站怎么快速搜索到网站开发项目答辩ppt
  • 官方网站做自适应好还是响应式软件开发主要是做什么
  • 西宁做网站设计一个网站重点是什么
  • 阜新网站seowordpress taxonomy
  • 网站首页的动态效果图怎么做煤炭网站建设企业