【问题标题】:I can't get wanted parameters through the json response (web-scraping)我无法通过 json 响应(网络抓取)获得想要的参数
【发布时间】:2019-05-28 12:57:18
【问题描述】:

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

我有两个问题: - 首先,我想获取房屋的参数,例如(价格、区域、城市、邮政编码),但我不知道怎么做? - 其次,我想创建一个循环,将所有页面一直到第 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])

【问题讨论】:

    标签: python html json web-scraping


    【解决方案1】:

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

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

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

    页面是有效负载参数的一部分。要浏览页面,只需对其进行迭代。奇怪的是,当我尝试这样做时,不仅要遍历 pages,还要遍历 from 参数。 IE。因为我让它每页做 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      相关资源
      最近更新 更多