Python使用browsermobproxy+selenium抓谷歌HAR文件报AttributeError排查
问题诱因
- 根因是类初始化方法拼写错误:Python类的实例构造方法固定命名为
__init__(前后各两个下划线),代码里错写为__int__,执行proxy = ProxyManger()实例化对象时,根本不会触发这个方法内的赋值逻辑,self.__server、self.__client两个属性从未被创建。由于Python对双下划线开头的类属性会做名称修饰,自动重命名为_类名__属性名格式,后续调用start_server()访问self.__server时,就会抛出_ProxyManger__server属性不存在的错误。 - 附带兼容问题:Selenium 4.0及以上版本中,
webdriver.Chrome()构造方法已移除chrome_options入参,继续使用会触发参数错误,需替换为options入参。
修复方案
修改两处错误即可:
- 把类中错写的
def __int__(self):修正为def __init__(self): - 把启动Chrome的代码
driver = webdriver.Chrome(chrome_options=options)修正为driver = webdriver.Chrome(options=options),建议补充driver.quit()逻辑避免浏览器进程残留。
修复后的完整可运行代码:
import pprint import time from browsermobproxy import Server from selenium import webdriver class ProxyManger: __BMP = "C:/Users/Ender/Desktop/browsermob-proxy-2.1.4/bin/browsermob-proxy.bat" def __init__(self): self.__server = Server(ProxyManger.__BMP) self.__client = None def start_server(self): self.__server.start() return self.__server def start_client(self): self.__client = self.__server.create_proxy(params={"trustAllServers": "true"}) return self.__client @property def client(self): return self.__client @property def server(self): return self.__server if __name__ == "__main__": proxy = ProxyManger() server = proxy.start_server() client = proxy.start_client() client.new_har("google.com") print(client.proxy) options = webdriver.ChromeOptions() options.add_argument("--proxy-server={}".format(client.proxy)) driver = webdriver.Chrome(options=options) driver.get("https://www.google.com/") time.sleep(3) pprint.pprint(client.har) driver.quit() server.stop()
修正后实例化类时会正常初始化服务端、客户端属性,不会再触发属性不存在的报错,浏览器可正常通过代理启动访问目标站点,输出抓取到的HAR内容。
内容的提问来源于stack exchange,提问作者E.MRZ
相关产品推荐
相关产品推荐

