【问题标题】:Fetching JSON from API, adding it to sqlite3 database and automatically fetching the next page从 API 获取 JSON,将其添加到 sqlite3 数据库并自动获取下一页
【发布时间】: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)

【问题讨论】:

    标签: python json sqlite


    【解决方案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!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 2021-10-15
    • 2020-07-31
    • 1970-01-01
    相关资源
    最近更新 更多