我传递一个id值到API URL以获得JSON响应,但只得到一个响应,其余的都抛出500个错误。我收集列表中的id,并将id作为while循环中的参数传递给API URL以提取数据。
###Get id in a variable##
df_filter=spark.sql("""select distinct ID from filter_view""")
rdd = df_filter.rdd
listOfRows = rdd.collect()
counter = 0
##total_results = []
while counter < len(listOfRows):
url += '?ids=' + listOfRows[counter].ID
response = requests.get(url,headers=headers)
if response.status_code == 200:
json_response = response.json()
##total_results.append(json_response)
df2 = pd.json_normalize(json_response, record_path=['entities'])
display(df2)
else:
print("Error: HTTP status code " + str(response.status_code))
counter +=1
我只得到一个ID的输出,其余的都以500个错误结束。
所需输出:
ID---ItemID--Details
1 100 text
1 101 text
2 200 text
2 300 text
3 400 sometext
3 500 sometext
我得到的输出:
ID---ItemID--Details
1 100 text
1 101 text
Error: HTTP status code 500
Error: HTTP status code 500
Error: HTTP status code 500
Error: HTTP status code 500
Error: HTTP status code 500
Error: HTTP status code 500
1条答案
按热度按时间zpgglvta1#
第一次迭代生成一个有效的URL:
baseURL/?ids=1
,但由于它是使用连接和赋值构建的,所以当需要baseURL/?ids=2
时,第二次迭代会生成baseURL/?ids=1?ids=2
。API是否支持在单个请求中获取多个资源?通常,对于像
ids
这样的复数查询参数,它将采用逗号分隔的资源ID列表(?ids=1,2,3
)或数组(?ids[]=1&ids[]=2&ids[]=3
或?ids=1&ids=2&ids=3
)。如果是这样的话,发出这样一个请求会更有效率,对API提供者来说也更有礼貌。您可能需要更改代码以解析新响应。
如果不支持多个GET,至少将其转换为for循环。不需要跟踪
counter
并测试counter < len(listOfRows)
,这将提高可读性。更新:基于评论
我有超过5000个身份证,需要通过一个接一个。这怎么能在一个20块的块中传递呢?
构建
...?ids=1&ids=2&ids=3...
的URL,每个URL不超过20个id。chunker()
会将一个可迭代对象拆分为list
s,长度〈=chunksize
。第一个过滤器listOfRows
仅用于ID。然后将ID分块为长度为20的list
s。创建URL并发出请求。感谢kafran的chunker()
。