Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9183
  • 博文数量: 22
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 230
  • 用 户 组: 普通用户
  • 注册时间: 2022-12-20 17:00
文章分类
文章存档

2024年(2)

2023年(20)

我的朋友
最近访客

分类: Python/Ruby

2023-03-01 14:55:29



对于HTTP代理池的维护,可以从以下几个方面入手:

1.验证HTTP代理的可用性

可以通过requests库向目标网站发送请求,判断HTTP代理是否能够成功返回响应。如果返回成功,则说明HTTP代理可用,否则说明HTTP代理已失效。可以在代码中设置超时时间,避免长时间等待无响应的HTTP代理。


点击(此处)折叠或打开

  1. import requests

  2. def check_proxy(proxy):
  3.     try:
  4.         response = requests.get(url, proxies=proxy, timeout=3)
  5.         if response.status_code == 200:
  6.             return Trueexcept:
  7.         passreturn False

2.更新HTTP代理池

可以通过定期爬取HTTP代理网站或者购买付费HTTP代理服务来获取新的HTTP代理。可以使用requests库向HTTP代理网站发送请求,获取HTML页面,并使用BeautifulSoup库解析HTML页面,从而获取HTTP代理信息。通过一定的筛选规则,可以将新获取的HTTP代理加入到HTTP代理池中。


点击(此处)折叠或打开

  1. import requests
  2. from bs4 import BeautifulSoup

  3. def get_proxies():
  4.     url = ''
  5.     headers = {
  6.         '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'
  7.     }
  8.     response = requests.get(url, headers=headers)
  9.     soup = BeautifulSoup(response.text, 'html.parser')
  10.     table = soup.find('table', {'id': 'ip_list'})
  11.     tr_list = table.find_all('tr')
  12.     proxies = []
  13.     for tr in tr_list[1:]:
  14.         td_list = tr.find_all('td')
  15.         ip = td_list[1].text
  16.         port = td_list[2].text
  17.         protocol = td_list[5].text.lower()
  18.         proxy = '{}://{}:{}'.format(protocol, ip, port)
  19.         proxies.append(proxy)
  20.     return proxies

3.维护HTTP代理的质量

可以通过一些指标来衡量HTTP代理的质量,比如连接速度、响应时间、访问成功率等。可以定时对HTTP代理进行评估,筛选出质量较好的IP,并从HTTP代理池中删除质量较差的IP。


点击(此处)折叠或打开

  1. import requests
  2. from multiprocessing import Pool
  3. from functools import partial

  4. def check_proxy_quality(proxy):
  5.     try:
  6.         response = requests.get(url, proxies=proxy, timeout=3)
  7.         if response.status_code == 200:
  8.             return True, response.elapsed.total_seconds()
  9.     except:
  10.         passreturn False, Nonedef evaluate_proxies(proxies):
  11.     pool = Pool(processes=8)
  12.     results = pool.map(partial(check_proxy_quality), proxies)
  13.     pool.close()
  14.     pool.join()

  15.     quality_proxies = []
  16.     for proxy, result in zip(proxies, results):
  17.         is_valid, response_time = result
  18.         if is_valid:
  19.             quality_proxies.append((proxy, response_time))
  20.     return quality_proxies

4.监控HTTP代理的使用情况

对于监控HTTP代理的使用情况,一种比较简单的方法是记录每个HTTP代理的使用次数和成功率,以便及时发现哪些HTTP代理不再可用或者质量较差。

可以使用Python内置的shelve模块,将HTTP代理的使用情况保存在一个本地文件中。shelve模块可以提供类似字典的数据存储方式,方便快捷地读取和写入数据。

代码如下:


点击(此处)折叠或打开

  1. import shelve
  2. class ProxyManager:
  3.     def __init__(self, filename='proxies.db'):
  4.         self.filename = filename
  5.         self.proxies = shelve.open(filename, writeback=True)
  6.         if not self.proxies.get('used_proxies'):
  7.             self.proxies['used_proxies'] = {}
  8.     def mark_as_used(self, proxy):
  9.         if proxy in self.proxies:
  10.             self.proxies[proxy]['used_times'] += 1
  11.             self.proxies[proxy]['success_rate'] = self.proxies[proxy]['success_times'] / self.proxies[proxy]['used_times']
  12.         else:
  13.             self.proxies[proxy] = {'used_times': 1, 'success_times': 0, 'success_rate': 0}
  14.         self.proxies['used_proxies'][proxy] = True
  15.     def mark_as_success(self, proxy):
  16.         if proxy in self.proxies:
  17.             self.proxies[proxy]['success_times'] += 1
  18.             self.proxies[proxy]['success_rate'] = self.proxies[proxy]['success_times'] / self.proxies[proxy]['used_times']
  19.         else:
  20.             self.proxies[proxy] = {'used_times': 1, 'success_times': 1, 'success_rate': 1}
  21.         self.proxies['used_proxies'][proxy] = True
  22.     def is_used(self, proxy):
  23.         return self.proxies['used_proxies'].get(proxy)
  24.     def close(self):
  25.         self.proxies.close()

在使用HTTP代理进行网络请求时,可以先检查该HTTP代理是否已被使用过。如果该HTTP代理已被使用过,则不再使用该HTTP代理。如果该HTTP代理未被使用过,则使用该HTTP代理进行网络请求,并在请求成功或失败后,更新该HTTP代理的使用情况。

代码如下:


点击(此处)折叠或打开

  1. def get_page(url, proxy_manager):
  2.     for i in range(3):
  3.         proxy = get_proxy(proxy_manager)
  4.         if proxy:
  5.             try:
  6.                 response = requests.get(url, proxies={'http': proxy, 'https': proxy}, timeout=3)
  7.                 if response.status_code == 200:
  8.                     proxy_manager.mark_as_success(proxy)
  9.                     return response.text
  10.             except:
  11.                 pass
  12.             proxy_manager.mark_as_used(proxy)
  13.     return None
  14. def get_proxy(proxy_manager):
  15.     proxies = list(proxy_manager.proxies.keys())
  16.     for proxy in proxies:
  17.         if not proxy_manager.is_used(proxy):
  18.             return proxy
  19.     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代理产品也不同,但各位可以测试了看看,所有的产品都要{BANNED}最佳红应用到自身,才能知道效果如何。

阅读(269) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~