如何在Python中通过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
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

