爬虫代理
前言
花了幾天時間寫了一個比較完整的爬蟲代理模塊,基本上實現了一個比較完整的代理系統。
有如下幾大模塊:
- ip的獲取模塊
- 檢驗及刪除更新
- requests循環請求
ip的獲取
ip來源:http://www.xicidaili.com/wt/
通過遍歷西刺代理中的四個頁面獲取ip,然后對ip有效性進行檢驗,將有效的ip寫入文件。這里需要注意一下,西刺代理有效的ip一般都在前面,后面基本都是失效了的,我選擇每個頁面的前30條ip地址來檢驗,后面的直接舍棄。
ip的檢驗
通過傳入的proxy(‘http://123.123.123’),利用需要爬取的網站作為目標網站,發送requests請求來實現ip有效性的檢驗。
在檢驗ip有效性的過程中,我發現了這樣一個有趣的現象,同一批ip對不同網站的訪問速度不同(排除了網站本身的訪問速度原因)。打個比方,有A、B兩個網站他們的服務器配置是一樣的,但是a、b、c、d四個ip從發送請求到相應這中間的時間卻是不一樣的。
所以,建議檢驗ip有效性時采用目標網站比較合適
刪除ip
刪除ip這塊相對而言簡單一些,讀取文件–>刪除舊文件–>刪除ip列表中的失效ip–>將ip列表寫入文件。
#刪除proxydef deleteProxy(self,proxy):print('刪除無效proxy:{}'.format(proxy))f = open('ip.txt', 'r', encoding='utf-8')proxy_list = f.readlines()f.close()#刪除列表中的換行符號proxy_list = [proxy.replace('\n','') for proxy in proxy_list]#刪除原文件os.remove('ip.txt')#刪除指定的proxyproxy_list.remove(proxy)#當文件為空時,重新下載文件if len(proxy_list)==0:print('現在列表為空,我們將重新獲取ip')#調用父類下載新的ip文件super().getIpFile()#將信息重新寫入文件f = open('ip.txt', 'a+', encoding='utf-8')for each in proxy_list:f.write(each+'\n')f.close()ip文件的自動更新機制
簡單點來說就是在刪除失效ip后檢測文件是否為空,為空時,再次從互聯網上下載一批新的ip
#刪除指定的proxyproxy_list.remove(proxy)#當文件為空時,重新下載文件if len(proxy_list)==0:print('現在列表為空,我們將重新獲取ip')#調用父類下載新的ip文件super().getIpFile()requests循環請求
利用while構造一個死循環,只有在requests請求成功時,打破死循環的代碼(flag=False)才會被執行,當然每一次循環都會采用新的IP地址以及headers
flag=True while (flag!=False):try:try:#設置代理ipproxy = self.createRandomIp()#設置proxiesproxies = {'{}'.format(self.ip_stype):proxy}#設置代理headersheaders = {'User-Agent':str(UserAgent().random)}req = requests.get(self.url, proxies=proxies, headers=headers, verify=False, timeout=(9,21))flag=Falseexcept Exception as e:print('上一次請求失敗,10秒后我們將進行下一次請求')print("上一次requests請求失敗的原因是{}".format(e))print('上一次請求的代理ip為:{}'.format(proxy))time.sleep(10)#驗證proxy的有效性,并對無效proxy進行處理proxy = self.verifyProxy(proxy)#設置proxiesproxies = {'{}'.format(self.ip_stype):proxy}#設置代理headersheaders = {'User-Agent':str(UserAgent().random)}req = requests.get(self.url, proxies=proxies, headers=headers, verify=False, timeout=(9,21))flag=Falseexcept:pass備注
考慮到短時間多次訪問一個網站可能會被識別出來,故在第一次發送requests請求時是不檢驗ip的有效性,如果請求出錯則10秒后會對該ip進行驗證,中間間隔10秒是考慮到網絡信號的影響。如果檢驗到ip失效則會將其從ip文件中刪除。
在刪除失效ip后,會重新分配一個ip并對其有效性進行檢驗,無效則刪除,重新分配ip直至分配的ip通過檢驗,采用的是遞歸算法。
在requests請求這一塊,也具有相同的思想,不斷發送requests請求直至成功,采用while構造死循環。
總結
- 上一篇: 知识点讲解二:关于requests里的t
- 下一篇: 更新pip到指定版本