亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

Redis教程之代理ip池設計方法詳細說明

2020-02-17 14:54:33
字體:
來源:轉載
供稿:網友

本文講述的是Redis教程之代理ip池設計方法詳細說明,文中給出了詳細的介紹與示例代碼,相信對大家的理解和學習具有一定的參考借鑒價值,有需要的朋友們下面和武林技術頻道的小編來一起看看吧。

前言

眾所周知代理 ip 因為配置簡單而且廉價,經常用來作為反反爬蟲的手段,但是穩定性一直是其詬病。篩選出優質的代理 ip 并不簡單,即使付費購買的代理 ip 源,賣家也不敢保證 100% 可用;另外代理 ip 的生命周期也無法預知,可能上一秒能用,下一秒就撲街了。基于這些原因,會給使用代理 ip 的爬蟲程序帶來很多不穩定的因素。要排除代理 ip 的影響,通常的做法是建一個代理 ip 池,每次請求前來池子取一個 ip,用完之后歸還,保證池子里的 ip 都是可用的。本文接下來就探討一下,如何使用 Redis 構建代理 ip 池,實現自動更新,自動擇優。

整體流程

由上圖所示,左側是形成了整個流程的閉環,從爬蟲程序以獨占的方式拿到一個代理 ip 到爬取完成歸還 ip。這個流程其實是不太嚴謹的,如果爬蟲程序異常中斷,就會導致 ip 無法歸還,就會導致這個 ip 無法循環利用。但是由于代理 ip 本身的特點,量多而且循環利用的價值并不大,所以這種情況就let it go。

上面也提到 ip 是以獨占的方式獲取,如果是去爬兩個毫不相關的網站,本來一個 ip 就可以,可現在需要兩個。為了資源最大化使用,這里引入了頻道 ip 池和總代理 ip 池。兩個網站就當做兩個頻道,各自獨占,互不相關;總池子就是保存所有的 ip,每個頻道都共享。假設只有一個 ip:1.1.1.1 在總池子,爬 A 網站會把它從總池子取到 A 頻道的 ip 池,然后 A 爬蟲程序從 A 頻道 ip 池取出 1.1.1.1 進行使用,這時 1.1.1.1 依然在總池子里,但 A 頻道的 ip 池已經不包含 1.1.1.1 了;爬 B 網站也是一樣的流程拿到 1.1.1.1,只是從 B 自己的頻道池獲取。下面就詳細說說總池子和頻道池子。

總代理 ip 池

總池子的作用就是共享所有可用的 ip,但是僅作為存儲 ip 的池子并不能實現自動擇優啊,這里的擇優通常是希望延遲低速度快的 ip 更容易被篩選出,所以我們希望池子中的 ip 是根據它們的延時升序排列,借助 Redis 的 Sorted Sets 數據結構即可實現,用延時表示 score,ip 表示 member。

使用 ZADD 添加新 ip 或更新 ip 的延遲:

> ZADD proxy_global_ips 200 1.1.1.1:8080 100 2.2.2.2:80 300 3.3.3.3:8888(integer) 3

使用 ZRANGE 獲取 ip,可以指定獲取的個數,比如取兩個:

> ZRANGE proxy_global_ips 0 1 WITHSCORES1) "2.2.2.2:80" 2) "100" 3) "1.1.1.1:8080" 4) "200" 

頻道 ip 池

頻道 ip 池的作用是為了最大化使用總池子中的 ip,并且隔離其他頻道的 ip 池。由于一個 ip 使用次數過多是有很大的概率被目標網站屏蔽掉,所以這里也需要進行擇優,應該優先篩選出使用次數少的 ip,同理也是使用 Sorted Sets,使用次數表示 score,ip 表示 member,這里與總池子明顯的不同之處是 key 不是固定的,需要把頻道名稱組合進去,這樣保證頻道之間的隔離,如頻道 abc 的 key:proxy_channel_abc_ips。

由于頻道池子中的 ip 是要以獨占的方式取出,我們需要一個 ZPOP 的方法,奈何 Redis 本身沒有,還好可以通過 Lua 模擬,在一個原子操作下取出 ip,然后刪除:

> eval "local el = redis.call('zrange', KEYS[1], 0, 0, 'WITHSCORES'); redis.call('zrem', KEYS[1], el[1]); return el;" 1 proxy_channel_abc_ips

往頻道 ip 池添加 ip:

> ZADD proxy_channel_abc_ips INCR 0 1.1.1.1:8080

