【问题标题】:Browsermob selenium python - JSONDecodeErrorBrowsermob selenium python - JSONDecodeError
【发布时间】:2019-04-02 16:58:03
【问题描述】:

尝试在 Python 中使用带有 selenium 的 browsermob-proxy 获取一堆 url 的 HAR 文件。 对于基本实现,我使用来自Browsermob documentation 的示例代码。下面是我的代码

from browsermobproxy import Server
import psutil
import time

server = Server(“/path/to/bin/browsermob-proxy")
server.start()
proxy = server.create_proxy()

from selenium import webdriver
profile  = webdriver.FirefoxProfile()
profile.set_proxy(proxy.selenium_proxy())
driver = webdriver.Firefox(firefox_profile=profile)

proxy.new_har(“google”) 
driver.get("http://www.google.com")
print(proxy.har) #ISSUE IN THIS LINE

server.stop()
driver.quit()

我能够初始化 browsermob-proxy,并让 selenium 在 firefox(和 chrome)上打开页面。 当它到达“proxy.har”行时,它会抛出 JSONDecodeError: Expecting value: line 1 column 1 (char 0)

下面的错误跟踪

JSONDecodeError                           Traceback (most recent call last)
<ipython-input-2-f690bb4c2c08> in <module>()
----> 1 proxy.har

~/anaconda3/lib/python3.6/site-packages/browsermobproxy/client.py in har(self)
    102         r = requests.get('%s/proxy/%s/har' % (self.host, self.port))
    103 
--> 104         return r.json()
    105 
    106     def new_har(self, ref=None, options=None, title=None):

~/anaconda3/lib/python3.6/site-packages/requests/models.py in json(self, **kwargs)
    890                     # used.
    891                     pass
--> 892         return complexjson.loads(self.text, **kwargs)
    893 
    894     @property

~/anaconda3/lib/python3.6/json/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    352             parse_int is None and parse_float is None and
    353             parse_constant is None and object_pairs_hook is None and not kw):
--> 354         return _default_decoder.decode(s)
    355     if cls is None:
    356         cls = JSONDecoder

~/anaconda3/lib/python3.6/json/decoder.py in decode(self, s, _w)
    337 
    338         """
--> 339         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    340         end = _w(s, end).end()
    341         if end != len(s):

~/anaconda3/lib/python3.6/json/decoder.py in raw_decode(self, s, idx)
    355             obj, end = self.scan_once(s, idx)
    356         except StopIteration as err:
--> 357             raise JSONDecodeError("Expecting value", s, err.value) from None
    358         return obj, end

JSONDecodeError: Expecting value: line 1 column 1 (char 0)

我尝试了很多方法来解决这个问题,但无法让它发挥作用

  • GET 请求返回 200
  • 尝试了一些 json 函数来加载或解析为 utf-8 或去除无效字符
  • 试过simplejson
  • 尝试更改 browsermob 端口
  • 在不同的网络上尝试过,以防阻止是由代理设置引起的

无论我尝试什么,都会遇到同样的错误。 我最初认为问题出在我的安装上。我就是这样做的:

  1. 使用 pip3 安装 selenium(使用带有 Jupyter/iPython 的 python 3.6)
  2. https://bmp.lightbody.net/ 下载 browsermob 二进制文件
  3. 已下载 geckodriver
  4. 在 /bin 中使用 ./browsermob-proxy 启动代理,并尝试使用 -port 选择端口

有人遇到过类似的问题,但他们使用上述以外的方法解决了吗?

【问题讨论】:

  • 同样的问题,升级到py3.7也解决不了
  • jojoman 发布了一个 Answer 说“..我运行 .bat 文件。警告:发生了非法反射访问操作..”,所以“使用版本 9 下的 java jdk!” .不确定相关性,但 Selenium 可能正在运行 Java。

标签: python selenium browsermob-proxy browsermob


【解决方案1】:

我在 OSX 10.14 上运行 Python 3.6 时遇到了同样的问题。

通过切换到 Python 3.7 解决 - 适用于 Linux 和 Mac。

【讨论】:

    【解决方案2】:

    问题是“browsermob-proxy”包与您的 Python 版本不兼容。该包是为 Python 2.x 编写的,而您使用的是 Python 3.6。

    【讨论】:

    • 感谢您的回复。我试过了,但在 python2 中也出现了同样的错误。我让其他人在他们的机器上尝试了相同的代码,并且它在 python3.6 中适用于他们(与我的相同),所以我猜测安装有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 2013-12-29
    • 1970-01-01
    • 2021-03-31
    相关资源
    最近更新 更多