从 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 数据库并自动获取下一页的主要内容,如果未能解决你的问题,请参考以下文章

从 API 获取数据,然后将其发送到 EJS 文件

Flutter 从列表中获取所有数据到 json

使用php将json api结果以换行符分隔格式保存到json文件

我无法从 python 中的 JSON API 响应中获取值

如何通过 Protractor 使用 vanilla JS 从 API 获取 json

.NET Core:从 API JSON 响应中删除空字段