import requests from datetime import datetime import time import random import os import json from auto_media_publisher.config.conf_base import BASE_DIR,DAJIALA_JSON_FILE_NAME,DAJIALA_CATEGORY_DICT,DAJIALA_URL_PREFIX from auto_media_publisher.utils.utils_database import dajiala_insert_or_update_top15_json from auto_media_publisher.utils.logger import get_logger class DajialaFetcher(): def __init__(self): super().__init__() self.base_url = DAJIALA_URL_PREFIX self.category_dict = DAJIALA_CATEGORY_DICT self.output_json_file = os.path.join(BASE_DIR,DAJIALA_JSON_FILE_NAME) self.logger = get_logger(self.__class__.__name__,"admin") def fetch(self,top_type): url = f"{self.base_url}{top_type}" headers = { "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-language":"zh-CN,zh;q=0.9", "Accept-encoding":"gzip, deflate, br, zstd", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36", "Host":"www.dajiala.com", "Pragma":"no-cache", "Sec-ch-ua":"\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"", "Sec-ch-ua-mobile":"?0", "Sec-ch-ua-platform":"\"Windows\"", "Sec-fetch-dest":"document", "Sec-fetch-mode":"navigate", "Sec-fetch-site":"none", "Sec-fetch-user":"?1", "Upgrade-insecure-requests":"1" } try: response = requests.get(url, headers=headers, timeout=10) response.raise_for_status() return response.json() except requests.RequestException as e: self.logger.error(f"[Top15Fetcher] Failed to fetch topType {top_type}: {e}") return None def store_to_jsonl_and_database(self, json_data,top_type): if not json_data or json_data.get("code") != 0: self.logger.warning(f"[Top15Fetcher] No data or invalid response for top_type={top_type}") return data_list = json_data["data"]["data"] print(f"[Top15Fetcher] Saving {len(data_list)} items to JSONL for top_type {top_type}") # 构建去重索引(内存) seen_urls = set() if os.path.exists(self.output_json_file): with open(self.output_json_file, "r", encoding="utf-8") as f: for line in f: try: obj = json.loads(line) seen_urls.add(obj["url"]) except Exception: continue # 追加写入新数据(不重复) with open(self.output_json_file, "a", encoding="utf-8") as f: for item in data_list: if item["url"] in seen_urls: continue item["type"] = top_type item["type_name"] = self.category_dict.get(top_type, "未知") item["updatetime"] = datetime.now().isoformat() f.write(json.dumps(item, ensure_ascii=False) + "\n") # store into database dajiala_insert_or_update_top15_json(item) self.logger.info(f"[Top15Fetcher] Stored new unique items to {self.output_json_file} and database") def run(self): for top_type in range(1, 27): # 1 to 26 data = self.fetch(top_type) if data: self.store_to_jsonl_and_database(data,top_type) time.sleep(random.uniform(10, 15))