From 328f1e91a1541edffd69625ff5dd114dc13b5f05 Mon Sep 17 00:00:00 2001 From: eezd Date: Wed, 4 Nov 2026 22:39:56 +0800 Subject: [PATCH] Respect Fed release dates and policy document layouts Filter discovery links against both realtime and historical date boundaries, keep date-only cutoff days, and use the official calendar release date for FOMC minutes. Parse implementation note and projection headings and replay real Fed discovery and policy bodies without external I/O. --- backend/src/alphapulse/core/us_news.py | 8 +- .../alphapulse/crawler/spiders/us_official.py | 32 ++++-- .../fixtures/us_news/fed_materials.json.gz | Bin 0 -> 66899 bytes backend/tests/test_us_official_news.py | 93 ++++++++++++++++++ deploy/README.md | 5 + 5 files changed, 128 insertions(+), 10 deletions(-) create mode 100644 backend/tests/fixtures/us_news/fed_materials.json.gz diff --git a/backend/src/alphapulse/core/us_news.py b/backend/src/alphapulse/core/us_news.py index 1383b92..51f2e0d 100644 --- a/backend/src/alphapulse/core/us_news.py +++ b/backend/src/alphapulse/core/us_news.py @@ -105,11 +105,11 @@ def validate_body(content: str) -> None: raise ValueError('官方正文为空或过短') -def article(source: str, html: str, url: str) -> dict: +def article(source: str, html: str, url: str, *, release_date: str | None = None) -> dict: sel = Selector(html) validate_body(html) selectors = { - 'fed': ('#article h3.title', '#article h3', '#article h2'), + 'fed': ('#article h3.title', '#article h3', '#article h2', '#content .heading h3', '#content .col-xs-12.col-sm-8.col-md-8 h3'), 'treasury': ('h2.uswds-page-title',), 'cftc': ('article h1:not(.press-release-title)',), }.get(source, ('.main-content__main h1', '#main_content h1', 'main h1', 'h1')) @@ -133,6 +133,10 @@ def article(source: str, html: str, url: str) -> dict: values.insert(0, '-'.join(m.groups())) if source == 'ofac' and (m := re.search(r'/recent-actions/(\d{4})(\d{2})(\d{2})', url)): values.insert(0, '-'.join(m.groups())) + if source == 'fed' and '/monetarypolicy/fomcminutes' in url: + if release_date is None: + raise ValueError('FOMC 纪要缺少官方日历发布日期') + values = [release_date] at = precision = None for value in values: try: diff --git a/backend/src/alphapulse/crawler/spiders/us_official.py b/backend/src/alphapulse/crawler/spiders/us_official.py index 94dc9ea..9d30fa1 100644 --- a/backend/src/alphapulse/crawler/spiders/us_official.py +++ b/backend/src/alphapulse/crawler/spiders/us_official.py @@ -237,12 +237,30 @@ class USOfficialSpider(NewsSpider): except ValueError: continue if re.search(pattern, urlsplit(url).path) and url not in SOURCES[self.name].entries and not re.search(r'/\d{4}-(?:press|speeches|testimony)\.htm$', urlsplit(url).path) and not url.lower().endswith('.pdf'): - docs.append({'url': url, 'kind': 'article'}) + doc = {'url': url, 'kind': 'article'} + if self.name == 'fed' and '/monetarypolicy/fomcminutes' in url: + # The URL identifies the meeting; the calendar gives the release day. + match = re.search(r'Released\s+([A-Za-z]+ \d{1,2}, \d{4})', a.xpath('normalize-space(parent::*)').get() or '') + if not match: + raise ValueError('FOMC 纪要链接缺少官方发布日期') + doc.update(release_date=published(match[1])[0].date().isoformat(), release_date_source=response.url) + docs.append(doc) if a.attrib.get('rel') == 'next' or re.match(r'^(?:Next|Next page|下一页)', a.xpath('normalize-space(.)').get() or '', re.I): next_url = url docs = list({d['url']: d for d in docs}.values()) if not docs: raise ValueError('官方列表未发现文档,不能认定历史遍历完成') + if self.name == 'fed': + begin = self.run.history_target if lane == 'history' else self.run.cutoff + def in_range(doc): + if doc.get('release_date'): + day = published(doc['release_date'])[0].date() + elif match := re.search(r'((?:19|20)\d{6})', doc['url']): + day = datetime.strptime(match[1], '%Y%m%d').date() + else: + return True + return day >= begin.date() + docs = [doc for doc in docs if in_range(doc)] if lane == 'realtime': # OFAC's recent-actions entry is a descending day-indexed feed. if self.name == 'ofac' and docs: @@ -253,11 +271,6 @@ class USOfficialSpider(NewsSpider): threshold = (self.run.started_at - timedelta(hours=24)).timestamp() self.cursor['checked'] = {k: v for k, v in checked.items() if v >= threshold} docs = [d for d in docs if self.cursor['checked'].get(d['url'], 0) < threshold] - if self.name == 'fed': - def recent(d): - found = re.search(r'(202[5-9]\d{4})', d['url']) - return not found or datetime.strptime(found[1], '%Y%m%d').replace(tzinfo=UTC) >= self.run.cutoff - docs = [d for d in docs if recent(d)] if next_url and official_url(self.name, next_url, response.url) == response.url: raise ValueError('官方列表翻页重复当前页面,未推进断点') visited = state.setdefault('visited_pages', []) @@ -431,7 +444,9 @@ class USOfficialSpider(NewsSpider): if doc.get('pdf'): parsed['extra']['attachments'].append({'url': official_url(self.name, doc['pdf']), 'title': 'Official PDF', 'status': 'pending'}) else: - parsed = article(self.name, response.text, response.url) + parsed = article(self.name, response.text, response.url, release_date=doc.get('release_date')) + if doc.get('release_date'): + parsed['extra'].update(published_at_basis='official_calendar_release', published_at_source=doc['release_date_source']) if doc.get('bill'): context = self.cursor[lane]['bill'] context['bodies'] += 1 @@ -446,7 +461,8 @@ class USOfficialSpider(NewsSpider): begin = self.run.history_target if lane == 'history' else self.run.cutoff if doc.get('attachment_retry') or (doc.get('bill') and self.cursor[lane]['bill'].get('retry')): begin = datetime(2025, 1, 1, tzinfo=UTC) - if parsed['published_at'] < begin: + outside_range = parsed['published_at'].date() < begin.date() if parsed['extra'].get('published_at_precision') == 'date' else parsed['published_at'] < begin + if outside_range: self.run.stats['outside_range'] = self.run.stats.get('outside_range', 0) + 1 for result in self.complete(lane): yield result diff --git a/backend/tests/fixtures/us_news/fed_materials.json.gz b/backend/tests/fixtures/us_news/fed_materials.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..69fbd8cf29a45f5738aeae93350d9a156c1a5652 GIT binary patch literal 66899 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�gP##RyC@W% 0 +def test_fed_realtime_completes_all_real_discovery_entries(trading, monkeypatch): + from dataclasses import replace + import gzip + from pathlib import Path + samples = json.loads(gzip.decompress((Path(__file__).parent / 'fixtures/us_news/fed_archives.json.gz').read_bytes())) + bodies = {s['url']: s['body'] for s in samples} + monkeypatch.setitem(SOURCES, 'fed', replace(SOURCES['fed'], entries=tuple(bodies))) + obj = spider(trading, 'fed') + requests = obj.first_requests() + visited = [] + while requests: + request = requests.pop() + if request.meta.get('document'): + assert '2024' not in request.url + requests.extend(obj.complete('realtime')) + else: + assert request.url not in visited + visited.append(request.url) + requests.extend(obj.parse_listing(response(request.url, bodies[request.url], lane='realtime'))) + assert visited == list(SOURCES['fed'].entries) + assert obj.cursor['realtime'] == {'entry': 0} + assert not obj.run.errors + + +@pytest.mark.parametrize('lane', ['history', 'realtime']) +def test_fed_discovery_respects_old_and_boundary_dates(trading, lane): + obj = spider(trading, 'fed') + obj.run.cutoff = datetime(2026, 11, 1, 15, tzinfo=UTC) + body = '

