【问题标题】:Looping through Get Request in Python在 Python 中循环获取请求
【发布时间】:2018-08-01 15:29:04
【问题描述】:

我正在尝试使用 Stubhub 的 API 抓取一些票务库存信息,但我似乎无法弄清楚如何遍历 get 请求。

我基本上想循环多个事件。 eventid_list 是 eventid 的列表。我的代码如下:

inventory_url = 'https://api.stubhub.com/search/inventory/v2'

for eventid in eventid_list:
    data = {'eventid': eventid, 'rows':500}
    inventory = requests.get(inventory_url, headers=headers, params=data)
    inv = inventory.json()
    print(inv)

listing_df = pd.DataFrame(inv['listing'])

当我运行它时,数据框只返回一个事件的结果,而不是多个。我做错了什么?

编辑:print(inv) 输出如下内容:

{
    'eventId': 102994860, 
    'totalListings': 82, 
    'totalTickets': 236, 
    'minQuantity': 1, 
    'maxQuantity': 6, 
    'listing': [
        {
            'listingId': 1297697413, 
            'currentPrice': {'amount': 108.58, 'currency': 'USD'}, 
            'listingPrice': {'amount': 88.4, 'currency': 'USD'}, 
            'sectionId': 1638686, 
            'row': 'E', 
            'quantity': 6, 
            'sellerSectionName': 'FRONT MEZZANINE RIGHT', 
            'sectionName': 'Front Mezzanine Sides', 
            'seatNumbers': '2,4,6,8,10,12', 
            'zoneId': 240236, 
            'zoneName': 'Front Mezzanine', 
            'deliveryTypeList': [5], 
            'deliveryMethodList': [23, 24, 25], 
            'isGA': 0, 
            'dirtyTicketInd': False, 
            'splitOption': '2', 
            'ticketSplit': '1', 
            'splitVector': [1, 2, 3, 4, 6], 
            'sellerOwnInd': 0, 
            'score': 0.0
        }, 
        ...
        {
            'listingId': 1297697417, 
            'currentPrice': {'amount': 108.58, 'currency': 'USD'}, 
            'listingPrice': {'amount': 88.4, 'currency': 'USD'}, 
            'sectionId': 1638686, 
            'row': 'D', 
            'quantity': 3, 
            'sellerSectionName': 'FRONT MEZZANINE RIGHT', 
            'sectionName': 'Front Mezzanine Sides', 
            'seatNumbers': '2,4,6', 
            'zoneId': 240236, 
            'zoneName': 'Front Mezzanine', 
            'deliveryTypeList': [5], 
            'deliveryMethodList': [23, 24, 25], 
            'isGA': 0, 
            'dirtyTicketInd': False, 
            'splitOption': '2', 
            'ticketSplit': '1', 
            'splitVector': [1, 3], 
            'sellerOwnInd': 0, 
            'score': 0.0
        },
    ]
}

【问题讨论】:

  • listing_df = pd.DataFrame(inv['listing'])for 循环之外。 for eventid in eventid_list: 的所有迭代都完成(并被丢弃),然后当它完成时,您收集最后一个结果。你需要一些容器inside for 循环来收集inv = inventory.json() 的每个结果。只是缩进listing_df = pd.DataFrame(inv['listing']) 并不能解决这个问题。
  • 您可以打印inv 并用它更新您的问题吗?
  • @PauloScardine 我刚刚更新了我的问题!
  • @roganjosh 我该怎么做?
  • 为了重新解释@PauloScardine 的建议,他们要求某种具有代表性的输出。它是字典/列表/其他吗?我说的是“某个容器”,也许您可​​以将所有结果附加到 for 循环内的列表中,但我们并不真正知道您在使用什么。

标签: python api web-scraping get-request


【解决方案1】:

我猜inventory.json()['listing'] 是一个事件列表。如果是这样,你可以试试这个:

inventory_url = 'https://api.stubhub.com/search/inventory/v2'

def get_event(eventid):
    """Given an event id returns inventory['listing']"""
    data = {'eventid': eventid, 'rows':500}
    inventory = requests.get(inventory_url, headers=headers, params=data)
    return inventory.json().get('listing', [])

# Concatenate output of all events
events = itertools.flatten(get_event(eventid) for eventid in eventid_list)

listing_df = pd.DataFrame(list(events))

这只是一个起点,您将不得不处理inventory.statos_code != 200 的情况。结果可能不是很有用,因此您可能必须将列表项行currentPricelistingPrice 的一些属性扁平化:

【讨论】:

  • 这显然是一本字典,它使最终的 DataFrame 变得复杂:(
  • 看起来是一个字典列表。
  • 看起来是这样,但是将其翻译成有意义的 DF 并不总是那么简单。
  • 确实,OP 可能必须从 get_event 返回一个连贯的结构。
  • @PauloScardine 非常感谢您。这是一个很好的起点。不过,我一直得到这个。 AttributeError: module 'itertools' has no attribute 'flatten'。我可以改用属性“链”吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多