成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用Redis+Flask維護動態(tài)代理池

vibiu / 2899人閱讀

摘要:目標爬蟲中經(jīng)常遇到被封殺的情況最有效的方式就是使用代理。為什么要用代理池許多網(wǎng)站有專門的反爬蟲措施,可能遇到封等問題。通過定時的檢測維護同樣可以得到多個可用代理。

目標

爬蟲中經(jīng)常遇到被封殺IP的情況,最有效的方式就是使用代理IP。我們可以在一些平臺上購買代理IP,但是價格比較昂貴。另外很多IP代理網(wǎng)站也提供了一些免費的代理IP,可以爬取下這些代理IP,并使用webAPI方式提供代理IP服務。

為什么要用代理池?

許多網(wǎng)站有專門的反爬蟲措施,可能遇到封IP等問題。

互聯(lián)網(wǎng)上公開了大量免費代理,利用好資源。

通過定時的檢測維護同樣可以得到多個可用代理。

代理池的要求?

多站抓取,異步檢測

定時篩選,持續(xù)更新

提供接口,易于提取

代理池架構(gòu)?

代理池的實現(xiàn)
項目完整代碼已托管到github:https://github.com/panjings/p...

項目結(jié)構(gòu)如下:

從程序的入口run.py開始分析:

from proxypool.api import app
from proxypool.schedule import Schedule

def main():
    
    s = Schedule()
    // 運行調(diào)度器
    s.run()
    // 運行接口
    app.run()

if __name__ == "__main__":
    main()

run.py中不難看出,首先運行了一個調(diào)度器,接著運行了一個接口。

調(diào)度器schedule.py代碼:

class Schedule(object):
    @staticmethod
    def valid_proxy(cycle=VALID_CHECK_CYCLE):
        """
        Get half of proxies which in redis
        """
        conn = RedisClient()
        tester = ValidityTester()
        while True:
            print("Refreshing ip")
            count = int(0.5 * conn.queue_len)
            if count == 0:
                print("Waiting for adding")
                time.sleep(cycle)
                continue
            raw_proxies = conn.get(count)
            tester.set_raw_proxies(raw_proxies)
            tester.test()
            time.sleep(cycle)

    @staticmethod
    def check_pool(lower_threshold=POOL_LOWER_THRESHOLD,
                   upper_threshold=POOL_UPPER_THRESHOLD,
                   cycle=POOL_LEN_CHECK_CYCLE):
        """
        If the number of proxies less than lower_threshold, add proxy
        """
        conn = RedisClient()
        adder = PoolAdder(upper_threshold)
        while True:
            if conn.queue_len < lower_threshold:
                adder.add_to_queue()
            time.sleep(cycle)

    def run(self):
        print("Ip processing running")
        valid_process = Process(target=Schedule.valid_proxy)
        check_process = Process(target=Schedule.check_pool)
        valid_process.start()
        check_process.start()

Schedule中首先聲明了valid_proxy(),用來檢測代理是否可用,其中ValidityTester()方法中的test_single_proxy()方法是實現(xiàn)異步檢測的關鍵。
接著check_pool()方法里面?zhèn)魅肓巳齻€參數(shù):兩個代理池的上下界限,一個時間。其中PoolAdder()add_to_queue()方法中使用了一個從網(wǎng)站抓取ip的類FreeProxyGetter(),FreeProxyGetter()定義在getter.py里面。

接口api.py的代碼:

from flask import Flask, g

from .db import RedisClient

__all__ = ["app"]

app = Flask(__name__)


def get_conn():
    """
    Opens a new redis connection if there is none yet for the
    current application context.
    """
    if not hasattr(g, "redis_client"):
        g.redis_client = RedisClient()
    return g.redis_client


@app.route("/")
def index():
    return "

Welcome to Proxy Pool System

" @app.route("/get") def get_proxy(): """ Get a proxy """ conn = get_conn() return conn.pop() @app.route("/count") def get_counts(): """ Get the count of proxies """ conn = get_conn() return str(conn.queue_len) if __name__ == "__main__": app.run()

不難看出,在api.py中利用了flask框架的特性定義了各種接口。

具體代碼實現(xiàn)請參考github。

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42764.html

相關文章

  • Python3網(wǎng)絡爬蟲實戰(zhàn)---6、Web庫的安裝:Flask、Tornado

    摘要:在本書中用到的一些服務程序主要有。本節(jié)來分別介紹它們的安裝方法。的安裝是一個輕量級的服務程序,簡單易用靈活,在本書中我們主要用它來做一些服務,本節(jié)我們來了解下它的安裝方式。相關鏈接官方文檔安裝執(zhí)行完畢之后即可完成安裝。 上一篇文章:Python3網(wǎng)絡爬蟲實戰(zhàn)---5、存儲庫的安裝:PyMySQL、PyMongo、RedisPy、RedisDump下一篇文章:Python3網(wǎng)絡爬蟲實戰(zhàn)-...

    yeyan1996 評論0 收藏0
  • 使用代理處理反爬抓取微信文章

    摘要:目標使用代理反爬抓取微信文章,獲取文章標題內(nèi)容公眾號等信息,并存儲到數(shù)據(jù)庫中。代理設置在使用維護動態(tài)代理池一文中,我們講解了代理池的基本原理和簡單實現(xiàn),代碼已托管到上,現(xiàn)在讓我們利用代理池來獲取隨機代理。 目標 使用代理反爬抓取微信文章,獲取文章標題、內(nèi)容、公眾號等信息,并存儲到MongoDB數(shù)據(jù)庫中。 流程框架 如果要抓取微信公眾號文章可以使用搜狗的搜索引擎,它會顯示最新的文章,但是...

    QiShare 評論0 收藏0
  • 面向?qū)ο蟮姆植际脚老x框架XXL-CRAWLER

    摘要:面向?qū)ο蟮姆植际脚老x框架一簡介概述是一個面向?qū)ο蟮姆植际脚老x框架。分布式集群集群方式維護爬蟲爬蟲運行數(shù)據(jù),可通過或定制實現(xiàn)。 《面向?qū)ο蟮姆植际脚老x框架XXL-CRAWLER》 showImg(https://segmentfault.com/img/remote/1460000011842697);showImg(https://segmentfault.com/img/remote...

    anquan 評論0 收藏0
  • Python-爬蟲工程師-面試總結(jié)

    摘要:內(nèi)存池機制提供了對內(nèi)存的垃圾收集機制,但是它將不用的內(nèi)存放到內(nèi)存池而不是返回給操作系統(tǒng)。為了加速的執(zhí)行效率,引入了一個內(nèi)存池機制,用于管理對小塊內(nèi)存的申請和釋放。 注:答案一般在網(wǎng)上都能夠找到。1.對if __name__ == main的理解陳述2.python是如何進行內(nèi)存管理的?3.請寫出一段Python代碼實現(xiàn)刪除一個list里面的重復元素4.Python里面如何拷貝一個對象?...

    antz 評論0 收藏0

發(fā)表評論

0條評論

vibiu

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<