【问题标题】:WEIRD "json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)"奇怪的“json.decoder.JSONDecodeError:期望值:第 1 行第 1 列(字符 0)”
【发布时间】:2021-10-23 17:08:42
【问题描述】:

问题:当我尝试使用下面的第一个代码时,我得到了json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)。所有这些代码昨天都运行良好,昨天它也停止了工作。今天它也不工作了。我刚刚启动了第二个代码(也在下面)的奇怪部分,它工作了一次,然后在另一次启动后又遇到了同样的问题!

错误是由行抛出的:

post_info = instagram_web_api.media_info2("<SHORTCODE>")

请帮忙:(。俄语堆栈溢出没有答案。

我用instagram-private-api 1.6.0.0

1-st 代码当我收到该错误时:

from instagram_web_api import Client

instagram_web_api = Client(auto_patch=False, drop_incompat_keys=False)

post_info = instagram_web_api.media_info2('CVNgb7us34V') # Get the short code.
post_text = post_info['edge_media_to_caption']['edges'][0]['node']['text']

print(post_text)

第二个代码:

from instagram_web_api import Client

web_api = Client(auto_patch=False, drop_incompat_keys=False)
user_feed_info = web_api.user_feed('329452045', count=10)

【问题讨论】:

  • 检查您尝试解码的代码是否假定为 JSON,因为错误表明它不是 JSON。
  • @balmy,我认为这是正确的 JSON,因为我从帖子的实际 URL 中获取了帖子的短代码(并尝试了许多不同的帖子),其次是因为该代码昨天运行得非常好.
  • @2e0byo,对不起,你是什么意思?我无法打印“post_info”,因为该问题出现在“post_info”获取数据之前。
  • 忘记昨天,你的代码今天失败了。如果它正在接收 JSON,它不会给出那个错误,因此它没有接收 JSON。看看你得到了什么,因为它可能是带有信息的 HTML,可以帮助你了解正在发生的事情。
  • @balmy,我不知道在哪里看,我查看了帖子的 HTML 结构,但我不知道我应该在那里找到什么。 : (请帮忙

标签: python parsing python-requests instagram-api


【解决方案1】:

问题出在您正在使用的库和 instagram 之间:后者没有将 JSON 发送到您期望的位置。

如果您查看the sourcemedia_info2,它看起来像这样:

def media_info2(self, short_code):
    """
    Alternative method to get media info. This method works for carousel media.

    :param short_code: A media's shortcode
    :param kwargs:
    :return:
    """
    headers = {
        'User-Agent': self.user_agent,
        'Accept': '*/*',
        'Accept-Language': 'en-US',
        'Accept-Encoding': 'gzip, deflate',
        'Connection': 'close',
        'Referer': 'https://www.instagram.com',
        'x-requested-with': 'XMLHttpRequest',
    }
    info = self._make_request(
        'https://www.instagram.com/p/{0!s}/'.format(short_code),
        query={'__a': '1', '__b': '1'},
        headers=headers)
    ...

根据您的回溯,错误位于 make_request。所以我们去看看the source,我们看到重要的几行是:

self.logger.debug('REQ DATA: {0!s}'.format(data))
res = self.opener.open(req, data=data, timeout=self.timeout)
...

if return_response:
    return res
response_content = self._read_response(res)
    self.logger.debug('RES BODY: {0!s}'.format(response_content))
    return json.loads(response_content)

我们现在有了进行手动调试所需的一切,因为程序的工作原理是这样的:

  • 设置标题并将它们和 url 传递给 make_request
  • 从url获取数据
  • 将日期解析为 json
  • 返回数据

我们可以将我们自己的调用组合到opener,甚至只是在传递给_make_request 的url 上运行curl,或者临时修改代码以打印一些东西并成为更详细一点。但在这种情况下,我们有一个更简单的选择:代码将已经为我们调试自己,我们只需要告诉它是冗长的:

import logging
logging.basic_config(level=logging.DEBUG)

将它放在失败脚本的顶部并再次运行它,它应该会喷出大量数据,告诉你它在做什么。由于它会打印整个返回正文,因此您应该得到它返回的任何内容,并且能够弄清楚发生了什么。

记住....使用来源,卢克。

好吧,那太糟糕了,但了解代码在做什么的唯一方法是阅读源代码。 python的伟大之处在于它的可读性。将此与通过阅读尝试找出一些 c++ 库进行比较...

【讨论】:

  • 天哪,你真好!!!非常感谢您的帮助,我现在从 Instagram 获取一些数据的 HTML 代码,但这里不是帖子文本,我也不知道如何使用该 html 文本,因为它是用我的 CMD 编写的..
  • 看看它说的是什么:如果它只是帖子,那么库中的一个假设就被打破了(即用于获取 json 的方法不起作用)。不深入库我不知道如何修复它,但您可以尝试通过将Accept 行替换为"Accept": "application/json" 来明确请求JSON。如果您摆弄,请从 github 克隆 instagram-private-api 并将 instagram_web_api 放在与您的代码相同的文件夹中,然后在那里修改它。或者,如果您认为它应该 工作(可能),请在 git 项目上打开一个问题。但请注意目前未解决的问题数量......
  • 我也再次运行了 2-nd 代码,它现在可以工作了,但是第一个代码仍然不能工作,这太疯狂了
  • 当然,与服务器交互的代码受这些服务器的支配,这是一组非官方的绑定,因此它往往会与 instagram 的服务器脱节。可悲的是,编写 api 消费者是生活中的一个事实
  • 已明确回答:您不能(轻松)使用调试输出:它只是为了查看正在发生的事情以及实际发送的内容。
【解决方案2】:

问题是因为 Instagram 有时不允许多次请求,所以在我多次请求之后,它会阻止我从帖子中获取任何信息。解决方案是在 API 中登录。就是这样。

【讨论】:

  • 现在你相信错误信息,即网站没有提供 JSON 吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 2020-11-11
  • 2017-05-09
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
相关资源
最近更新 更多