簡體   English   中英

如何將 JSON API 打印到 Python 中的數據幀

[英]How to print a JSON API to data frames in Python

我已經看到了許多針對類似問題的修復程序,但我似乎無法弄清楚這個特定的 API 有什么不同。

我是新手,但嘗試使用私人鏈接來工作,看看我是否可以加快我正在處理的手動過程。

我已經嘗試了幾個帶有公共 API 的腳本,這些腳本可以工作——我認為這是一個權限錯誤,但我實際上能夠使用這個腳本將 API 提要打印到 TERMINAL,這給了我希望:

import requests as rq
from bs4 import BeautifulSoup
import urllib3
import certifi
# urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

http = urllib3.PoolManager(
       cert_reqs='CERT_REQUIRED',
       ca_certs=certifi.where())


# url = 'https://api.chucknorris.io/jokes/random'
url = 'realurl'
req = rq.get(url, verify=False)

soup = BeautifulSoup(req.text, 'html.parser')


print(soup)

如果我能夠打印到終端,我應該能夠打印到谷歌表格(或者至少是 CSV,我想)......我的問題是創建數據幀; 我嘗試了很多不同的方法,但我一直看到各種錯誤 - 這個是“類型方法的對象不是 JSON 可序列化的”

我想要做的就是 append 數據到我用 Gspread 設置的 G 表:

import gspread
import requests as rq
from bs4 import BeautifulSoup
import pandas as pd
from pandas import json_normalize
import json
import urllib3
from urllib3 import request
import certifi

http = urllib3.PoolManager(
    cert_reqs='CERT_REQUIRED',
    ca_certs=certifi.where())


gc = gspread.service_account(filename='creds.json')
sh = gc.open_by_key('sheetkey')
worksheet = sh.sheet1


headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.79 Safari/537.36'
}


# url = 'https://api.chucknorris.io/jokes/random'
url = 'realurl'
req = rq.get(url, verify=False)

soup = BeautifulSoup(req.text, 'html.parser')


df1 = pd.DataFrame(soup)

df = df1.to_json

# pd.set_option("display.max_rows", None)
# pd.set_option("display.max_columns", None)

AddData = [df]
worksheet.append_row(AddData)

我在這一點上看到的所有修復程序都是在我的 object 上添加 _toCSV 或 _toDict ......但我已經嘗試在任何地方添加它。

我也很困惑為什么它說我需要 JSON 格式,而原來的 API 是 JSON 格式。

我在這里錯過了什么嗎? 我基本上只想從我的第一個代碼中獲取數據集並創建 DataFrame,以便我可以打印到 G Sheet。 任何建議將不勝感激。

更新:

我現在正在將提要中的一個類別標題打印到工作表中:

import gspread
import requests as rq
from bs4 import BeautifulSoup
import pandas as pd
from pandas import json_normalize
import json
import urllib3
from urllib3 import request
import certifi

http = urllib3.PoolManager(
    cert_reqs='CERT_REQUIRED',
    ca_certs=certifi.where())


gc = gspread.service_account(filename='creds.json')
sh = gc.open_by_key('key')
worksheet = sh.sheet1


headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.79 Safari/537.36'
}


# url = 'https://api.chucknorris.io/jokes/random'


url = 'realurl'
req = rq.get(url, verify=False)

soup = BeautifulSoup(req.text, 'html.parser')


# df1 = pd.DataFrame(soup)
dfs = json.loads(str(soup))

for df in dfs:
    print(df)

# pd.set_option("display.max_rows", None)
# pd.set_option("display.max_columns", None)

AddData = [df]
worksheet.append_row(AddData)

進一步更新:

需要明確的是,問題來自將數據推送到 Google 表格。 @Furas 的答案可以打印數據,但與 Gspread 配對時不能打印,如下所示:

import requests
import pandas as pd
import gspread


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



url = 'https://api.chucknorris.io/jokes/random'

response = requests.get(url, verify=False)

data = response.json()
# print(data)

df = pd.json_normalize(data)

# print(df)


AddData = [df]
worksheet.append_row(AddData)

我看到的錯誤是:

Traceback (most recent call last):
  File "c:\Users\JSON-Fetch\FinalTry.py", line 26, in <module>
    worksheet.append_row(AddData)
  File "C:\Python\python3.10.5\lib\site-packages\gspread\worksheet.py", line 1289, in append_row
    return self.append_rows(
  File "C:\Python\python3.10.5\lib\site-packages\gspread\worksheet.py", line 1338, in append_rows
    return self.spreadsheet.values_append(range_label, params, body)
  File "C:\Python\python3.10.5\lib\site-packages\gspread\spreadsheet.py", line 149, in values_append
    r = self.client.request("post", url, params=params, json=body)
  File "C:\Python\python3.10.5\lib\site-packages\gspread\client.py", line 73, in request
    response = getattr(self.session, method)(
  File "C:\Python\python3.10.5\lib\site-packages\requests\sessions.py", line 590, in post
    return self.request('POST', url, data=data, json=json, **kwargs)
  File "C:\Python\python3.10.5\lib\site-packages\google\auth\transport\requests.py", line 549, in request
    response = super(AuthorizedSession, self).request(
  File "C:\Python\python3.10.5\lib\site-packages\requests\sessions.py", line 528, in request
    prep = self.prepare_request(req)
  File "C:\Python\python3.10.5\lib\site-packages\requests\sessions.py", line 456, in prepare_request
    p.prepare(
  File "C:\Python\python3.10.5\lib\site-packages\requests\models.py", line 319, in prepare
    self.prepare_body(data, files, json)
  File "C:\Python\python3.10.5\lib\site-packages\requests\models.py", line 469, in prepare_body
    body = complexjson.dumps(json)
  File "C:\Python\python3.10.5\lib\json\__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "C:\Python\python3.10.5\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Python\python3.10.5\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:\Python\python3.10.5\lib\json\encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type DataFrame is not JSON serializable

我不明白您為什么為此使用BeautifulSoup
它適用於HTMLXML但不適用於JSONCSV


如果頁面發送JSON數據,那么您只需要

data = req.json()

將其作為 python 字典獲取。

如果你想轉換為DataFrame那么

df = pd.json_normalize(req.json())

import requests
import pandas as pd

url = 'https://api.chucknorris.io/jokes/random'

response = requests.get(url, verify=False)

data = response.json()
print(data)

df = pd.json_normalize(data)
print(df)

如果頁面發送CSV那么你甚至可以直接使用pandas

df = pd.read_csv(url)

最終您可以使用帶有 io.StringIO 的requestsio.StringIO中創建類似文件的 object

import io

response = requests.get(url, ...)

file_like_object = io.StringIO(response.text)

df = pd.read_csv(file_like_object)

但這一切都取決於您沒有顯示的真正的 url。


編輯:

如果你想把它添加到谷歌表格那么你不需要DataFrame但python的字典

data = response.json()

worksheet.append_row([data])

如果 JSON 可能有包含許多項目的列表,那么您可能需要for -loop 將數據放在單獨的行中

data = response.json()

for item in data:
    worksheet.append_row([item])

如果你真的必須使用pandas然后閱讀文檔Using gspread with pandas

它可能需要這樣的東西

for index, row in df.iterrows():
    worksheet.append_row(row.values.tolist())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM