处理代理IP失效的问题是网络爬虫项目中经常遇到的难点之一。以下是一些具体措施:
1. 保证代理IP来源可靠
在开发网络爬虫程序时,需要选用好的代理IP来源网站。因为大部分免费代理IP来源网站上的IP往往不太稳定,且容易被ban,因此最好选择一些收费而服务良好的代理IP提供商。
2. 添加多个代理IP并定时切换
尽管选用了好的代理IP来源,仍然无法保证IP的稳定性。针对这个问题,我们可以向程序中添加多个代理IP,定时检测每个代理IP的稳定性,并根据情况进行切换,从而确保程序的稳定性。具体步骤如下:
-
在爬虫程序中添加多个代理IP;
-
定时检测每个代理IP的可用性,当发现某个代理IP不可用时,立刻切换到下一个可用的代理IP上;
-
在每次获取网页时,通过不同的代理IP来访问目标网站,从而避免因单个代理IP的失效而导致整个程序无法正常运行。
以下是一个示例代码,用于实现多个代理IP的切换:
import requests
from itertools import cycle
proxy_list = ['http://ip1:port', 'https://ip2:port', 'http://ip3:port', 'https://ip4:port']
proxy_pool = cycle(proxy_list)
def get_html(url):
for i in range(len(proxy_list)):
try:
proxy = next(proxy_pool)
print('正在使用代理IP:', proxy)
resp = requests.get(url=url, proxies={'https': proxy, 'http': proxy}, timeout=10)
if resp.status_code == 200:
return resp.text
except Exception as e:
print('代理IP无效:', proxy, ', 错误信息:', e)
continue
raise Exception('All proxies are invalid!')
在上述代码中,我们使用了一个无限循环的生成器(即 proxy_pool)来保存多个代理IP,并在每次获取网页时从该生成器中获取下一个代理IP。当获取某个代理IP时,程序会首先检测该代理IP的可用性,如果该代理IP已经失效,则立刻切换到下一个可用的代理IP上。
3. 定期更换代理IP
除了定时切换代理IP外,我们还可以定期更换代理IP。具体的实现方法有很多种,其中比较常见的是定期重新从代理IP来源网站中获取一批新的代理IP,并且在每次爬取网页之前,都从中随机选取一个IP来使用。以下是一个示例代码,用于实现定期更换代理IP:
import requests
from time import time, sleep
import random
def get_proxy_ip():
proxies = {'https': 'https://ip1:port', 'http': 'http://ip2:port'}
return proxies
def get_html(url, proxies=None):
return requests.get(url, proxies=proxies).text
def main():
while True:
try:
start_time = time()
print('开始爬取网页:')
html = get_html('http://www.example.com', proxies=get_proxy_ip())
print('爬取成功,网页内容:', html)
end_time = time()
cost_time = end_time - start_time
print('本次爬取耗时:{:.2f}秒'.format(cost_time))
sleep(10) # 每10秒钟爬取一次
except Exception as e:
print('爬取失败,错误信息:', e)
continue
在上述代码中,我们实现了一个简单的爬虫程序,该程序每隔10秒钟爬取一次指定的网页,并且在每次爬取网页时都使用一个随机的代理IP。这样可以有效避免因代理IP的失效而导致的爬虫程序异常。