使用Selenium配置代理爬取被屏蔽网站soccerstats.com失败求助
问题分析与解决方案
核心问题
你的代码存在以下关键问题导致代理无法正常工作:
- 重复配置代理(同时使用
Proxy对象和--proxy-server参数)引发冲突 - 未区分代理类型(HTTPS/SOCKS5),统一按SOCKS5配置导致HTTPS代理失效
- 未验证代理可用性,随机选择的代理可能已失效
- 缺乏反检测配置,目标网站可能识别出Selenium爬虫
修复后的代码
import random import pandas as pd from selenium.webdriver.common.by import By from selenium.webdriver import Chrome, ChromeOptions from selenium.common.exceptions import WebDriverException # 读取代理列表并保留类型信息 csv_file = pd.read_csv('proxies.csv') proxies_list = [ {'ip_port': f"{row['IPs']}:{row['Ports']}", 'type': row['Type']} for _, row in csv_file.iterrows() ] def get_working_proxy(proxies): """测试代理可用性,返回第一个能正常连接的代理""" options = ChromeOptions() options.add_argument('--headless=new') # 无头模式加快测试速度 options.add_argument('--disable-gpu') options.add_argument('--no-sandbox') # 随机打乱代理顺序测试 for proxy in random.sample(proxies, len(proxies)): proxy_str = proxy['ip_port'] # 根据代理类型生成对应参数 if 'SOCKS5' in proxy['type']: proxy_arg = f'socks5://{proxy_str}' elif 'HTTPS' in proxy['type']: proxy_arg = f'https://{proxy_str}' else: proxy_arg = f'http://{proxy_str}' options.add_argument(f'--proxy-server={proxy_arg}') try: driver = Chrome(options=options) driver.set_page_load_timeout(10) # 设置10秒超时 driver.get('https://www.soccerstats.com/') if driver.title: # 验证页面是否加载成功 driver.quit() return proxy_arg except WebDriverException: driver.quit() continue return None # 获取可用代理 working_proxy = get_working_proxy(proxies_list) if not working_proxy: print("没有可用的代理,请更新代理列表") exit() # 初始化浏览器并添加反检测配置 options = ChromeOptions() options.add_argument(f'--proxy-server={working_proxy}') options.add_experimental_option('detach', True) # 反检测配置 options.add_argument('--disable-blink-features=AutomationControlled') options.add_experimental_option('excludeSwitches', ['enable-automation']) options.add_experimental_option('useAutomationExtension', False) options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36') try: driver = Chrome(options=options) driver.get('https://www.soccerstats.com/') driver.implicitly_wait(10) # 隐式等待元素加载 element = driver.find_element(By.XPATH, '//input[@name="theteam"]') element.send_keys('Barcelona FC') element.click() except WebDriverException as e: print(f"访问失败:{e}") driver.quit()
关键修复说明
- 代理类型适配:根据CSV中的
Type字段,为不同类型代理生成对应前缀的--proxy-server参数,避免类型不匹配 - 代理可用性测试:新增函数提前验证代理能否访问目标网站,跳过失效代理
- 移除重复配置:仅使用
--proxy-server参数配置代理,消除冲突 - 反检测优化:添加禁用自动化识别的选项,修改User-Agent,降低被网站拦截的概率
- 超时控制:设置页面加载超时,避免因代理过慢导致程序卡死
额外建议
- 免费代理稳定性极差,建议使用付费代理服务或自建代理池
- 优先使用
WebDriverWait替代implicitly_wait,实现更精准的元素等待 - 定期更新代理列表,剔除失效或慢响应的代理
内容的提问来源于stack exchange,提问作者K. M.
相关产品推荐
相关产品推荐

