国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

使用Redis+Flask維護(hù)動(dòng)態(tài)代理池

vibiu / 2865人閱讀

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

目標(biāo)

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

為什么要用代理池?

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

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

通過(guò)定時(shí)的檢測(cè)維護(hù)同樣可以得到多個(gè)可用代理。

代理池的要求?

多站抓取,異步檢測(cè)

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

提供接口,易于提取

代理池架構(gòu)?

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

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

從程序的入口run.py開(kāi)始分析:

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

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

if __name__ == "__main__":
    main()

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

調(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(),用來(lái)檢測(cè)代理是否可用,其中ValidityTester()方法中的test_single_proxy()方法是實(shí)現(xiàn)異步檢測(cè)的關(guān)鍵。
接著check_pool()方法里面?zhèn)魅肓巳齻€(gè)參數(shù):兩個(gè)代理池的上下界限,一個(gè)時(shí)間。其中PoolAdder()add_to_queue()方法中使用了一個(gè)從網(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框架的特性定義了各種接口。

具體代碼實(shí)現(xiàn)請(qǐng)參考github。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/42764.html

相關(guān)文章

  • Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---6、Web庫(kù)的安裝:Flask、Tornado

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

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

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

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

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

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

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

    antz 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<