最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python搭建代理IP池實(shí)現(xiàn)存儲(chǔ)IP的方法

 更新時(shí)間:2019年10月27日 14:53:30   作者:Steven·簡談  
這篇文章主要介紹了Python搭建代理IP池實(shí)現(xiàn)存儲(chǔ)IP的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

上一文寫了如何從代理服務(wù)網(wǎng)站提取 IP,本文就講解如何存儲(chǔ) IP,畢竟代理池還是要有一定量的 IP 數(shù)量才行。存儲(chǔ)的方式有很多,直接一點(diǎn)的可以放在一個(gè)文本文件中,但操作起來不太靈活,而我選擇的是 MySQL 數(shù)據(jù)庫,因?yàn)閿?shù)據(jù)庫便于管理而且功能強(qiáng)大,當(dāng)然你還可以選擇其他數(shù)據(jù)庫,比如 MongoDB、Redis 等。

代碼地址:https://github.com/Stevengz/Proxy_pool

另外三篇:

Python搭建代理IP池(一)- 獲取 IP
Python搭建代理IP池(三)- 檢測(cè) IP
Python搭建代理IP池(四)- 接口設(shè)置與整體調(diào)度

使用的庫:pymysql

定義規(guī)則

數(shù)據(jù)庫存儲(chǔ)的主要對(duì)象是各個(gè) IP,首先需要保證不重復(fù),另外還需要標(biāo) IP 的可用情況,而且需要?jiǎng)討B(tài)實(shí)時(shí)處理每個(gè) IP,因此還需要定義一個(gè)分?jǐn)?shù)字段,分?jǐn)?shù)是可以重復(fù)的,最好是整數(shù)類型,每個(gè) IP 都有一個(gè)分?jǐn)?shù),表現(xiàn)其可用性

對(duì)于代理池來說,分?jǐn)?shù)可以作為我們判斷一個(gè)代理可用不可用的標(biāo)志,我們將設(shè)置一個(gè)最高分(滿分,值由自己設(shè)置),代表可用,0 設(shè)為最低分,代表不可用。從代理池中獲取代理的時(shí)候會(huì)先從滿分 IP 中隨機(jī)獲取一個(gè),注意這里是隨機(jī),這樣可以保證每個(gè)可用 IP 都會(huì)被調(diào)用到,如果沒有滿分的就從所有 IP 從隨機(jī)選一個(gè)

分?jǐn)?shù)規(guī)則如下:

  • 滿分為可用,檢測(cè)器會(huì)定時(shí)循環(huán)檢測(cè)每個(gè) IP 的可用情況,一旦檢測(cè)到有可用的 IP 就立即置為滿分,檢測(cè)到不可用就將分?jǐn)?shù)減 1,減至 0 后移除。
  • 新獲取的代理添加時(shí)將分?jǐn)?shù)置為 10,當(dāng)測(cè)試可行立即置 100,不可行分?jǐn)?shù)減 1,減至 0 后移除

添加設(shè)置

先在一個(gè)文件中定義一些配置信息,如數(shù)據(jù)庫的設(shè)置、一些不變量如滿分的數(shù)值等

setting.py

# 數(shù)據(jù)庫地址
HOST = '127.0.0.1'
# MySql端口
MYSQL_PORT = 3306
# MySQl用戶名、密碼
MYSQL_USERNAME = '***'
MYSQL_PASSWORD = '***'
# 數(shù)據(jù)庫名
SQL_NAME = 'test'

# 代理等級(jí)
MAX_SCORE = 30
MIN_SCORE = 0
INITIAL_SCORE = 10

# 代理池?cái)?shù)量界限
POOL_UPPER_THRESHOLD = 1000

MAX_SCORE、MIN_SCORE、INITIAL_SCORE 分別代表最大分?jǐn)?shù)、最小分?jǐn)?shù)、初始分?jǐn)?shù)

定義方法

