摘要:目標(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
摘要:在本書(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)-...
摘要:目標(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ì)顯示最新的文章,但是...
摘要:面向?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...
摘要:內(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ì)象?...
閱讀 1125·2021-11-24 10:21
閱讀 2561·2021-11-19 11:35
閱讀 1662·2019-08-30 15:55
閱讀 1293·2019-08-30 15:54
閱讀 1192·2019-08-30 15:53
閱讀 3498·2019-08-29 17:21
閱讀 3308·2019-08-29 16:12
閱讀 3412·2019-08-29 15:23