python requests json from url



>我正在使用python来抓取网址,例如在代码吹中

import requests
from bs4 import BeautifulSoup
import json
n_index = 10
base_link = 'http://xxx.xxx./getinfo?range=10&district_id=1&index='
for i in range (1,n_index+1):
    link = base_link+str(i)
    r = requests.get(link)
    pid = r.json()
    print (pid)

它返回十个结果就像这个打击

{'product_info': [{'pid': '1', 'product_type': '2'}]}
{'product_info': [{'pid': '2', 'product_type': '2'}]}
{'product_info': [{'pid': '3', 'product_type': '2'}]}
{'product_info': [{'pid': '4', 'product_type': '2'}]}
{'product_info': [{'pid': '5', 'product_type': '2'}]}
{'product_info': [{'pid': '6', 'product_type': '2'}]}
{'product_info': [{'pid': '7', 'product_type': '2'}]}
{'product_info': [{'pid': '8', 'product_type': '2'}]}
{'product_info': [{'pid': '9', 'product_type': '2'}]}
{'product_info': [{'pid': '10', 'product_type': '2'}]}

然后我想将生成的 10 行保存到 JSON 文件中,如下面的代码所示:

with open('sylist.json', 'w') as outfile:
    json.dump(r.json(), outfile, indent=4)

但是只有一个结果保存在本地的json文件中,谁可以帮助我解决,非常感谢

在典型的方式上,尝试以下方式逐行编写结果,而无需每次打开/关闭文件。

with open('sylist.json', 'a+') as outfile:
    for i in range (1,n_index+1):
        link = base_link+str(i)
        r = requests.get(link)
        outfile.write("{}n".format(json.dump(r.json(), outfile, indent=4)))

让我稍微扩展一下弗兰克的答案。您将在 for 循环内发送请求,这意味着在循环的每次迭代中,pid 的值都会被覆盖。因此,当您想要将其内容转储到输出文件时,pid 仅保存上次迭代/请求中的内容。我建议应用以下方法之一来解决您的问题:

  1. 在 for 循环中包含写入组件(反之亦然,如 Frank AK 的答案中所建议的那样(。
  2. 与其每次都覆盖 pid 的内容,不如直接将其附加到 for 循环中,如下所示:

    my_list = []
    for i in range (1,n_index+1):
        link = base_link+str(i)
        r = requests.get(link)
        pid = r.json()
        my_list.append(pid)
    with open('sylist.json', 'w') as outfile:
        json.dump(my_list, outfile, indent=4)
    

最新更新