定義一個(gè)類來操作數(shù)據(jù)庫的有序集合,內(nèi)含一些方法來實(shí)現(xiàn)分?jǐn)?shù)的設(shè)置、代理的獲取等

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('代理不符合規(guī)范', ip, '丟棄')
   return
  if not self.exists(ip):
   self.cursor.execute(sql_add)
   self.db.commit()

 # 減少代理分?jǐn)?shù)
 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, '當(dāng)前分?jǐn)?shù)', score, '減1')
   sql_change = "UPDATE PROXY SET SCORE = %s WHERE IP = '%s'" % (score-1, ip)
  else:
   print('代理', ip, '當(dāng)前分?jǐn)?shù)', score, '移除')
   sql_change = "DELETE FROM PROXY WHERE IP = %s" % (ip)
  self.cursor.execute(sql_change)
  self.db.commit()

 # 分?jǐn)?shù)最大化
 def max(self, ip):
  print('代理', ip, '可用,設(shè)置為', MAX_SCORE)
  sql_max = "UPDATE PROXY SET SCORE = %s WHERE IP = '%s'" % (MAX_SCORE, ip)
  self.cursor.execute(sql_max)
  self.db.commit()
  
 # 隨機(jī)獲取有效代理
 def random(self):
  # 先從滿分中隨機(jī)選一個(gè)
  sql_max = "SELECT * FROM PROXY WHERE SCORE=%s" % (MAX_SCORE)
  if self.cursor.execute(sql_max):
   results = self.cursor.fetchall()
   return choice(results)[0]
  # 沒有滿分則隨機(jī)選一個(gè)
  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)
  
 # 獲取數(shù)量
 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():初始化的方法,參數(shù)是 MySQL 的連接信息,默認(rèn)的連接信息已經(jīng)定義為常量,在 init() 方法中初始化建立 MySQL 連接。這樣當(dāng) MySqlClient 類初始化的時(shí)候就建立了 MySQL 的連接
  • add():向數(shù)據(jù)庫添加代理并設(shè)置分?jǐn)?shù),默認(rèn)的分?jǐn)?shù)是 INITIAL_SCORE 也就是 10,返回結(jié)果是添加的結(jié)果
  • decrease():在 檢測(cè)無效的時(shí)候設(shè)置分?jǐn)?shù)減 1 的方法,傳入代理,然后將此代理的分?jǐn)?shù)減 1,如果達(dá)到最低值就刪除
  • max():將代理的分?jǐn)?shù)設(shè)置為 MAX_SCORE,也就是當(dāng) IP 有效時(shí)的設(shè)置
  • random():隨機(jī)獲取 IP 的方法,首先獲取滿分的 IP,然后隨機(jī)選擇一個(gè)返回,如果不存在滿分的 IP,則隨機(jī)選擇一個(gè)返回,否則拋出異常
  • exists():判斷 IP 是否存在于數(shù)據(jù)庫中
  • count():返回當(dāng)前 IP個(gè)數(shù)
  • all():返回所有的 IP,供檢測(cè)使用
  • batch():返回?cái)?shù)據(jù)庫中從第 start 行開始(從0開始數(shù))的共 stop-start 行數(shù)據(jù)

抓取保存

當(dāng)數(shù)據(jù)庫設(shè)置好了之后,就可以直接把抓取的 IP 直接放在數(shù)據(jù)庫中了

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

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()

 # 判斷數(shù)量是否足夠
 def is_over_threshold(self):
  if self.mysql.count() >= POOL_UPPER_THRESHOLD:
   return True
  else:
   return False
 
 def run(self):
  print('獲取器開始執(zhí)行')
  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()

