从 API 获取 JSON,将其添加到 sqlite3 数据库并自动获取下一页
Posted
技术标签:
【中文标题】从 API 获取 JSON,将其添加到 sqlite3 数据库并自动获取下一页【英文标题】:Fetching JSON from API, adding it to sqlite3 database and automatically fetching the next page 【发布时间】:2021-11-03 15:21:05 【问题描述】:我正忙于尝试将从 API 收集的数据添加到 sqlite3 数据库,然后提取下一页,加载该页面并将该数据添加到数据库中,直到没有更多的下一页 (next_is_after)。
加载数据运行良好(感谢其他用户),但是当我尝试将其作为列表加载时,格式错误,当我将其作为字典加载时,它运行良好,但我正在努力将其加载到数据库中。
我不知道如何实现加载下一页的循环,因为它不是“正常”页码而是代码(例如“WzExNDEuMTYsNTYwNTkzNTFd”)。
我在下面附上了代码。我会再次感谢任何帮助。
import requests
import json
import sqlite3
con = sqlite3.connect('takealot.db')
cur = con.cursor()
cur.execute('''CREATE TABLE IF NOT EXISTS products
(sku text PRIMARY KEY, title text, slug text, reviews integer, star_rating real, listing_price real, pretty_price real)''')
baseurl = 'https://api.takealot.com/rest/v-1-10-0/searches/products,filters,facets,sort_options,breadcrumbs,slots_audience,context,seo'
endpoint = '?after=WzExNDEuMTYsNTYwNTkzNTFd'
def main_request(baseurl, endpoint):
res = requests.get(baseurl + endpoint)
return res.json()
daten = main_request(baseurl, endpoint)
next_is_after = daten['sections']['products']['paging']['next_is_after']
prodlist = []
for data in daten['sections']['products']['results']:
prod =
'sku': data['product_views']['core']['id'],
'title': data['product_views']['core']['title'],
'slug': data['product_views']['core']['slug'],
'reviews': data['product_views']['core']['reviews'],
'star_rating': data['product_views']['core']['star_rating'],
'listing_price': data['product_views']['buybox_summary']['listing_price'],
'pretty_price': data['product_views']['buybox_summary']['pretty_price']
prodlist.append(prod)
cur.executemany("INSERT OR IGNORE INTO products VALUES (?, ?, ?, ?, ?, ?, ?)", [prod['sku'], prod['title'], prod['slug'], prod['reviews'], prod['star_rating'], prod['listing_price'], prod['pretty_price']])
con.commit()
for row in cur.execute('''SELECT * FROM products'''):
print(row)
【问题讨论】:
【参考方案1】:你只需要在它周围添加一个while循环:
import requests
import json
import sqlite3
con = sqlite3.connect('takealot.db')
cur = con.cursor()
cur.execute('''CREATE TABLE IF NOT EXISTS products
(sku text PRIMARY KEY, title text, slug text, reviews integer, star_rating real, listing_price real, pretty_price real)''')
baseurl = 'https://api.takealot.com/rest/v-1-10-0/searches/products,filters,facets,sort_options,breadcrumbs,slots_audience,context,seo'
endpoint = '?after='
def main_request(baseurl, endpoint):
res = requests.get(baseurl + endpoint)
return res.json()
# This seems to work
next_is_after = "\"\""
while next_is_after != "" :
daten = main_request(baseurl, endpoint+next_is_after)
next_is_after = daten['sections']['products']['paging']['next_is_after']
prodlist = []
for data in daten['sections']['products']['results']:
prod = (\
data['product_views']['core']['id'],\
data['product_views']['core']['title'],\
data['product_views']['core']['slug'],\
data['product_views']['core']['reviews'],\
data['product_views']['core']['star_rating'],\
data['product_views']['buybox_summary']['listing_price'],\
data['product_views']['buybox_summary']['pretty_price'])
prodlist.append(prod)
cur.executemany("INSERT OR IGNORE INTO products VALUES (?, ?, ?, ?, ?, ?, ?)", prodlist)
con.commit()
for row in cur.execute('''SELECT * FROM products'''):
print(row)
所以你从响应中得到下一个起点,在那里你会找到下一个起点,以此类推。
这假设(与 previous_is_before 一样)当您到达末尾时,它只是一个空字符串。
【讨论】:
谢谢 Kartoffelkultur!我看了看,似乎它正在工作。我不想粗鲁,但我真的很难将它写入 sqlite3 数据库,你会碰巧知道我做错了什么吗?另外,您是否知道是否可以在每次请求后写入数据库? @Jan 我没看DB代码,我现在就做 @Jan 编辑它,知道它应该可以按您的意愿工作。如果你想在每次请求后提交它,你可以缩进 con.commit() 非常感谢!它工作得很好,我非常感谢你!让我知道你是否收过学徒 ;) Vielen Dank!以上是关于从 API 获取 JSON,将其添加到 sqlite3 数据库并自动获取下一页的主要内容,如果未能解决你的问题,请参考以下文章
使用php将json api结果以换行符分隔格式保存到json文件
我无法从 python 中的 JSON API 响应中获取值