亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python搭建代理IP池實現(xiàn)檢測IP的方法

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

在獲取 IP 時,已經成功將各個網站的代理 IP 獲取下來了,然后就需要一個檢測模塊來對所有的代理進行一輪輪的檢測,檢測可用就設置為滿分,不可用分數就減 1,這樣就可以實時改變每個代理的可用情況,在獲取有效 IP 的時候只需要獲取分數高的 IP

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

另外三篇:
Python搭建代理IP池(一)- 獲取 IP
Python搭建代理IP池(二)- 存儲 IP
Python搭建代理IP池(四)- 接口設置與整體調度

由于代理 IP 的數量非常多,為了提高 IP 的檢測效率,這里使用異步請求庫 Aiohttp 來進行檢測。至于為什么不用抓取時用的 Requests 庫,是因為它是一個同步請求庫,在發(fā)出一個請求之后需要等待網頁加載完成之后才能繼續(xù)執(zhí)行程序。這個過程會阻塞在等待響應中,如果服務器響應非常慢,一個請求就會需要十幾秒,程序不會繼續(xù)往下執(zhí)行

異步請求庫就解決了這個問題,在請求發(fā)出之后,程序可以繼續(xù)接下去執(zhí)行其他的事情,當響應到達時會通知程序再去處理這個響應,這樣程序就沒有被阻塞,可以充分把時間和資源利用起來

添加設置

增加了幾個測試用的常量

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

VALID_STATUS_CODES = [200, 302]

# 測試API,建議抓哪個網站測哪個
TEST_URL = 'http://www.baidu.com'

# 最大批測試量
BATCH_TEST_SIZE = 30

VALID_STATUS_CODES 變量包含了正常的狀態(tài)碼,獲取 Response 后需要判斷響應的狀態(tài),如果狀態(tài)碼在

VALID_STATUS_CODES 這個列表里,則代表代理可用

定義方法

定義了一個類 Tester,init() 方法中建立了一個 MySqlClient 對象,供類中其他方法使用。接下來定義了一個 test_single_proxy() 方法,用來檢測單個代理的可用情況,其參數就是被檢測的代理

tester.py

import asyncio
import aiohttp
import time
import sys
from aiohttp import ClientError
from db import MySqlClient
from setting import *


class Tester(object):
 def __init__(self):
  self.mysql = MySqlClient()
 
 # 測試單個代理
 async def test_single_ip(self, ip):
  conn = aiohttp.TCPConnector(verify_ssl=False)
  async with aiohttp.ClientSession(connector=conn) as session:
   try:
    if isinstance(ip, bytes):
     ip = ip.decode('utf-8')
    real_ip = 'http://' + ip
    print('正在測試', ip)
    async with session.get(TEST_URL, proxy=real_ip, timeout=15, allow_redirects=False) as response:
     if response.status in VALID_STATUS_CODES:
      self.mysql.max(ip)
      print('代理可用', ip)
     else:
      self.mysql.decrease(ip)
      print('請求響應碼不合法 ', response.status, 'IP', ip)
   except (ClientError, aiohttp.client_exceptions.ClientConnectorError, asyncio.TimeoutError, AttributeError):
    self.mysql.decrease(ip)
    print('代理請求失敗', ip)
 
 # 主函數
 def run(self):
  print('測試器開始運行')
  try:
   count = self.mysql.count()
   print('當前剩余', count, '個代理')
   for i in range(0, count, BATCH_TEST_SIZE):
    start = i
    stop = min(i + BATCH_TEST_SIZE, count)
    print('正在測試第', start + 1, '-', stop, '個代理')
    test_ip_group = self.mysql.batch(start, stop)
    loop = asyncio.get_event_loop()
    tasks = [self.test_single_ip(ip_tuple[0]) for ip_tuple in test_ip_group]
    loop.run_until_complete(asyncio.wait(tasks))
    sys.stdout.flush()
    time.sleep(5)
  except Exception as e:
   print('測試器發(fā)生錯誤', e.args)


if __name__ == "__main__":
 test = Tester()
 test.run()

test_single_proxy() 方法前面加了 async 關鍵詞,代表這個方法是異步的,方法內部首先創(chuàng)建了 Aiohttp 的 ClientSession 對象,此對象類似于 Requests 的 Session 對象,可以直接調用該對象的 get() 方法來訪問頁面

運行結果:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Python?Django教程之實現(xiàn)新聞應用程序

    Python?Django教程之實現(xiàn)新聞應用程序

    Django是一個用Python編寫的高級框架,它允許我們創(chuàng)建服務器端Web應用程序。在本文中,我們將了解如何使用Django創(chuàng)建新聞應用程序,感興趣的可以嘗試一下
    2022-10-10
  • 神經網絡python源碼分享

    神經網絡python源碼分享

    這篇文章主要介紹了神經網絡python源碼分享,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • 使用Python給PDF添加目錄書簽的實現(xiàn)方法

    使用Python給PDF添加目錄書簽的實現(xiàn)方法

    有時下載到掃描版的 PDF 是不帶書簽目錄的,這樣閱讀起來很不方便,下面通過 python 實現(xiàn)一個半自動化添加書簽目錄的腳本,文中通過代碼介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2023-10-10
  • tensorflow 打印內存中的變量方法

    tensorflow 打印內存中的變量方法

    今天小編就為大家分享一篇tensorflow 打印內存中的變量方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • django之如何按日期查詢數據

    django之如何按日期查詢數據

    這篇文章主要介紹了django之如何按日期查詢數據問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • python中的常量和變量代碼詳解

    python中的常量和變量代碼詳解

    這篇文章主要介紹了python中的常量和變量,通過實例代碼給大家介紹了局部和全局變量,需要的朋友參考下吧
    2018-07-07
  • Python大數據之網絡爬蟲的post請求、get請求區(qū)別實例分析

    Python大數據之網絡爬蟲的post請求、get請求區(qū)別實例分析

    這篇文章主要介紹了Python大數據之網絡爬蟲的post請求、get請求區(qū)別,結合具體實例形式分析了Python網頁爬蟲post請求與get請求相關使用技巧,需要的朋友可以參考下
    2019-11-11
  • Django中日期時間型字段進行年月日時分秒分組統(tǒng)計

    Django中日期時間型字段進行年月日時分秒分組統(tǒng)計

    這篇文章主要介紹了Django中日期時間型字段進行年月日時分秒分組統(tǒng)計,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • pytorch進行上采樣的種類實例

    pytorch進行上采樣的種類實例

    今天小編就為大家分享一篇pytorch進行上采樣的種類實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • 一文教你用python編寫Dijkstra算法進行機器人路徑規(guī)劃

    一文教你用python編寫Dijkstra算法進行機器人路徑規(guī)劃

    迪杰斯特拉(Dijkstra)算法是典型最短路徑算法,用于計算一個節(jié)點到其他節(jié)點的最短路徑,這篇文章主要給大家介紹了關于利用python編寫Dijkstra算法進行機器人路徑規(guī)劃的相關資料,需要的朋友可以參考下
    2021-08-08

最新評論