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

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

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

在獲取 IP 時(shí),已經(jīng)成功將各個(gè)網(wǎng)站的代理 IP 獲取下來(lái)了,然后就需要一個(gè)檢測(cè)模塊來(lái)對(duì)所有的代理進(jìn)行一輪輪的檢測(cè),檢測(cè)可用就設(shè)置為滿分,不可用分?jǐn)?shù)就減 1,這樣就可以實(shí)時(shí)改變每個(gè)代理的可用情況,在獲取有效 IP 的時(shí)候只需要獲取分?jǐn)?shù)高的 IP

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

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

由于代理 IP 的數(shù)量非常多,為了提高 IP 的檢測(cè)效率,這里使用異步請(qǐng)求庫(kù) Aiohttp 來(lái)進(jìn)行檢測(cè)。至于為什么不用抓取時(shí)用的 Requests 庫(kù),是因?yàn)樗且粋€(gè)同步請(qǐng)求庫(kù),在發(fā)出一個(gè)請(qǐng)求之后需要等待網(wǎng)頁(yè)加載完成之后才能繼續(xù)執(zhí)行程序。這個(gè)過(guò)程會(huì)阻塞在等待響應(yīng)中,如果服務(wù)器響應(yīng)非常慢,一個(gè)請(qǐng)求就會(huì)需要十幾秒,程序不會(huì)繼續(xù)往下執(zhí)行

異步請(qǐng)求庫(kù)就解決了這個(gè)問(wèn)題,在請(qǐng)求發(fā)出之后,程序可以繼續(xù)接下去執(zhí)行其他的事情,當(dāng)響應(yīng)到達(dá)時(shí)會(huì)通知程序再去處理這個(gè)響應(yīng),這樣程序就沒(méi)有被阻塞,可以充分把時(shí)間和資源利用起來(lái)

添加設(shè)置

增加了幾個(gè)測(cè)試用的常量

setting.py

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

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

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

VALID_STATUS_CODES = [200, 302]

# 測(cè)試API,建議抓哪個(gè)網(wǎng)站測(cè)哪個(gè)
TEST_URL = 'http://www.baidu.com'

# 最大批測(cè)試量
BATCH_TEST_SIZE = 30

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

VALID_STATUS_CODES 這個(gè)列表里,則代表代理可用

定義方法

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

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()
 
 # 測(cè)試單個(gè)代理
 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('正在測(cè)試', 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('請(qǐng)求響應(yīng)碼不合法 ', response.status, 'IP', ip)
   except (ClientError, aiohttp.client_exceptions.ClientConnectorError, asyncio.TimeoutError, AttributeError):
    self.mysql.decrease(ip)
    print('代理請(qǐng)求失敗', ip)
 
 # 主函數(shù)
 def run(self):
  print('測(cè)試器開(kāi)始運(yùn)行')
  try:
   count = self.mysql.count()
   print('當(dāng)前剩余', count, '個(gè)代理')
   for i in range(0, count, BATCH_TEST_SIZE):
    start = i
    stop = min(i + BATCH_TEST_SIZE, count)
    print('正在測(cè)試第', start + 1, '-', stop, '個(gè)代理')
    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('測(cè)試器發(fā)生錯(cuò)誤', e.args)


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

test_single_proxy() 方法前面加了 async 關(guān)鍵詞,代表這個(gè)方法是異步的,方法內(nèi)部首先創(chuàng)建了 Aiohttp 的 ClientSession 對(duì)象,此對(duì)象類似于 Requests 的 Session 對(duì)象,可以直接調(diào)用該對(duì)象的 get() 方法來(lái)訪問(wèn)頁(yè)面

運(yùn)行結(jié)果:

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

相關(guān)文章

  • python列表數(shù)據(jù)增加和刪除的具體實(shí)例

    python列表數(shù)據(jù)增加和刪除的具體實(shí)例

    在本篇文章里小編給大家整理的是一篇關(guān)于python列表數(shù)據(jù)增加和刪除的具體實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-05-05
  • import的本質(zhì)解析

    import的本質(zhì)解析

    import是我們經(jīng)常使用的功能,方法大家也都會(huì)。雖然用的多,但它的本質(zhì)我們似乎沒(méi)有好好的了解過(guò)。本文就import的本質(zhì)解析,向大家作了介紹,需要的朋友可以參考下。
    2017-10-10
  • 如何使用Python最小二乘法擬合曲線代碼詳解

    如何使用Python最小二乘法擬合曲線代碼詳解

    最小二乘法Least Square Method做為分類回歸算法的基礎(chǔ),有著悠久的歷史,下面這篇文章主要給大家介紹了關(guān)于如何使用Python最小二乘法擬合曲線的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Python退火算法在高次方程的應(yīng)用

    Python退火算法在高次方程的應(yīng)用

    退火算法就是鋼鐵在淬煉過(guò)程中失溫而成穩(wěn)定態(tài)時(shí)的過(guò)程,熱力學(xué)上溫度(內(nèi)能)越高原子態(tài)越不穩(wěn)定。這篇文章主要介紹了Python退火算法在高次方程的應(yīng)用,需要的朋友可以參考下
    2018-07-07
  • python實(shí)現(xiàn)楊氏矩陣查找

    python實(shí)現(xiàn)楊氏矩陣查找

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)楊氏矩陣查找,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • python結(jié)合多線程爬取英雄聯(lián)盟皮膚(原理分析)

    python結(jié)合多線程爬取英雄聯(lián)盟皮膚(原理分析)

    多線程是為了同步完成多項(xiàng)任務(wù),不是為了提高運(yùn)行效率,而是為了提高資源使用效率來(lái)提高系統(tǒng)的效率。這篇文章主要介紹了python爬取英雄聯(lián)盟皮膚結(jié)合多線程的方法,需要的朋友可以參考下
    2021-05-05
  • 使用Python和百度語(yǔ)音識(shí)別生成視頻字幕的實(shí)現(xiàn)

    使用Python和百度語(yǔ)音識(shí)別生成視頻字幕的實(shí)現(xiàn)

    這篇文章主要介紹了使用Python和百度語(yǔ)音識(shí)別生成視頻字幕,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 自學(xué)python的建議和周期預(yù)算

    自學(xué)python的建議和周期預(yù)算

    在本篇文章中小編給大家分享了關(guān)于自學(xué)python的建議和周期預(yù)算,有興趣的朋友們可以學(xué)習(xí)參考下。
    2019-01-01
  • pycharm和anaconda的一些問(wèn)題及解決

    pycharm和anaconda的一些問(wèn)題及解決

    這篇文章主要介紹了pycharm和anaconda的一些問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Python OpenCV圖像顏色變換示例

    Python OpenCV圖像顏色變換示例

    大家好,本篇文章主要講的是Python OpenCV圖像顏色變換示例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01

最新評(píng)論

若尔盖县| 青田县| 巫山县| 宁德市| 聂拉木县| 临洮县| 陇川县| 靖远县| 永嘉县| 庐江县| 湖南省| 新沂市| 棋牌| 敖汉旗| 黎川县| 沁阳市| 莱芜市| 阿拉善右旗| 蓝田县| 元谋县| 渭源县| 桐庐县| 玛沁县| 江城| 成安县| 古蔺县| 合山市| 承德市| 都兰县| 虹口区| 文昌市| 榆社县| 赣榆县| 咸丰县| 绥德县| 益阳市| 青铜峡市| 岗巴县| 新郑市| 乌拉特前旗| 金堂县|