Python:将AJAX响应数据保存到.json并将其保存到pandas DataFrame

时间:2019-02-26 04:50:04

标签: python json pandas dataframe

您好,感谢您抽出宝贵的时间对此进行阅读,

我正在寻找从特定证券交易所中提取公司信息,然后将该信息保存到pandas DataFrame中。 每个公司都有自己的网页,这些网页均由“ KodeEmiten”结尾确定。这些代码保存在第一个数据框的列中:
 df = pd.DataFrame.from_dict(data['data'])

现在我的目标是使用这些代码分别调用每个公司的网站,并为每个公司创建一个json文件

for i in range (len(df)): 
 requests.get(f'https://www.idx.co.id/umbraco/Surface/ListedCompany/GetCompanyProfilesDetail?emitenType=&kodeEmiten={df.loc[i, "KodeEmiten"]}').json()  

虽然这可行,但是由于列表索引超出范围和不正确的关键字错误,我无法将其保存到新的DataFrame中。 xhr中的信息明显多于我实际需要的信息,我认为不同的结构是导致尝试将它们保存到新的DataFrame时出错的原因。我真的很想在这些xhr标头中获取数据:
   AnakPerusahaan:,Direktur:,Komisaris,PemegangSaham:

所以我的问题是二合一的:
a)我怎样才能从那些特定的xhr标头(它们都是表)中提取信息?
b)如何将它们保存到新的数据框(甚至我并不介意列出)

import requests
import pandas as pd
import json
import time

# gets broad data of main page of the stock exchange
sxow = requests.get('https://www.idx.co.id/umbraco/Surface/ListedCompany/GetCompanyProfiles?draw=1&columns%5B0%5D%5Bdata%5D=KodeEmiten&columns%5B0%5D%5Bname%5D&columns%5B0%5D%5Bsearchable%5D=true&columns%5B0%5D%5Borderable%5D=false&columns%5B0%5D%5Bsearch%5D%5Bvalue%5D&columns%5B0%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B1%5D%5Bdata%5D=KodeEmiten&columns%5B1%5D%5Bname%5D&columns%5B1%5D%5Bsearchable%5D=true&columns%5B1%5D%5Borderable%5D=false&columns%5B1%5D%5Bsearch%5D%5Bvalue%5D&columns%5B1%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B2%5D%5Bdata%5D=NamaEmiten&columns%5B2%5D%5Bname%5D&columns%5B2%5D%5Bsearchable%5D=true&columns%5B2%5D%5Borderable%5D=false&columns%5B2%5D%5Bsearch%5D%5Bvalue%5D&columns%5B2%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B3%5D%5Bdata%5D=TanggalPencatatan&columns%5B3%5D%5Bname%5D&columns%5B3%5D%5Bsearchable%5D=true&columns%5B3%5D%5Borderable%5D=false&columns%5B3%5D%5Bsearch%5D%5Bvalue%5D&columns%5B3%5D%5Bsearch%5D%5Bregex%5D=false&start=0&length=700&search%5Bvalue%5D&search%5Bregex%5D=false&_=155082600847')

data = sxow.json() # save the request as .json file
df = pd.DataFrame.from_dict(data['data']) #creates DataFrame based on the data (.json) file


# add: compare file contents and overwrite original if same

cdate = time.strftime ("%Y%m%d") # creating string-variable w/ current date year|month|day
df.to_excel(f"{cdate}StockExchange_Overview.xlsx") # converts DataFrame to Excel file, can't overwrite existing file


for i in range (len(df)) :
    requests.get(f'https://www.idx.co.id/umbraco/Surface/ListedCompany/GetCompanyProfilesDetail?emitenType=&kodeEmiten={df.loc[i, "KodeEmiten"]}').json()

#This is where I'm completely stuck

2 个答案:

答案 0 :(得分:1)

您不需要将结果转换为数据框。您可以遍历json对象并连接url,以获得其他公司的网站详细信息。

遵循以下代码:

import requests
import pandas as pd
import json
import time

# gets broad data of main page of the stock exchange
sxow = requests.get('https://www.idx.co.id/umbraco/Surface/ListedCompany/GetCompanyProfiles?draw=1&columns%5B0%5D%5Bdata%5D=KodeEmiten&columns%5B0%5D%5Bname%5D&columns%5B0%5D%5Bsearchable%5D=true&columns%5B0%5D%5Borderable%5D=false&columns%5B0%5D%5Bsearch%5D%5Bvalue%5D&columns%5B0%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B1%5D%5Bdata%5D=KodeEmiten&columns%5B1%5D%5Bname%5D&columns%5B1%5D%5Bsearchable%5D=true&columns%5B1%5D%5Borderable%5D=false&columns%5B1%5D%5Bsearch%5D%5Bvalue%5D&columns%5B1%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B2%5D%5Bdata%5D=NamaEmiten&columns%5B2%5D%5Bname%5D&columns%5B2%5D%5Bsearchable%5D=true&columns%5B2%5D%5Borderable%5D=false&columns%5B2%5D%5Bsearch%5D%5Bvalue%5D&columns%5B2%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B3%5D%5Bdata%5D=TanggalPencatatan&columns%5B3%5D%5Bname%5D&columns%5B3%5D%5Bsearchable%5D=true&columns%5B3%5D%5Borderable%5D=false&columns%5B3%5D%5Bsearch%5D%5Bvalue%5D&columns%5B3%5D%5Bsearch%5D%5Bregex%5D=false&start=0&length=700&search%5Bvalue%5D&search%5Bregex%5D=false&_=155082600847')

data = sxow.json() # save the request as .json file

list_of_json = []
for nested_json in data['data']:
    list_of_json.append(requests.get('https://www.idx.co.id/umbraco/Surface/ListedCompany/GetCompanyProfilesDetail?emitenType=&kodeEmiten='+nested_json['KodeEmiten']).json())
    time.sleep(1)

list_of_json将包含您请求的所有json结果。

这里nested_json是循环变量,用于循环遍历不同 KodeEmiten 的json数组。

答案 1 :(得分:1)

这与@bigbounty的方法相比有一点改进:
由于目标是将信息保存到列表中,然后在脚本中进一步使用该列表,因此 list理解实际上要快一些。

list_of_json = [requests.get('url+nested_json["KodeEmiten"]).json() for nested_json in data["data"]]'