這里與總池子不同的是多了一個 INCR 選項,這是 Redis 3.0.2 版本后才支持的新特性,即指定在 ZADD 時發生 member 沖突采取的處理方式,INCR 顧名思義是沖突后累加 score 的方式,為什么要用這個選項,看看下面這個流程:

  1. 在頻道池子中只有 1.1.1.1,使用次數為 10;總池子也有 1.1.1.1,而且排在第一個
  2. 線程 A 取出 1.1.1.1
  3. 線程 B 從頻道池子取 ip,沒取到,從總池子補充 ip 到頻道池子:ZADD proxy_channel_abc_ips 0 1.1.1.1;取出 1.1.1.1
  4. 線程 A 歸還 1.1.1.1:ZADD proxy_channel_abc_ips 11 1.1.1.1
  5. 線程 B 歸還 1.1.1.1:ZADD proxy_channel_abc_ips 1 1.1.1.1

第 5 步結束后,ip 1.1.1.1 的計數被錯誤地重置為 1,而不是我們預期的 12。使用 INCR 選項就可以避免這個尷尬,其實這也只能保證最終計數正確,中途還是會有些非預期的情況,如:

  1. 在頻道池子中有 1.1.1.1,使用次數為 10,還有 2.2.2.2,使用次數為 2;總池子也有 1.1.1.1,而且排在第一個
  2. 線程 A 取出 1.1.1.1
  3. 線程 B 取出 2.2.2.2
  4. 線程 C 從頻道池子取 ip,沒取到,從總池子補充 ip 到頻道池子:ZADD proxy_channel_abc_ips 0 1.1.1.1;取出 1.1.1.1
  5. 線程 C 歸還 1.1.1.1:ZADD proxy_channel_abc_ips INCR 1 1.1.1.1
  6. 線程 B 歸還 2.2.2.2:ZADD proxy_channel_abc_ips INCR 3 2.2.2.2
  7. 線程 D 來池子取 ip,按使用次數少的被分配了 1.1.1.1,這就不是我們期望的,1.1.1.1 實際已經用了 12 次,我們更希望 2.2.2.2 被取出

如果要避免這個問題,一個簡單粗暴的辦法就是增加頻道池子的容量,讓 ip 數永遠大于并發的線程數。

更新

與 ip 有關的兩個屬性:延時(爬取頁面所花的時間)和使用次數。上面只講到了根據它們自動擇優,這里的就來說下它們是如何更新的。延時和使用次數的更新需要爬蟲程序的配合,程序中要記錄時間和遞增使用次數,在歸還 ip 時要將最新值帶回給總池子和頻道池子。上面頻道 ip 池的例子也有提及,每次歸還 ip 都要將最新的使用次數帶上,其次還要將 ip 的延時更新到總池子里面。如果歸還 ip 時出現使用失敗的情況,就要將該 ip 從總池子里刪除掉,保證該 ip 不會再被使用,至于當前的頻道池不用歸還就行了。其他頻道池不作任何處理,因為 ip 在當前頻道不可用,一般都是因為被屏蔽,其他頻道依然可以使用,即使確實都不能使用,也會在其他頻道歸還 ip 時被刪除。

這兩個屬性其實也可以都在 Redis 中更新,在獲取 ip 時,使用 Hashs 保存 ip 對應的獲取時間和使用次數;在歸還時從 Hashs 中取出時間計算出延時,取出使用次數并加 1,再分別更新到總池子和頻道池子中。而且這還能避免上面提到的獲取 ip 不符合預期的問題。

總結

放在 Redis 中更新的方法也有弊端,延時會包含獲取和歸還的傳輸時間,如果爬蟲程序獲取一個 ip 多次使用,會造成使用次數統計偏少。當然也可以通過在程序中多次調用 Redis 更新 ip 的屬性來解決,這樣增加了整個流程的復雜性,需要自己權衡。

個人還是傾向在程序中記錄,最后更新到 Redis 中。這個方案邏輯確實不夠嚴謹,但是出現問題也不會導致嚴重后果。程序的健壯性也不是不允許出現 bug,而是出現 bug 有很好的容錯性。