FOMC

' + ''.join( + f'Note' + for day in ('20240131', '20251031', '20261101') + ) + list(obj.parse_listing(response('https://www.federalreserve.gov/monetarypolicy/fomccalendars.htm', body, lane=lane))) + pending = obj.cursor[lane]['pending'] + assert all('20240131' not in doc['url'] for doc in pending) + assert any('20261101' in doc['url'] for doc in pending) + assert any('20251031' in doc['url'] for doc in pending) is (lane == 'history') + + +@pytest.mark.parametrize('lane', ['history', 'realtime']) +def test_fed_minutes_use_official_release_day_instead_of_meeting_day(trading, monkeypatch, lane): + import gzip + from pathlib import Path + samples = json.loads(gzip.decompress((Path(__file__).parent / 'fixtures/us_news/fed_archives.json.gz').read_bytes())) + sample = next(s for s in samples if 'fomccalendars' in s['url']) + obj = spider(trading, 'fed') + obj.run.cutoff = obj.run.history_target = datetime(2026, 2, 18, 15, tzinfo=UTC) + list(obj.parse_listing(response(sample['url'], sample['body'], lane=lane))) + doc = next(d for d in obj.cursor[lane]['pending'] if 'fomcminutes20260128.htm' in d['url']) + assert doc['release_date'] == '2026-02-18' + assert doc['release_date_source'] == sample['url'] + bodies = json.loads(gzip.decompress((Path(__file__).parent / 'fixtures/us_news/fed_materials.json.gz').read_bytes())) + body = next(s['body'] for s in bodies if s['url'] == doc['url']) + from alphapulse.crawler.spiders import us_official + class Session: + async def __aenter__(self): return self + async def __aexit__(self, *args): pass + async def scalar(self, query): return None + monkeypatch.setattr(us_official, 'SessionLocal', Session) + monkeypatch.setattr(obj, 'attach_or_finish', lambda parsed, lane: iter([parsed])) + async def collect(): + return [p async for p in obj.parse_document(response(doc['url'], body, lane=lane, document=doc))] + parsed, = asyncio.run(collect()) + assert parsed['published_at'] == datetime(2026, 2, 18, tzinfo=UTC) + assert parsed['extra']['published_at_basis'] == 'official_calendar_release' + assert parsed['extra']['published_at_source'] == sample['url'] + + +def test_fed_minutes_missing_release_date_fail_explicitly(trading): + obj = spider(trading, 'fed') + body = '

