对于HTTP代理池的维护,可以从以下几个方面入手:
1.验证HTTP代理的可用性
可以通过requests库向目标网站发送请求,判断HTTP代理是否能够成功返回响应。如果返回成功,则说明HTTP代理可用,否则说明HTTP代理已失效。可以在代码中设置超时时间,避免长时间等待无响应的HTTP代理。
importrequestsdefcheck_proxy(proxy): try: response=requests.get(url, proxies=proxy, timeout=3) ifresponse.status_code==200: returnTrueexcept: passreturnFalse
2.更新HTTP代理池
可以通过定期爬取HTTP代理网站或者购买付费HTTP代理服务来获取新的HTTP代理。可以使用requests库向HTTP代理网站发送请求,获取HTML页面,并使用BeautifulSoup库解析HTML页面,从而获取HTTP代理信息。通过一定的筛选规则,可以将新获取的HTTP代理加入到HTTP代理池中。
importrequestsfrombs4importBeautifulSoupdefget_proxies(): url='http://www.xicidaili.com/nn/'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= [] fortrintr_list[1:]: td_list=tr.find_all('td') ip=td_list[1].textport=td_list[2].textprotocol=td_list[5].text.lower() proxy='{}://{}:{}'.format(protocol, ip, port) proxies.append(proxy) returnproxies
3.维护HTTP代理的质量
可以通过一些指标来衡量HTTP代理的质量,比如连接速度、响应时间、访问成功率等。可以定时对HTTP代理进行评估,筛选出质量较好的IP,并从HTTP代理池中删除质量较差的IP。
importrequestsfrommultiprocessingimportPoolfromfunctoolsimportpartialdefcheck_proxy_quality(proxy): try: response=requests.get(url, proxies=proxy, timeout=3) ifresponse.status_code==200: returnTrue, response.elapsed.total_seconds() except: passreturnFalse, Nonedefevaluate_proxies(proxies): pool=Pool(processes=8) results=pool.map(partial(check_proxy_quality), proxies) pool.close() pool.join() quality_proxies= [] forproxy, resultinzip(proxies, results): is_valid, response_time=resultifis_valid: quality_proxies.append((proxy, response_time)) returnquality_proxies
4.监控HTTP代理的使用情况
对于监控HTTP代理的使用情况,一种比较简单的方法是记录每个HTTP代理的使用次数和成功率,以便及时发现哪些HTTP代理不再可用或者质量较差。
可以使用Python内置的shelve模块,将HTTP代理的使用情况保存在一个本地文件中。shelve模块可以提供类似字典的数据存储方式,方便快捷地读取和写入数据。
以下是一个简单的示例代码:
importshelveclassProxyManager: def__init__(self, filename='proxies.db'): self.filename=filenameself.proxies=shelve.open(filename, writeback=True) ifnotself.proxies.get('used_proxies'): self.proxies['used_proxies'] = {} defmark_as_used(self, proxy): ifproxyinself.proxies: self.proxies[proxy]['used_times'] +=1self.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] =Truedefmark_as_success(self, proxy): ifproxyinself.proxies: self.proxies[proxy]['success_times'] +=1self.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] =Truedefis_used(self, proxy): returnself.proxies['used_proxies'].get(proxy) defclose(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代理:
注:动态短效代理有按时和按量之分,都已经几种汇总了:
HTTP代理类型 |
分类 |
代表厂商 |
白名单数 |
基础套餐 (元/月) |
平均IP单价 (元/IP) |
|
动态短效HTTP代理 |
按时计费 |
以IP通道为增量 |
青果网络 |
256 |
29 |
0.0006 |
小象代理 |
5 |
109 |
0.0050 |
|||
以每日IP量为增量 |
巨量代理 |
5 |
155 |
0.0049 |
||
豌豆代理 |
5 |
300 |
0.0025 |
|||
讯代理 |
1 |
210 |
0.0583 |
|||
品易代理 |
20 |
120 |
0.0070 |
|||
芝麻代理 |
5 |
360 |
0.0182 |
|||
按量计费 |
/ |
青果网络 |
256 |
30 |
0.0030 |
|
豌豆代理 |
5 |
200 |
0.0200 |
|||
小象代理 |
5 |
100 |
0.0100 |
|||
巨量代理 |
5 |
75 |
0.0140 |
|||
品易代理 |
20 |
100 |
0.0100 |
|||
芝麻代理 |
5 |
420 |
0.0420 |
拿青果网络来说,29一个月,均摊到每天也就1块钱,差不多是一瓶水的价格了。从业务结果的表现而言,也算可圈可点:
当然,我们选择HTTP代理厂商都是基于各自业务的场景需求,不同场景所需的HTTP代理产品也不同,但各位可以测试了看看,所有的产品都要最红应用到自身,才能知道效果如何。