【问题标题】:How to fix timeout while parsing a JSON feed into a Google Sheet?将 JSON 提要解析为 Google 表格时如何解决超时问题?
【发布时间】:2022-10-08 17:00:36
【问题描述】:

我对此很陌生,我花了几天的时间才走到这一步,我现在拥有的将 JSON 提要推送到 Google 表格中的脚本适用于我的测试链接,但在与我实际需要提取的 URL 一起使用时会超时从。

我可以确认真正的 URL 有效,并且我可以访问 - 我可以毫无问题地打印到终端。

它有敏感信息,所以我无法分享——我已经研究了代理和 URI,但还没有真正能够用我的代码弄清楚其中的任何一个。

# import urllib library
import json
from urllib.request import urlopen, Request

import gspread
import requests

gc = gspread.service_account(filename='creds.json')
sh = gc.open_by_key('1-1aiGMn2yUWRlh_jnIebcMNs-6phzUNxkktAFH7uY9o')
worksheet = sh.sheet1


url = 'URL LINK GOES HERE'


# store the response of URL
response = urlopen(Request(url, headers={"User-Agent": ""}))
r = requests.get("URL LINK GOES HERE",
                 proxies={"http": "http://61.233.25.166:80"})

# storing the JSON response
# from url in data
data_json = json.loads(response.read())

# print the json response
# print(data_json)
result = []
for key in data_json:
    result.append([key, data_json[key] if not isinstance(
        data_json[key], list) else ",".join(map(str, data_json[key]))])
worksheet.update('a1', result)

# proxies///uris///url 100% works

有人对我如何避免超时有建议吗?完整错误如下:

 Traceback (most recent call last):
  File "c:\Users\AMadle\NBA-JSON-Fetch\2PrintToSheetTimeoutTesting.py", line 17, in <module>
    response = urlopen(Request(url, headers={"User-Agent": ""}))
  File "C:\Python\python3.10.5\lib\urllib\request.py", line 216, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Python\python3.10.5\lib\urllib\request.py", line 519, in open
    response = self._open(req, data)
  File "C:\Python\python3.10.5\lib\urllib\request.py", line 536, in _open
    result = self._call_chain(self.handle_open, protocol, protocol +
  File "C:\Python\python3.10.5\lib\urllib\request.py", line 496, in _call_chain
    result = func(*args)
  File "C:\Python\python3.10.5\lib\urllib\request.py", line 1391, in https_open
    return self.do_open(http.client.HTTPSConnection, req,
  File "C:\Python\python3.10.5\lib\urllib\request.py", line 1351, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond>

【问题讨论】:

  • 你在终端打印什么?您究竟是如何确认您的网址有效的?
  • 我正在打印一个我无法共享的工作链接,但我通过将相同的 API 打印到终端来确认它可以工作。当我尝试推送到表格 @koolkoda 时,它会超时

标签: python json request timeout gspread


【解决方案1】:

这里有几件事:

  1. 这是完整的代码吗?我知道你说它有敏感信息,但你能简单地审查它而不是完全删除吗?
  2. 提供的日志显示 URLError。你怎么知道这是一个超时异常。如果是超时,它不会引发 TimeoutException 吗?
  3. 您是否正在尝试读取或写入数据?交替说推或拉是没有意义的。

【讨论】:

  • 对不起,我分享了不正确的脚本。尝试了一百万种不同的方法,我用正确的脚本更新了我的问题。先前的错误已修复,然后遇到此“连接尝试失败...”。我正在尝试将数据写入工作表。我很抱歉!!!
  • 不用担心!恭喜你弄明白了!对不起,如果我听起来有点苛刻。
  • 感谢@ShadowProgrammer - 不幸的是,我还没有找到解决我的主要问题(即超时)的方法,但至少我现在有正确的脚本。感谢你发现我的错误
【解决方案2】:

如果无法测试您的代码,我可以猜测一下。看起来没有连接到服务器。既然您说 url 有效(顺便说一句,您如何尝试?)那么可能是 urlopen 连接的具体方式不起作用。根据我的理解,urllib 文档是这样说的(https://docs.python.org/2/library/urllib2.html#urllib2.ProxyHandler):

此外,如果检测到代理设置(例如,当 *_proxy 环境变量(如 http_proxy 已设置),ProxyHandler 是默认安装的,并确保通过 代理人。

如果没有设置代理环境变量,那么在 Windows 环境代理设置是从注册表的 Internet 获取的 设置部分,并且在 Mac OS X 环境中的代理信息是 从 OS X 系统配置框架中检索。

要禁用自动检测代理,请传递一个空字典。

顺便说一句,您的操作系统是什么?

您可以使用urllib.request.getproxies() 检查您的代理设置

您可以尝试更改代理设置。不幸的是,我不确定 urllib 库的确切语法(更好地使用 requests btw),但另一个猜测是这样的:

req = Request(url, headers={"User-Agent": ""})
req.set_proxy("", "http") # empty proxy for http
req.set_proxy("", "https") # empty proxy for https
response = urlopen(req)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2010-12-06
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    相关资源
    最近更新 更多