FOMC

HTML' + with pytest.raises(ValueError, match='官方发布日期'): + list(obj.parse_listing(response(SOURCES['fed'].entries[-2], body, lane='history'))) + + +def test_fed_real_policy_bodies_have_titles_and_publication_dates(): + import gzip + from pathlib import Path + samples = json.loads(gzip.decompress((Path(__file__).parent / 'fixtures/us_news/fed_materials.json.gz').read_bytes())) + for sample in samples: + is_minutes = '/fomcminutes' in sample['url'] + if is_minutes: + with pytest.raises(ValueError, match='官方日历发布日期'): + article('fed', sample['body'], sample['url']) + with pytest.raises(ValueError, match='可识别的发布时间'): + article('fed', sample['body'], sample['url'], release_date='invalid') + parsed = article('fed', sample['body'], sample['url'], release_date=sample['published_date'] if is_minutes else None) + assert parsed['title'] == sample['title'] + assert parsed['published_at'].date().isoformat() == sample['published_date'] + assert parsed['extra']['published_at_precision'] == 'date' + assert len(parsed['content_html']) > 1000 + + def test_fifty_real_public_documents_parse_without_io(): import gzip from pathlib import Path diff --git a/deploy/README.md b/deploy/README.md index 2998c4f..948bfaa 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -289,6 +289,11 @@ discovery responses were captured on 2026-11-04: the 2025/2026 press, speech and testimony archives, FOMC calendars and H.4.1 release dates. Their offline regression checks configured entry URLs and article discovery; Fed speech archives use the singular `speech/` directory. +Three captured policy bodies cover implementation notes, economic projections +and meeting minutes. Minutes use the calendar's explicit release date, with its +source URL recorded, rather than the meeting date encoded in the document URL. +Date-only documents remain eligible on the cutoff day; older discovery links +are filtered before fetching their bodies in both realtime and history lanes. Additional API/PDF fixtures cover three 2025 DOJ institutional cases (OPA and USAO), their four attachments, one excluded personal crime case, and a Federal Register daily XML containing 106 unique document numbers. The isolated database smoke checks idempotency and