我无法通过json响应(网络抓取)获取所需的参数

时间:2019-05-28 12:57:18

标签: python html json web-scraping

我正在尝试通过以下链接的json响应提取数据:https://www.bienici.com/recherche/achat/france?page=2

我有2个问题: -首先,我要刮擦房屋的参数,例如(价格,面积,城市,邮政编码),但我不知道如何? -其次,我想制作一个循环,使所有页面都达到第100页

这是程序:

const arr = [{
  "name": "a",
  "options": [{
      label: "b",
      value: 9,
      foodoption: [{ label: "c", value: 8 }, { label: "d", value: 6 }],
      selected1: [],
      show: false
    },

  ]},
  {
    "name": "aa",
    "options": [{
        label: "bb",
        value: 9,
        foodoption: [{ label: "cc", value: 88 }, { label: "dd", value: 66 }],
        selected2: [],
        show: false
      },
    ]}
];

const selected1 = arr[0].options[0].foodoption.map(opt => opt.label);
const selected2 = arr[1].options[0].foodoption.map(opt => opt.value);

console.log(selected1);
console.log(selected2);

1 个答案:

答案 0 :(得分:2)

嗨,我注意到的第一件事是您两次编写csv。一次使用writer,一次使用.to_csv()。根据您要尝试执行的操作,您不需要两者,但最终两者都可以。这取决于您如何遍历数据。

我个人喜欢与熊猫一起工作。我曾有人告诉我,存储临时数据帧并将其追加到“最终”数据帧有点过大,但这只是我很乐意做的,并且对它没有任何问题,因此我只是使用它。

要获取其他数据部分,您需要调查所有内容,并逐步通过json格式将其从json响应中提取(如果要使用csv writer的方法)。

页面是有效负载参数的一部分。要浏览页面,只需对其进行迭代即可。奇怪的是,当我尝试这样做时,不仅需要遍历pages,而且还必须遍历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