摘要:目標爬蟲中經(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
摘要:在本書中用到的一些服務程序主要有。本節(jié)來分別介紹它們的安裝方法。的安裝是一個輕量級的服務程序,簡單易用靈活,在本書中我們主要用它來做一些服務,本節(jié)我們來了解下它的安裝方式。相關鏈接官方文檔安裝執(zhí)行完畢之后即可完成安裝。 上一篇文章:Python3網(wǎng)絡爬蟲實戰(zhàn)---5、存儲庫的安裝:PyMySQL、PyMongo、RedisPy、RedisDump下一篇文章:Python3網(wǎng)絡爬蟲實戰(zhàn)-...
摘要:目標使用代理反爬抓取微信文章,獲取文章標題內(nèi)容公眾號等信息,并存儲到數(shù)據(jù)庫中。代理設置在使用維護動態(tài)代理池一文中,我們講解了代理池的基本原理和簡單實現(xiàn),代碼已托管到上,現(xiàn)在讓我們利用代理池來獲取隨機代理。 目標 使用代理反爬抓取微信文章,獲取文章標題、內(nèi)容、公眾號等信息,并存儲到MongoDB數(shù)據(jù)庫中。 流程框架 如果要抓取微信公眾號文章可以使用搜狗的搜索引擎,它會顯示最新的文章,但是...
摘要:面向?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...
摘要:內(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里面如何拷貝一個對象?...
閱讀 1156·2021-11-24 10:21
閱讀 2589·2021-11-19 11:35
閱讀 1691·2019-08-30 15:55
閱讀 1323·2019-08-30 15:54
閱讀 1220·2019-08-30 15:53
閱讀 3533·2019-08-29 17:21
閱讀 3329·2019-08-29 16:12
閱讀 3442·2019-08-29 15:23