在爬蟲的過程中若爬取速度過快可能會導緻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檔案名 上面先跑一遍代理池 (用多程序寫的) 不會報錯