天天看點

【python_爬蟲】【代理池輔助接口】連接配接爬蟲部分代碼和IP代理池的輔助橋梁子產品

在爬蟲的過程中若爬取速度過快可能會導緻IP位址被封,短時間内無法再去通路想要爬取的網站資訊内容。

這時候我們就要去代理池子產品中調取代理,若出現再次被封的情況再去從代理池中擷取新的代理,如此循環。

但如果每次爬蟲都要複寫一段這樣的調取代碼,那為什麼不做成一個子產品後期使用引入呢?代理池輔助接口便由此誕生

思路:

根據前面分析該類中需有以下三種方法:

1.連接配接代理池,從代理池中把可用的IP代理位址以清單形式存儲起來;

2.擷取代理清單的首個代理作為初始代理IP;

3.檢測到目前代理失效或者被封無法傳回資訊時剔除該代理,并從清單中讀取下一個IP作為代理進行爬蟲

在這邊值得注意的是如果檢測到代理清單為空,也就是代理都用完了,就再去調用連接配接代理池擷取IP代理位址的子產品,重新生成新的代理池,這樣也就形成了一個閉合環,程式能夠無限循環不中斷。

具體代碼如下:

#導入IP代理池擷取IP子產品
from ip_pool import IP_Pool


class ProxyHelper(object):
    IP_poll = []
    #清單目前索引
    poll_index = 0
    def __init__(self):
        self.get_proxy_from_ip_pool()
        #初始化代理IP位址
        self.proxy = self.IP_poll[self.poll_index]

    #得到代理IP位址
    def get_proxy(self):
        print('目前使用的IP是:'+self.proxy)
        return self.proxy

    #更新代理IP位址
    def update_proxy(self):
        #移除目前被封IP
        self.IP_poll.remove(self.IP_poll[self.poll_index])
        #判斷IP清單是否為空
        if len(self.IP_poll):
            self.proxy = self.IP_poll[self.poll_index]
        else:
            self.get_proxy_from_ip_pool()
            self.proxy = self.IP_poll[self.poll_index]

    #從ip_pool接口得到可用IP位址清單
    def get_proxy_from_ip_pool(self):
        self.IP_poll = IP_Pool().ip_pool_func()


if __name__ == '__main__':
    ProxyHelper().update_proxy()
           

關于擷取測試代理ip可以跳轉至下面這個博文 :

https://blog.csdn.net/weixin_44354777/article/details/100803598

補充:多程序在Windows下運作必須從Main函數開始(if __name__ == '__main__'),否則會報錯。

建議處理方式:在 scrapy 中 建立 run xx.py 中 scrapy crawl py檔案名 上面先跑一遍代理池 (用多程序寫的) 不會報錯