對於HTTP代理池的維護,可以從以下幾個方面入手:
1.驗證HTTP代理的可用性
可以透過requests庫向目標網站傳送請求,判斷HTTP代理是否能夠成功返回響應。如果返回成功,則說明HTTP代理可用,否則說明HTTP代理已失效。可以在程式碼中設定超時時間,避免長時間等待無響應的HTTP代理。
import requests def check_proxy(proxy): try: response = requests.get(url, proxies=proxy, timeout=3) if response.status_code == 200: return Trueexcept: passreturn False
2.更新HTTP代理池
可以透過定期爬取HTTP代理網站或者購買付費HTTP代理服務來獲取新的HTTP代理。可以使用requests庫向HTTP代理網站傳送請求,獲取HTML頁面,並使用BeautifulSoup庫解析HTML頁面,從而獲取HTTP代理資訊。透過一定的篩選規則,可以將新獲取的HTTP代理加入到HTTP代理池中。
import requests from bs4 import BeautifulSoup def get_proxies(): url = ' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' } response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') table = soup.find('table', {'id': 'ip_list'}) tr_list = table.find_all('tr') proxies = [] for tr in tr_list[1:]: td_list = tr.find_all('td') ip = td_list[1].text port = td_list[2].text protocol = td_list[5].text.lower() proxy = '{}://{}:{}'.format(protocol, ip, port) proxies.append(proxy) return proxies
3.維護HTTP代理的質量
可以透過一些指標來衡量HTTP代理的質量,比如連線速度、響應時間、訪問成功率等。可以定時對HTTP代理進行評估,篩選出質量較好的IP,並從HTTP代理池中刪除質量較差的IP。
import requests from multiprocessing import Pool from functools import partial def check_proxy_quality(proxy): try: response = requests.get(url, proxies=proxy, timeout=3) if response.status_code == 200: return True, response.elapsed.total_seconds() except: passreturn False, Nonedef evaluate_proxies(proxies): pool = Pool(processes=8) results = pool.map(partial(check_proxy_quality), proxies) pool.close() pool.join() quality_proxies = [] for proxy, result in zip(proxies, results): is_valid, response_time = result if is_valid: quality_proxies.append((proxy, response_time)) return quality_proxies
4.監控HTTP代理的使用情況
對於監控HTTP代理的使用情況,一種比較簡單的方法是記錄每個HTTP代理的使用次數和成功率,以便及時發現哪些HTTP代理不再可用或者質量較差。
可以使用Python內建的shelve模組,將HTTP代理的使用情況儲存在一個本地檔案中。shelve模組可以提供類似字典的資料儲存方式,方便快捷地讀取和寫入資料。
以下是一個簡單的示例程式碼:
import shelve class ProxyManager: def __init__(self, filename='proxies.db'): self.filename = filename self.proxies = shelve.open(filename, writeback=True) if not self.proxies.get('used_proxies'): self.proxies['used_proxies'] = {} def mark_as_used(self, proxy): if proxy in self.proxies: self.proxies[proxy]['used_times'] += 1 self.proxies[proxy]['success_rate'] = self.proxies[proxy]['success_times'] / self.proxies[proxy]['used_times'] else: self.proxies[proxy] = {'used_times': 1, 'success_times': 0, 'success_rate': 0} self.proxies['used_proxies'][proxy] = True def mark_as_success(self, proxy): if proxy in self.proxies: self.proxies[proxy]['success_times'] += 1 self.proxies[proxy]['success_rate'] = self.proxies[proxy]['success_times'] / self.proxies[proxy]['used_times'] else: self.proxies[proxy] = {'used_times': 1, 'success_times': 1, 'success_rate': 1} self.proxies['used_proxies'][proxy] = True def is_used(self, proxy): return self.proxies['used_proxies'].get(proxy) def close(self): self.proxies.close()
在使用HTTP代理進行網路請求時,可以先檢查該HTTP代理是否已被使用過。如果該HTTP代理已被使用過,則不再使用該HTTP代理。如果該HTTP代理未被使用過,則使用該HTTP代理進行網路請求,並在請求成功或失敗後,更新該HTTP代理的使用情況。
以下是一個簡單的示例程式碼:
def get_page(url, proxy_manager): for i in range(3): proxy = get_proxy(proxy_manager) if proxy: try: response = requests.get(url, proxies={'http': proxy, 'https': proxy}, timeout=3) if response.status_code == 200: proxy_manager.mark_as_success(proxy) return response.text except: pass proxy_manager.mark_as_used(proxy) return None def get_proxy(proxy_manager): proxies = list(proxy_manager.proxies.keys()) for proxy in proxies: if not proxy_manager.is_used(proxy): return proxy return None
需要注意的是,shelve模組的寫入操作可能比較耗時,如果HTTP代理池較大,可以考慮每隔一段時間將HTTP代理使用情況儲存在本地檔案中,以提高效能。同時,如果HTTP代理池中存在較多已失效的HTTP代理,證明這個池子的IP可用率已經極低了,還是會更建議大傢伙使用優質廠商提供的HTTP代理。
正常情況下,很多人會說隨著經濟下行,能有使用的就已經不錯了, 還談什麼腳踏車,且不談免費的HTTP代理的連通性,實際上只要選對HTTP代理,採購的成本也會在我們的承受範圍內的。例如,此前我們蒐集了這幾家的動態共享HTTP代理:
注:動態短效代理有按時和按量之分,都已經幾種彙總了:
拿青果網路來說,29一個月,均攤到每天也就1塊錢,差不多是一瓶水的價格了。從業務結果的表現而言,也算可圈可點:
當然,我們選擇HTTP代理廠商都是基於各自業務的場景需求,不同場景所需的HTTP代理產品也不同,但各位可以測試了看看,所有的產品都要最紅應用到自身,才能知道效果如何。