用户之前询问了不同语言的爬虫示例,特别是Python、Node.js和Ruby。现在他们希望详细扩展Python版本中使用代理IP的过程。
用户可能已经掌握了基本的爬虫编写,但遇到了IP被封的问题,或者想防止被封。他们需要知道如何集成代理IP到现有的代码中,可能还关心代理IP的来源、验证以及轮换策略。
首先,我需要明确代理IP在爬虫中的作用:隐藏真实IP,避免被目标网站封禁。接下来,要详细说明如何在Python的requests库中添加代理。用户可能需要代码示例,所以应该提供具体的代码修改部分,比如在requests.get()中添加proxies参数。
然后,用户可能需要知道如何获取代理IP,包括免费和付费的来源。免费代理的稳定性可能不好,付费的更可靠,但需要提醒用户注意选择可信的服务商。同时,需要指导用户如何验证代理是否有效,比如发送测试请求检查响应状态码。
以下是为 Python 版本爬虫 添加代理 IP 功能的详细扩展说明,涵盖代理的获取、配置、轮换和异常处理:
在 requests.get()
中添加 proxies
参数:
import requests
proxies = {
'http': 'http://123.45.67.89:8080', # HTTP 协议代理
'https': 'http://123.45.67.89:8080' # HTTPS 协议代理(若与 HTTP 相同可省略)
}
response = requests.get(url, proxies=proxies, timeout=10)
若代理需要认证,格式为 http://user:pass@ip:port
:
proxies = {
'http': 'http://username:password@123.45.67.89:8080',
'https': 'http://username:password@123.45.67.89:8080'
}
# 假设代理 IP 列表保存在 proxies.txt 或通过 API 获取
def load_proxies():
with open('proxies.txt', 'r') as f:
proxies = [line.strip() for line in f]
return proxies
proxy_pool = load_proxies()
import random
def download_with_proxy(img_url, retries=3):
for _ in range(retries):
try:
proxy = random.choice(proxy_pool)
proxies = {'http': proxy, 'https': proxy}
response = requests.get(img_url, proxies=proxies, timeout=10)
response.raise_for_status()
return response.content
except (requests.exceptions.ProxyError, requests.exceptions.ConnectTimeout):
# 移除失效代理
proxy_pool.remove(proxy)
print(f"移除失效代理: {proxy}")
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return None
import os
import requests
from bs4 import BeautifulSoup
import random
# 代理池初始化
def load_proxies():
# 示例:从文件加载,实际可替换为 API 获取
return [
'http://123.45.67.89:8080',
'http://111.222.33.44:3128',
# 更多代理...
]
proxy_pool = load_proxies()
def download_image(img_url, save_dir):
for _ in range(3): # 最多重试 3 次
if not proxy_pool:
print("无可用代理,终止下载")
return
proxy = random.choice(proxy_pool)
proxies = {'http': proxy, 'https': proxy}
try:
response = requests.get(img_url, proxies=proxies, timeout=15)
response.raise_for_status()
filename = os.path.join(save_dir, os.path.basename(img_url))
with open(filename, 'wb') as f:
f.write(response.content)
print(f"成功下载: {filename} (使用代理: {proxy})")
return
except Exception as e:
print(f"代理 {proxy} 失败: {str(e)}")
proxy_pool.remove(proxy) # 移除失效代理
# 主函数
def main():
url = 'https://example.com/images'
save_dir = 'images_py'
os.makedirs(save_dir, exist_ok=True)
try:
# 获取页面(使用代理)
proxy = random.choice(proxy_pool)
response = requests.get(url, proxies={'http': proxy}, timeout=10)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
# 遍历图片
for img in soup.select('img'):
img_url = img.get('src')
if not img_url.startswith('http'):
img_url = f'https://example.com{img_url}'
download_image(img_url, save_dir)
except Exception as e:
print(f"主流程错误: {e}")
if __name__ == '__main__':
main()
在加载代理池时,先筛选可用 IP:
def validate_proxy(proxy):
try:
test_url = 'http://httpbin.org/ip' # 返回请求的 IP
response = requests.get(test_url, proxies={'http': proxy}, timeout=10)
return response.json()['origin'] in proxy
except:
return False
# 过滤无效代理
valid_proxies = [p for p in proxy_pool if validate_proxy(p)]
requests[socks]
库,配置格式 'socks5://user:pass@host:port'
aiohttp
+ asyncio
提升并发效率。proxy = 'http://jp.xxx.xxx:8080'
)。time.sleep(2)
)。通过代理 IP 的合理配置,可显著提升爬虫的稳定性和抗封禁能力。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有