From 000ec1c5de78da8488b9aba59970f66e992e2c75 Mon Sep 17 00:00:00 2001 From: Harold <8866033@gmail.com> Date: Sat, 25 Apr 2026 09:00:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20add=20AAZ=E9=9F=B3=E4=B9=90=20search=20?= =?UTF-8?q?parsing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- py/AAZ音乐.py | 30 +++++++++++++++++++++++++++++- py/tests/test_AAZ音乐.py | 27 +++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/py/AAZ音乐.py b/py/AAZ音乐.py index 794ac16..78c3826 100644 --- a/py/AAZ音乐.py +++ b/py/AAZ音乐.py @@ -1,7 +1,7 @@ # coding=utf-8 import re import sys -from urllib.parse import urljoin +from urllib.parse import quote, urljoin from base.spider import Spider as BaseSpider @@ -119,6 +119,26 @@ class Spider(BaseSpider): ) return items + def _parse_search_cards(self, html): + root = self._load_html(html) + items = [] + seen = set() + for node in root.xpath("//li"): + href = "".join(node.xpath(".//div[contains(@class,'name')]//a[1]/@href")).strip() + vod_id = self._encode_vod_id(href) + if not vod_id or vod_id in seen: + continue + seen.add(vod_id) + items.append( + { + "vod_id": vod_id, + "vod_name": self._clean_text("".join(node.xpath(".//div[contains(@class,'name')]//a[1]/@title"))), + "vod_pic": self._build_url("".join(node.xpath(".//img[1]/@src"))), + "vod_remarks": "", + } + ) + return items + def homeContent(self, filter): items = self._parse_song_cards(self._fetch_html(self.category_paths["new"])) return {"class": list(self.classes), "list": items} @@ -141,3 +161,11 @@ class Spider(BaseSpider): else: items = self._parse_folder_cards(html, "mv") return {"page": int(pg), "limit": len(items), "total": len(items), "list": items} + + def searchContent(self, key, quick, pg="1"): + keyword = self._clean_text(key) + if not keyword: + return self._empty_result(1) + html = self._fetch_html("/so/%s.html" % quote(keyword)) + items = self._parse_search_cards(html) + return {"page": int(pg), "limit": len(items), "total": len(items), "list": items} diff --git a/py/tests/test_AAZ音乐.py b/py/tests/test_AAZ音乐.py index f7d6585..5d988e1 100644 --- a/py/tests/test_AAZ音乐.py +++ b/py/tests/test_AAZ音乐.py @@ -60,6 +60,18 @@ MV_HTML = """ """ +SEARCH_HTML = """ + + + +""" + class TestAAZMusicSpider(unittest.TestCase): def setUp(self): @@ -108,6 +120,21 @@ class TestAAZMusicSpider(unittest.TestCase): {"page": 1, "limit": 0, "total": 0, "list": []}, ) + @patch.object(Spider, "fetch") + def test_search_content_maps_mixed_result_types(self, mock_fetch): + mock_fetch.return_value = SimpleNamespace(status_code=200, text=SEARCH_HTML) + result = self.spider.searchContent("周杰伦", False, "1") + self.assertEqual( + [item["vod_id"] for item in result["list"]], + ["song:2001", "singer:jay", "playlist:jaybest", "album:fantasy", "mv:nocturnemv"], + ) + + def test_search_content_returns_empty_for_blank_keyword(self): + self.assertEqual( + self.spider.searchContent("", False, "1"), + {"page": 1, "limit": 0, "total": 0, "list": []}, + ) + if __name__ == "__main__": unittest.main()