摘要:目標爬蟲中經常遇到被封殺的情況最有效的方式就是使用代理。為什么要用代理池許多網站有專門的反爬蟲措施,可能遇到封等問題。通過定時的檢測維護同樣可以得到多個可用代理。
目標
爬蟲中經常遇到被封殺IP的情況,最有效的方式就是使用代理IP。我們可以在一些平臺上購買代理IP,但是價格比較昂貴。另外很多IP代理網站也提供了一些免費的代理IP,可以爬取下這些代理IP,并使用webAPI方式提供代理IP服務。
為什么要用代理池?許多網站有專門的反爬蟲措施,可能遇到封IP等問題。
互聯網上公開了大量免費代理,利用好資源。
通過定時的檢測維護同樣可以得到多個可用代理。
代理池的要求?多站抓取,異步檢測
定時篩選,持續更新
提供接口,易于提取
代理池架構? 代理池的實現項目完整代碼已托管到github:https://github.com/panjings/p...
項目結構如下:
從程序的入口run.py開始分析:
from proxypool.api import app from proxypool.schedule import Schedule def main(): s = Schedule() // 運行調度器 s.run() // 運行接口 app.run() if __name__ == "__main__": main()
從run.py中不難看出,首先運行了一個調度器,接著運行了一個接口。
調度器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()方法是實現異步檢測的關鍵。
接著check_pool()方法里面傳入了三個參數:兩個代理池的上下界限,一個時間。其中PoolAdder()的add_to_queue()方法中使用了一個從網站抓取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框架的特性定義了各種接口。
具體代碼實現請參考github。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/42764.html
摘要:在本書中用到的一些服務程序主要有。本節來分別介紹它們的安裝方法。的安裝是一個輕量級的服務程序,簡單易用靈活,在本書中我們主要用它來做一些服務,本節我們來了解下它的安裝方式。相關鏈接官方文檔安裝執行完畢之后即可完成安裝。 上一篇文章:Python3網絡爬蟲實戰---5、存儲庫的安裝:PyMySQL、PyMongo、RedisPy、RedisDump下一篇文章:Python3網絡爬蟲實戰-...
摘要:目標使用代理反爬抓取微信文章,獲取文章標題內容公眾號等信息,并存儲到數據庫中。代理設置在使用維護動態代理池一文中,我們講解了代理池的基本原理和簡單實現,代碼已托管到上,現在讓我們利用代理池來獲取隨機代理。 目標 使用代理反爬抓取微信文章,獲取文章標題、內容、公眾號等信息,并存儲到MongoDB數據庫中。 流程框架 如果要抓取微信公眾號文章可以使用搜狗的搜索引擎,它會顯示最新的文章,但是...
摘要:面向對象的分布式爬蟲框架一簡介概述是一個面向對象的分布式爬蟲框架。分布式集群集群方式維護爬蟲爬蟲運行數據,可通過或定制實現。 《面向對象的分布式爬蟲框架XXL-CRAWLER》 showImg(https://segmentfault.com/img/remote/1460000011842697);showImg(https://segmentfault.com/img/remote...
摘要:內存池機制提供了對內存的垃圾收集機制,但是它將不用的內存放到內存池而不是返回給操作系統。為了加速的執行效率,引入了一個內存池機制,用于管理對小塊內存的申請和釋放。 注:答案一般在網上都能夠找到。1.對if __name__ == main的理解陳述2.python是如何進行內存管理的?3.請寫出一段Python代碼實現刪除一個list里面的重復元素4.Python里面如何拷貝一個對象?...
閱讀 1131·2021-11-24 10:21
閱讀 2570·2021-11-19 11:35
閱讀 1671·2019-08-30 15:55
閱讀 1298·2019-08-30 15:54
閱讀 1200·2019-08-30 15:53
閱讀 3511·2019-08-29 17:21
閱讀 3312·2019-08-29 16:12
閱讀 3422·2019-08-29 15:23