Python 我能';t通过json响应获取想要的参数(web抓取)

Python 我能';t通过json响应获取想要的参数(web抓取),python,html,json,web-scraping,Python,Html,Json,Web Scraping,我试图通过此链接的json响应提取数据: 我有两个问题: -首先,我想知道房子的参数,比如(价格、面积、城市、邮编),但我不知道怎么做? -第二,我想做一个循环,将所有页面一直循环到第100页 以下是节目: import requests from pandas.io.json import json_normalize import csv payload = {'filters': '{"size":24,"from":0,"filterType":"buy","newProper

我试图通过此链接的json响应提取数据:

我有两个问题: -首先,我想知道房子的参数,比如(价格、面积、城市、邮编),但我不知道怎么做? -第二,我想做一个循环,将所有页面一直循环到第100页

以下是节目:

 import requests
 from pandas.io.json import json_normalize
 import csv

 payload = {'filters': '{"size":24,"from":0,"filterType":"buy","newProperty":false,"page":2,"resultsPerPage":24,"maxAuthorizedResults":2400,"sortBy":"relevance","sortOrder":"desc","onTheMarket":[true],"limit":"ih{eIzjhZ?q}qrAzaf}AlrD?rvfrA","showAllModels":false,"blurInfoType":["disk","exact"]}'}

 url = 'https://www.bienici.com/realEstateAds.json'  
 response = requests.get(url, params = payload).json()
 with open("selog.csv", "w", newline="") as f:
     writer = csv.writer(f)

     for prop in response['realEstateAds']:
         title = prop['title']
         city = prop['city']
         desc = prop['description']
         price = prop['price']

         df = json_normalize(response['realEstateAds'])
         df.to_csv('selog.csv', index=False)
         writer.writerow([price,title,city,desc])

嗨,我注意到的第一件事是你写了两次csv。一次使用
writer
,一次使用
.to_csv()
。取决于你想做什么,你不需要两者兼而有之,但最终两者都会起作用。这取决于你如何迭代数据

就我个人而言,我喜欢和熊猫一起工作。我曾有人告诉我,存储临时数据帧并附加到“最终”数据帧有点过分,但这正是我喜欢做的,而且没有问题,所以我就用了它

要获取其他数据部分,您需要调查所有内容,并通过json格式将其从json响应中提取出来(如果您使用csv编写器)

页面是有效负载参数的一部分。要浏览页面,只需迭代即可。奇怪的是,当我尝试这样做时,不仅要遍历
页面
,还要遍历
from
参数。也就是说,因为我让它每页做60次,所以第1页是从0开始的,第2页是从60开始的,第3页是从120开始的,等等。所以让它迭代那些60的倍数(似乎得到了它)。有时可以看到您将遍历多少页,但我找不到它,所以只将其作为一个try/except,这样当它到达末尾时,它将打破循环。唯一的缺点是,它可能会产生一个以前没有预料到的错误,导致它提前停止。我没有过多地研究那件事,只是作为旁注

所以它看起来像这样(可能需要一段时间来浏览所有页面,所以我只做了第1-10页$:

您还可以在保存到csv之前,对数据帧进行处理,以仅保留所需的列:

import requests
import pandas as pd
from pandas.io.json import json_normalize

tot_pages = 10

url = 'https://www.bienici.com/realEstateAds.json'  

results_df = pd.DataFrame()

for page in range(1, tot_pages+1):

    try:
        payload = {'filters': '{"size":60,"from":%s,"filterType":"buy","newProperty":false,"page":%s,"resultsPerPage":60,"maxAuthorizedResults":2400,"sortBy":"relevance","sortOrder":"desc","onTheMarket":[true],"limit":"ih{eIzjhZ?q}qrAzaf}AlrD?rvfrA","showAllModels":false,"blurInfoType":["disk","exact"]}' %((60 * (page-1)), page)}
        response = requests.get(url, params = payload).json()

        print ('Processing Page: %s' %page)
        temp_df = json_normalize(response['realEstateAds'])

        results_df = results_df.append(temp_df).reset_index(drop=True)
    except:
        print ('No more pages.')
        break

# To Filter out to certain columns, un-comment below
#results_df = results_df[['city','district.name','postalCode','price','propertyType','surfaceArea','bedroomsQuantity','bathroomsQuantity']]

results_df.to_csv('selog.csv', index=False)
输出:

    print(results_df.head(5).to_string())
             city                    district.name postalCode   price propertyType  surfaceArea  bedroomsQuantity  bathroomsQuantity
0        Colombes   Colombes - Fossés Jean Bouvier      92700  469000         flat        92.00               3.0                1.0
1            Nice   Nice - Parc Impérial - Le Piol      06000  215000         flat        49.05               1.0                NaN
2            Nice                  Nice - Gambetta      06000  145000         flat        21.57               0.0                NaN
3  Cagnes-sur-Mer  Cagnes-sur-Mer - Les Bréguières      06800  770000        house       117.00               3.0                3.0
4             Pau                  Pau - Le Hameau      64000  310000        house       110.00               3.0                2.0

您好,我注意到的第一件事是您编写了两次csv。一次是使用
writer
,一次是使用
。to_csv()
。根据您尝试执行的操作,您不需要同时使用这两种方法,但最终两者都会起作用。这取决于您对数据的迭代方式

就我个人而言,我喜欢和熊猫一起工作。我有人告诉我,存储临时数据帧并附加到“最终”数据帧有点过分,但这正是我喜欢做的,并且没有问题,所以我只是使用了它

要获取其他数据部分,您需要调查所有内容,并通过json格式将其从json响应中提取出来(如果您使用csv编写器)

页面是有效负载参数的一部分。要遍历页面,只需迭代即可。奇怪的是,当我尝试这样做时,不仅要遍历
页面
,还要遍历
from
参数。也就是说,因为我让它每页执行60次,所以第1页是从0开始的,第2页是从60开始的,第3页是从120开始的,等等通过60的倍数(似乎得到了)。有时可以看到您将遍历多少页,但我找不到它,所以只需将其作为一个尝试/例外,这样当它到达末尾时,它将打破循环。唯一的缺点是,它可能会得出一个以前意想不到的错误,导致它提前停止。我没有过多研究它,只是作为一个旁注

所以它看起来像这样(可能需要一段时间来浏览所有页面,所以我只做了第1-10页$:

您还可以在保存到csv之前,对数据帧进行处理,以仅保留所需的列:

import requests
import pandas as pd
from pandas.io.json import json_normalize

tot_pages = 10

url = 'https://www.bienici.com/realEstateAds.json'  

results_df = pd.DataFrame()

for page in range(1, tot_pages+1):

    try:
        payload = {'filters': '{"size":60,"from":%s,"filterType":"buy","newProperty":false,"page":%s,"resultsPerPage":60,"maxAuthorizedResults":2400,"sortBy":"relevance","sortOrder":"desc","onTheMarket":[true],"limit":"ih{eIzjhZ?q}qrAzaf}AlrD?rvfrA","showAllModels":false,"blurInfoType":["disk","exact"]}' %((60 * (page-1)), page)}
        response = requests.get(url, params = payload).json()

        print ('Processing Page: %s' %page)
        temp_df = json_normalize(response['realEstateAds'])

        results_df = results_df.append(temp_df).reset_index(drop=True)
    except:
        print ('No more pages.')
        break

# To Filter out to certain columns, un-comment below
#results_df = results_df[['city','district.name','postalCode','price','propertyType','surfaceArea','bedroomsQuantity','bathroomsQuantity']]

results_df.to_csv('selog.csv', index=False)
输出:

    print(results_df.head(5).to_string())
             city                    district.name postalCode   price propertyType  surfaceArea  bedroomsQuantity  bathroomsQuantity
0        Colombes   Colombes - Fossés Jean Bouvier      92700  469000         flat        92.00               3.0                1.0
1            Nice   Nice - Parc Impérial - Le Piol      06000  215000         flat        49.05               1.0                NaN
2            Nice                  Nice - Gambetta      06000  145000         flat        21.57               0.0                NaN
3  Cagnes-sur-Mer  Cagnes-sur-Mer - Les Bréguières      06800  770000        house       117.00               3.0                3.0
4             Pau                  Pau - Le Hameau      64000  310000        house       110.00               3.0                2.0