Selenium+PhantomJS报错:目标机器主动拒绝连接问题求助
看起来你遇到的是PhantomJS驱动会话在循环迭代中意外失效的问题,而且要求不能使用quit()方法来解决。我来帮你拆解问题根源并给出可行的修复方案。
问题根源
这个错误本质上是因为你的PhantomJS驱动实例client在经历第一次内部循环的频繁请求、闲置后,底层的HTTP连接被关闭,或者PhantomJS进程意外崩溃了。当你第二次进入外层循环调用search()时,代码还在尝试使用已经失效的驱动会话,所以会抛出连接被拒绝的错误。另外,你代码里的URL拼写错误(wwww.google.com多了一个w)也可能加重驱动的异常状态。
解决方案思路
核心是每次使用驱动前先验证会话是否有效,如果失效就重新初始化驱动实例(不用调用quit(),因为失效的进程会被系统自动回收)。这样既满足了不能用quit()的要求,又能保证每次请求都使用正常的驱动会话。
修改后的完整代码
from selenium import webdriver import time import os from selenium.common.exceptions import WebDriverException class Account: def __init__(self, client): self.client = client self.foo() def foo(self): self._ensure_driver_alive() self.client.get("https://google.com") def _ensure_driver_alive(self): """检查驱动会话是否有效,失效则重新初始化""" try: # 通过获取页面标题来验证驱动是否正常响应 self.client.title except WebDriverException: # 重新创建PhantomJS实例,旧的失效进程会被系统自动回收 self.client = webdriver.PhantomJS() class User: def __init__(self, id): self.id = id def search(self, account): # 使用前先确保驱动存活 account._ensure_driver_alive() # 修正URL拼写错误:wwww -> www account.client.get("https://www.google.com") # 初始化驱动 client = webdriver.PhantomJS() a = Account(client) a.foo() while True: someid = input("Input id : ") u = User(someid) while True: try: u.search(a) os.system("cls") print("Started.... press ctrl+c to stop") time.sleep(1) except KeyboardInterrupt: break if input("Search more? (y/n)").lower() == "n": break
关键修改点说明
- 新增
_ensure_driver_alive()方法:每次调用get()前,通过尝试获取页面标题来检查驱动是否正常。如果抛出WebDriverException(包含连接拒绝、会话失效等情况),就重新创建PhantomJS实例。 - 修正URL拼写错误:把
wwww.google.com改成www.google.com,避免无效请求导致驱动状态异常。 - 驱动检查前置:在
foo()和search()方法里都先执行驱动有效性检查,确保每次请求都用正常的会话。
额外建议
- PhantomJS已经停止维护多年,稳定性和兼容性都很差,如果项目允许,建议替换成Headless Chrome或Headless Firefox,它们的长期支持和稳定性会好很多。
- 减少过于频繁的
get()请求循环,适当增加time.sleep()的间隔时间,降低驱动的负载,减少会话失效的概率。
内容的提问来源于stack exchange,提问作者Sreyas
相关产品推荐
相关产品推荐

