首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我无法通过json响应(web-scraping)获得想要的参数。

我无法通过json响应(web-scraping)获得想要的参数。
EN

Stack Overflow用户
提问于 2019-05-28 12:57:18
回答 1查看 122关注 0票数 0

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

我有两个问题:首先,我想刮一个房子的护理人员,比如(价格、面积、城市、邮政编码),但我不知道怎么做?-第二,我想做一个循环,把所有的页面都翻到100页

这是一个节目:

代码语言:javascript
运行
复制
 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])
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-28 14:56:18

嗨,我注意到的第一件事是你写了两遍csv。一次是writer,一次是.to_csv()。根据你想要做的事情,你不需要两者都需要,但最终两者都会成功。这取决于您是如何迭代数据的。

就我个人而言,我喜欢和熊猫合作。有人告诉我,存储临时数据文件并附加到“最终”数据文件中是有点过分的做法,但这正是我喜欢做的事情,也没有问题,所以我就用了它。

要获得其他数据部分,您需要研究所有的数据部分,并通过json格式将其从json响应中提取出来(如果您正在使用csv编写器的话)。

这些页面是有效负载参数的一部分。要浏览页面,只需迭代它。奇怪的是,当我尝试时,您不仅必须遍历pages,而且还要迭代from参数。即。因为我让它每页做60次,第1页从0,第2页是从60,第3页是从120,等等,所以如果它迭代那些倍数60 (它似乎得到它)。有时,可以看到您将迭代多少页,但我找不到它,因此只需将其作为一次尝试/除了,所以当它到达末尾时,它将中断循环。唯一的缺点是,它可能会在之前画出一个意想不到的错误,导致它过早停止.我并没有对此做太多的调查,只是作为一个副词。

所以看起来像这样(可能需要一段时间才能浏览完所有的页面,所以我只做了1-10美元):

还可以在保存到csv之前,操作dataframe,只保留所需的列:

代码语言:javascript
运行
复制
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)

输出:

代码语言:javascript
运行
复制
    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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56342829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档