結(jié)果:

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python工程師面試必備25條知識(shí)點(diǎn)

    Python工程師面試必備25條知識(shí)點(diǎn)

    這篇文章主要為大家詳細(xì)介紹了Python工程師面試必備25條知識(shí)點(diǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • tesserocr與pytesseract模塊的使用方法解析

    tesserocr與pytesseract模塊的使用方法解析

    這篇文章主要介紹了tesserocr與pytesseract模塊的使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • python中子類與父類的關(guān)系基礎(chǔ)知識(shí)點(diǎn)

    python中子類與父類的關(guān)系基礎(chǔ)知識(shí)點(diǎn)

    在本篇文章里小編給大家整理的是一篇關(guān)于python中子類與父類的關(guān)系基礎(chǔ)知識(shí)點(diǎn)內(nèi)容,對(duì)此有興趣的朋友們可以學(xué)習(xí)下。
    2021-02-02
  • Python利用psutil獲取CPU與內(nèi)存等硬件信息

    Python利用psutil獲取CPU與內(nèi)存等硬件信息

    psutil是Python的一個(gè)第三方庫,提供了各種強(qiáng)大的硬件信息查閱功能,這篇文章主要為大家介紹了如何利用psutil獲取CPU與內(nèi)存等硬件信息,需要的可以參考一下
    2023-07-07
  • Python實(shí)現(xiàn)http接口自動(dòng)化測(cè)試的示例代碼

    Python實(shí)現(xiàn)http接口自動(dòng)化測(cè)試的示例代碼

    這篇文章主要介紹了Python實(shí)現(xiàn)http接口自動(dòng)化測(cè)試的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Python3 pickle對(duì)象串行化代碼實(shí)例解析

    Python3 pickle對(duì)象串行化代碼實(shí)例解析

    這篇文章主要介紹了Python3 pickle對(duì)象串行化代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 10個(gè)必須要掌握的Python內(nèi)置函數(shù)

    10個(gè)必須要掌握的Python內(nèi)置函數(shù)

    Python?解釋器自帶的函數(shù)叫做?內(nèi)置函數(shù),這些函數(shù)不需要import?導(dǎo)入就可以直接使用。本文小編為大家總結(jié)了十個(gè)必須要掌握的Python內(nèi)置函數(shù),實(shí)用且高效,需要的可以參考一下
    2022-02-02
  • 解決redis與Python交互取出來的是bytes類型的問題

    解決redis與Python交互取出來的是bytes類型的問題

    這篇文章主要介紹了解決redis與Python交互取出來的是bytes類型的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python實(shí)現(xiàn)仿真雙徑效應(yīng)的方法

    Python實(shí)現(xiàn)仿真雙徑效應(yīng)的方法

    雙徑模型是一種很好的近似,能夠準(zhǔn)確地反映信號(hào)的傳播特性。這篇文章主要介紹了Python實(shí)現(xiàn)仿真雙徑效應(yīng)的方法,感興趣的小伙伴們可以參考一下
    2021-05-05
  • python實(shí)現(xiàn)百度文庫自動(dòng)化爬取

    python實(shí)現(xiàn)百度文庫自動(dòng)化爬取

    項(xiàng)目是合法項(xiàng)目,只是進(jìn)行數(shù)據(jù)解析而已,不能下載看不到的內(nèi)容.部分文檔在電腦端不能預(yù)覽,但是在手機(jī)端可以預(yù)覽,所有本項(xiàng)目把瀏覽器瀏覽格式改成手機(jī)端,支持Windows和Ubuntu. 本項(xiàng)目使用的是chromedriver來控制chrome來模擬人來操作來進(jìn)行文檔爬取
    2021-04-04

最新評(píng)論

洛隆县| 桑植县| 潼关县| 镇安县| 永胜县| 巴东县| 灵石县| 佛山市| 青海省| 星子县| 三穗县| 陆河县| 全南县| 忻州市| 吴旗县| 定南县| 天津市| 丁青县| 磴口县| 昌宁县| 长岛县| 星座| 栖霞市| 酉阳| 株洲市| 宁晋县| 望江县| 玛沁县| 佛山市| 什邡市| 北宁市| 抚州市| 民乐县| 洪洞县| 鸡西市| 安达市| 封丘县| 宜都市| 昆明市| 鹤山市| 四会市|