对于做数据抓取的技术员来说,如何稳定高效的爬取数据ip库池起到决定性作用,对于爬虫ip池的维护,可以从以下几个方面入手:
1、验证爬虫ip的可用性
可以通过requests库向目标网站发送请求,判断爬虫ip是否能够成功返回响应。如果返回成功,则说明爬虫ip可用,否则说明爬虫ip已失效。可以在代码中设置超时时间,避免长时间等待无响应的爬虫ip。
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、更新爬虫ip池
可以通过定期爬取爬虫ip网站或者购买付费爬虫ip服务来获取新的爬虫ip。可以使用requests库向爬虫ip网站发送请求,获取HTML页面,并使用BeautifulSoup库解析HTML页面,从而获取爬虫ip信息。通过一定的筛选规则,可以将新获取的爬虫ip加入到自有库池中。
import requests from bs4 import BeautifulSoup def get_proxies(): url = 'http://jshk.com.cn/' 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、维护爬虫ip的质量
可以通过一些指标来衡量爬虫ip的质量,比如连接速度、响应时间、访问成功率等。可以定时对爬虫ip进行评估,筛选出质量较好的IP,并从爬虫ip池中删除质量较差的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、监控爬虫ip的使用情况
对于监控爬虫ip的使用情况,一种比较简单的方法是记录每个爬虫ip的使用次数和成功率,以便及时发现哪些爬虫ip不再可用或者质量较差。
可以使用Python内置的shelve模块,将爬虫ip的使用情况保存在一个本地文件中。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()
在使用爬虫ip进行网络请求时,可以先检查该爬虫ip是否已被使用过。如果该爬虫ip已被使用过,则不再使用该爬虫ip。如果该爬虫ip未被使用过,则使用该爬虫ip进行网络请求,并在请求成功或失败后,更新该爬虫ip的使用情况。
以下是一个简单的示例代码:
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模块的写入操作可能比较耗时,如果爬虫ip池较大,可以考虑每隔一段时间将爬虫ip使用情况保存在本地文件中,以提高性能。同时,如果爬虫ip池中存在较多已失效的爬虫ip,证明这个池子的IP可用率已经极低了,还是会更建议大家伙使用优质厂商提供的爬虫ip。
正常情况下,很多人会说随着经济下行,能有使用的就已经不错了,还谈什么自行车,且不谈免费的爬虫ip的连通性,实际上只要选对爬虫ip,采购的成本也会在我们的承受范围内的。
标签:used,ip,self,高质量,爬虫,proxy,IP,proxies From: https://www.cnblogs.com/q-q56731526/p/17187077.html