You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中通过Discogs API按年份及无年份过滤搜索结果

解决Discogs API年份过滤及记录筛选问题

问题1解答

1.a) Discogs搜索API支持年份范围预过滤,但无法一次同时返回「1991-1994年」和「无发行年份」的记录——因为API不支持混合OR条件的筛选。你可以分两次独立搜索获取目标数据:

  • 第一次指定年份范围搜索,直接拿到符合1991-1994的记录:
    # 搜索1991-1994年的发行版/母版记录
    results_year_range = d.search('My Special Love Song', year='1991-1994', type=['release', 'master'])
    
  • 第二次搜索所有匹配关键词的记录,之后在本地筛选出没有年份信息的条目(API无法直接筛选空年份内容)。

1.b) 无法通过API预过滤直接获取无发行年份的记录。你需要先获取所有匹配关键词的搜索结果,再在本地筛选year字段为空的条目,示例代码:

all_results = d.search('My Special Love Song', type=['release', 'master'])
no_year_records = []

# 遍历所有分页结果
for page_num in range(1, all_results.pages + 1):
    for item in all_results.page(page_num):
        # 检查是否无年份信息
        if not getattr(item, 'year', None):
            no_year_records.append(item)

问题2解答

如果API预过滤满足不了需求,确实需要先获取所有搜索结果的ID,再逐个查询详情验证年份信息,这个方案是可行的,但要注意遵守Discogs的API速率限制:

  • 带有用户令牌的请求,速率限制为60次/分钟,所以循环查询详情时,需要添加延时(比如每次请求后sleep(1)),避免触发限制被封禁。
  • 完整工作流示例:

import discogs_client
import time
import csv

d = discogs_client.Client('my_user_agent/1.0', user_token='MYTOKENISHERE')
all_results = d.search('My Special Love Song', type=['release', 'master'])
valid_ids = []

遍历所有分页的搜索结果

for page_num in range(1, all_results.pages + 1):
for item in all_results.page(page_num):
time.sleep(1) # 遵守速率限制
try:
# 获取记录详情
detail = item.fetch()
# 过滤条件:无年份 或 年份在1991-1994之间
if (not detail.year) or (1991 <= detail.year <= 1994):
valid_ids.append(detail.id)
except Exception as e:
print(f"获取ID {item.id} 详情失败: {e}")
continue

将符合条件的ID写入CSV

with open('valid_discogs_ids.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['Discogs_ID'])
for discogs_id in valid_ids:
writer.writerow([discogs_id])

- 若搜索结果量级较大,这个过程会耗时较长,但只要严格遵守速率限制,Discogs不会封禁你的请求。

---
内容的提问来源于stack exchange,提问作者the_t_test_1
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 23:32:54