如何使用python请求获取所有响应?

时间:2016-01-06 08:37:16

标签: python pandas python-requests

使用此代码

import pandas as pd
import requests

link = "http://sp.kaola.com/api/category/goods?pageNo=1&pageSize=20&search=%7B%0A%20%20%22sortType%22%20%3A%20%7B%0A%20%20%20%20%22type%22%20%3A%200%0A%20%20%7D%2C%0A%20%20%22isNavigation%22%20%3A%20%220%22%2C%0A%20%20%22filterTypeList%22%20%3A%20%5B%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22id%22%20%3A%20%5B%0A%20%20%20%20%20%20%20%204055%0A%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%22type%22%20%3A%201%2C%0A%20%20%20%20%20%20%22category%22%20%3A%20%7B%0A%20%20%20%20%20%20%20%20%22parentCategoryId%22%20%3A%200%2C%0A%20%20%20%20%20%20%20%20%22categoryId%22%20%3A%204055%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%5D%2C%0A%20%20%22source%22%20%3A%201%2C%0A%20%20%22noStoreCount%22%20%3A%200%2C%0A%20%20%22isActivity%22%20%3A%200%2C%0A%20%20%22storeCount%22%20%3A%2060%0A%7D"
df = reqeusts.get(link).json()
print df

我可以获得我正在查询的网址的响应。

但是如何从url的GET arg变为pageNo = 3,4等等时获取数据? 我希望在一个请求中获取所有页面的所有响应。如果可能的话?

在每个页面中,我可以得到20个回复。我怎样才能得到所有这些?

更新

我使用此方法来清除json:

from pandas.io.json import json_normalize
df1 = df['body']
df_final = json_normalize(df1['result'],'goodsList')

我如何才能将所有响应只收集到一个数据帧中?

1 个答案:

答案 0 :(得分:0)

在一个页面上获取所有回复似乎不可能。这是你无法控制的,只有制作网站的人才能控制。

但是,您可以做的是遍历搜索结果的页面并将它们添加到一起。我注意到你有一个hasMore变量,它告诉你是否有更多的搜索结果。这给出了这样的东西:

import requests

link = "http://sp.kaola.com/api/category/goods?pageSize=20&search=%7B%0A%20%20%22sortType%22%20%3A%20%7B%0A%20%20%20%20%22type%22%20%3A%200%0A%20%20%7D%2C%0A%20%20%22isNavigation%22%20%3A%20%220%22%2C%0A%20%20%22filterTypeList%22%20%3A%20%5B%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22id%22%20%3A%20%5B%0A%20%20%20%20%20%20%20%204055%0A%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%22type%22%20%3A%201%2C%0A%20%20%20%20%20%20%22category%22%20%3A%20%7B%0A%20%20%20%20%20%20%20%20%22parentCategoryId%22%20%3A%200%2C%0A%20%20%20%20%20%20%20%20%22categoryId%22%20%3A%204055%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%5D%2C%0A%20%20%22source%22%20%3A%201%2C%0A%20%20%22noStoreCount%22%20%3A%200%2C%0A%20%20%22isActivity%22%20%3A%200%2C%0A%20%20%22storeCount%22%20%3A%2060%0A%7D"
max_pages = 100
data = {}

for page_no in range(max_pages):
    try:
        req = reqeusts.get(link + "&pageNo=" + str(page_no))
    except reqeusts.ConnectionError:
        break # Stop loop if the url was not found.

    df = req.json()
    if df["body"]["result"]["hasMore"] == 0:
        break # Page says it has no more results

    # Here, add whatever data you want to save from df to data