如何在Python中自动切换代理IP以绕过封IP限制
要在Python中自动切换代理IP以避免封IP限制,可以使用第三方模块requests和random模块来帮助实现。
- 安装requests模块
如果还没有安装requests模块,可以使用以下命令在终端或命令行界面中安装:
pip install requests
- 获取代理IP列表
可以从互联网上找到一些免费的代理IP网站,例如www.89ip.cn。使用requests模块从该网站获取代理IP列表(以HTTP代理为例):
import requests def get_proxy_list(): url = 'http://www.89ip.cn/tqdl.html?api=1&num=10&port=&address=&isp=' response = requests.get(url) if response.status_code == 200: proxy_list = [] rows = response.text.strip().split('\n')[1:] for row in rows: parts = row.strip().split(':') proxy = f'http://{parts[0]}:{parts[1]}' proxy_list.append(proxy) return proxy_list else: return None
该函数会从http://www.89ip.cn网站获取10个免费代理IP(可以自行修改num参数),并将其保存在一个列表中。
- 使用代理IP进行请求
接下来,可以使用这些代理IP进行请求,并在请求失败时切换到下一个代理IP。使用random模块可以随机选择下一个代理IP。
import requests import random def get_page(url, proxy_list): while len(proxy_list) > 0: proxy = random.choice(proxy_list) try: response = requests.get(url, proxies={'http':proxy}) if response.status_code == 200: return response.text except: proxy_list.remove(proxy) return None
该函数将在proxy_list中随机选择一个代理IP,并使用requests模块进行请求。如果请求成功,则返回响应文本。否则,将从代理IP列表中删除此代理IP,并重试请求直到达到最大尝试次数或代理IP列表为空。
- 示例代码
下面是完整的代码示例,其中URL为https://www.pidancode.com。
import requests import random def get_proxy_list(): url = 'http://www.89ip.cn/tqdl.html?api=1&num=10&port=&address=&isp=' response = requests.get(url) if response.status_code == 200: proxy_list = [] rows = response.text.strip().split('\n')[1:] for row in rows: parts = row.strip().split(':') proxy = f'http://{parts[0]}:{parts[1]}' proxy_list.append(proxy) return proxy_list else: return None def get_page(url, proxy_list): max_retry_times = 3 while len(proxy_list) > 0 and max_retry_times > 0: proxy = random.choice(proxy_list) try: response = requests.get(url, proxies={'http':proxy}) if response.status_code == 200: return response.text except: proxy_list.remove(proxy) max_retry_times -= 1 return None if __name__ == '__main__': url = 'https://www.pidancode.com' proxy_list = get_proxy_list() page = get_page(url, proxy_list) if page: print(page) else: print('Failed to get page')
运行代码时,如果成功获取到页面内容,则会将页面内容打印到控制台。否则,将显示“Failed to get page”。
相关文章