以上就是Redis教程之代理ip池設計方法詳細說明了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以在武林技術頻道留言區交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品一区二区久久国产| 欧美视频国产精品| 国产成人短视频| 亚洲国产日韩一区| 一区二区亚洲欧洲国产日韩| 亚洲肉体裸体xxxx137| 超碰精品一区二区三区乱码| 性色av一区二区咪爱| 九色精品美女在线| 亚洲韩国青草视频| 亚洲国产第一页| 精品国偷自产在线视频99| 日韩中文字幕亚洲| 色噜噜狠狠狠综合曰曰曰88av| 色七七影院综合| 亚洲电影中文字幕| 国产精品久久久精品| 日韩欧美一区视频| 国产美女精品免费电影| 国产精品老牛影院在线观看| 日韩www在线| 久久视频在线视频| 久久久久久国产免费| 黑人精品xxx一区| 亚洲香蕉伊综合在人在线视看| 欧美裸体xxxxx| 日韩中文字幕网址| 日韩av网站在线| 亚洲精品乱码久久久久久按摩观| 中文字幕精品在线视频| 欧美激情视频网站| 欧美高清videos高潮hd| 精品丝袜一区二区三区| 最近2019年日本中文免费字幕| 久久国产精品影片| 日韩在线视频导航| 精品久久久国产精品999| 国产精品羞羞答答| 精品国产一区av| 久久亚洲国产成人| 亚洲精品videossex少妇| 国产视频精品自拍| 在线播放国产一区中文字幕剧情欧美| 国产成人精品网站| 亚洲欧美制服第一页| 国产精品永久免费在线| 国产精品扒开腿做| 精品亚洲aⅴ在线观看| 91久久精品久久国产性色也91| 国产97色在线| 日韩av在线免费观看一区| 国产精品久久在线观看| 欧美激情小视频| 亚洲成人1234| 亚洲精品日韩激情在线电影| www.日本久久久久com.| 欧美一区二区三区图| 国产日韩亚洲欧美| 蜜月aⅴ免费一区二区三区| 国产一区二区三区中文| xvideos亚洲| 日韩欧美亚洲一二三区| 久热精品视频在线免费观看| 欧美高清自拍一区| 欧美日产国产成人免费图片| 午夜精品一区二区三区在线| 91精品国产91久久久久久久久| 亚洲无线码在线一区观看| 欧美性猛交xxxx乱大交| 日韩精品视频中文在线观看| 91av视频在线免费观看| 日韩欧美一区视频| 操人视频在线观看欧美| 正在播放欧美视频| 国产精品高精视频免费| 啊v视频在线一区二区三区| 日韩在线观看网址| 91免费看片在线| 欧美成人性生活| 国产欧美一区二区白浆黑人| 亚洲国产欧美一区| 26uuu另类亚洲欧美日本老年| 午夜精品免费视频| 久久综合久久八八| 国产+人+亚洲| 中文字幕亚洲欧美日韩2019| 日韩av电影中文字幕| 日韩欧美国产一区二区| 欧美在线亚洲在线| 亚洲人成电影在线观看天堂色| 精品国产一区二区三区久久久狼| 日韩美女视频中文字幕| 国产主播在线一区| 亚洲国产精品va在线看黑人| 不卡中文字幕av| 欧美日本黄视频| 欧美日韩亚洲视频| 在线a欧美视频| 亚洲精品视频在线观看视频| 久久久久九九九九| 日韩视频免费在线观看| 亚洲国产精品推荐| 亚洲已满18点击进入在线看片| 国产成人啪精品视频免费网| 精品自拍视频在线观看| 国产精品成人品| 韩国欧美亚洲国产| 亚洲欧美一区二区三区情侣bbw| 日韩中文字幕在线观看| 久久久久久999| 国产精品99免视看9| 久久天天躁狠狠躁夜夜躁| 亚洲国产精品成人一区二区| 欧洲日本亚洲国产区| 97在线视频国产| 亚洲欧洲在线看| 亚洲精品v欧美精品v日韩精品| 国产精品视频网址| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲天堂免费视频| 亚洲男人天堂九九视频| 国产一区二区三区日韩欧美| 国产成人福利夜色影视| 亚洲欧美日韩中文视频| 91沈先生作品| 国产精品手机播放| 日韩黄色高清视频| 亚洲欧美制服丝袜| 精品视频9999| 亚洲一区制服诱惑| 亚洲free嫩bbb| 亚洲综合精品一区二区| 中文字幕久久久av一区| 国产aaa精品| 久久久成人av| 欧美精品video| 国产91网红主播在线观看| 欧美激情一区二区三区久久久| 欧美亚洲国产另类| 国产午夜精品视频免费不卡69堂| 欧美激情三级免费| 97香蕉久久超级碰碰高清版| 亚洲精品视频在线观看视频| 国产精品aaa| 欧美性猛交xxxx黑人| 97热在线精品视频在线观看| 国产剧情久久久久久| 久久久久久香蕉网| 久久精视频免费在线久久完整在线看| 亚洲网站视频福利| 日韩欧美亚洲国产一区| 日韩精品欧美激情| 国产欧美一区二区三区在线| 成人免费视频97| 精品视频久久久久久久| 亚洲第一区中文99精品| 777国产偷窥盗摄精品视频| 国产精品一区专区欧美日韩| 91爱爱小视频k| 在线观看中文字幕亚洲| 国产一区二区三区网站| 国内成人精品一区| 成人激情免费在线| 精品国产电影一区|