This commit is contained in:
2025-11-13 11:04:40 +08:00
parent e55a52f20b
commit 2982d53800
8 changed files with 45 additions and 31 deletions

View File

@@ -287,11 +287,14 @@ class RmrbCrawler(BaseCrawler):
if parser_func is None: if parser_func is None:
logger.error(f"未找到对应解析器category={category}, url={url}") logger.error(f"未找到对应解析器category={category}, url={url}")
return NewsItem( parser_func = self.parse_base_news_detail
url=url, # return NewsItem(
executeStatus=0, # url=url,
executeMessage=f"不支持的新闻类型: {category}" # contentRows=[],
) # title="",
# executeStatus=0,
# executeMessage=f"不支持的新闻类型: {category}"
# )
# 调用对应的解析方法(注意:这些方法是实例方法,需通过 self 调用) # 调用对应的解析方法(注意:这些方法是实例方法,需通过 self 调用)
return parser_func(url) return parser_func(url)
@@ -638,5 +641,16 @@ class RmrbCrawler(BaseCrawler):
except Exception as e: except Exception as e:
logger.error(f"解析新闻详情失败 [{url}]: {str(e)}") logger.error(f"解析新闻详情失败 [{url}]: {str(e)}")
return NewsItem(
title="",
contentRows=[],
url=url,
publishTime="",
author="",
source="人民网",
category="",
executeStatus=0,
executeMessage=f"解析新闻详情失败: {str(e)}"
)

View File

@@ -18,7 +18,7 @@ sys.path.insert(0, str(Path(__file__).parent.parent))
from crawler.RmrbCrawler import RmrbCrawler from crawler.RmrbCrawler import RmrbCrawler
from loguru import logger from loguru import logger
from core.ResultDomain import ResultDomain
def parse_date(date_str) -> datetime: def parse_date(date_str) -> datetime:
""" """
@@ -65,7 +65,6 @@ def main():
""" """
) )
parser.add_argument('--date', '-d', type=str, help='指定日期 (格式: YYYYMMDD)')
parser.add_argument('--startDate', '-s', type=str, help='开始日期 (需与--end-date一起使用)') parser.add_argument('--startDate', '-s', type=str, help='开始日期 (需与--end-date一起使用)')
parser.add_argument('--endDate', '-e', type=str, help='结束日期 (需与--start-date一起使用)') parser.add_argument('--endDate', '-e', type=str, help='结束日期 (需与--start-date一起使用)')
parser.add_argument('--yesterday', '-y', action='store_true', help='查询昨日 (默认行为)') parser.add_argument('--yesterday', '-y', action='store_true', help='查询昨日 (默认行为)')
@@ -75,7 +74,6 @@ def main():
# 初始化变量 # 初始化变量
output_file = args.output output_file = args.output
date = args.date
start_date = args.startDate start_date = args.startDate
end_date = args.endDate end_date = args.endDate
is_yesterday = args.yesterday if args.yesterday else True # 默认查昨日 is_yesterday = args.yesterday if args.yesterday else True # 默认查昨日
@@ -86,25 +84,19 @@ def main():
def clean(s): def clean(s):
return s.strip() if s and isinstance(s, str) and s.strip() else None return s.strip() if s and isinstance(s, str) and s.strip() else None
date = clean(date)
start_date = clean(start_date) start_date = clean(start_date)
end_date = clean(end_date) end_date = clean(end_date)
try: try:
crawler = RmrbCrawler() crawler = RmrbCrawler()
# 单日模式 if is_yesterday:
if date: target_date = datetime.now() - timedelta(days=1)
if start_date or end_date: date_str = target_date.strftime('%Y%m%d')
raise ValueError("不能同时使用 date 和 startDate/endDate 参数") logger.info(f"获取昨日热点新闻: {target_date.strftime('%Y-%m-%d')} (参数格式: {date_str})")
target_date = parse_date(date)
logger.info(f"获取单日热点新闻: {target_date.strftime('%Y-%m-%d')}")
result = crawler.getOneDayTrendingNews(target_date) result = crawler.getOneDayTrendingNews(target_date)
# 日期范围模式 # 日期范围模式
elif start_date and end_date: elif start_date and end_date:
if date:
raise ValueError("不能同时使用 date 和 startDate/endDate 参数")
start_dt = parse_date(start_date) start_dt = parse_date(start_date)
end_dt = parse_date(end_date) end_dt = parse_date(end_date)
if start_dt > end_dt: if start_dt > end_dt:
@@ -114,17 +106,9 @@ def main():
# 只给一个边界 # 只给一个边界
elif start_date or end_date: elif start_date or end_date:
raise ValueError("--start-date 和 --end-date 必须同时指定") raise ValueError("--startDate 和 --endDate 必须同时指定")
# 默认模式
else: else:
if is_yesterday: result = ResultDomain(code=0, message="参数错误", success=False, data=None, dataList=None)
target_date = datetime.now() - timedelta(days=1)
logger.info(f"获取昨日热点新闻: {target_date.strftime('%Y-%m-%d')}")
else:
target_date = datetime.now()
logger.info(f"获取今日热点新闻: {target_date.strftime('%Y-%m-%d')}")
result = crawler.getOneDayTrendingNews(target_date)
# 构造输出 # 构造输出
output = { output = {

View File

@@ -77,6 +77,11 @@ public class PageParam implements Serializable {
*/ */
public void setPageNumber(int pageNumber) { public void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber; this.pageNumber = pageNumber;
if (pageSize > 0) {
this.offset = (pageNumber - 1) * pageSize;
} else {
this.offset = 0;
}
} }
/** /**
@@ -98,6 +103,11 @@ public class PageParam implements Serializable {
*/ */
public void setPageSize(int pageSize) { public void setPageSize(int pageSize) {
this.pageSize = pageSize; this.pageSize = pageSize;
if (pageNumber > 0) {
this.offset = (pageNumber - 1) * pageSize;
} else {
this.offset = 0;
}
} }
/** /**

View File

@@ -28,5 +28,6 @@ public class CrontabItem {
private String description; private String description;
private String type; private String type;
private Object value; private Object value;
private Boolean required;
} }
} }

View File

@@ -18,10 +18,12 @@ crontab:
description: 搜索关键字 description: 搜索关键字
type: String type: String
value: "" value: ""
required: true
- name: total - name: total
description: 总新闻数量 description: 总新闻数量
type: Integer type: Integer
value: 10 value: 10
required: true
- name: 排行榜爬取 - name: 排行榜爬取
clazz: newsCrewerTask clazz: newsCrewerTask
excuete_method: execute excuete_method: execute
@@ -35,10 +37,12 @@ crontab:
description: 开始日期 description: 开始日期
type: String type: String
value: "" value: ""
required: false
- name: endDate - name: endDate
description: 结束日期 description: 结束日期
type: String type: String
value: "" value: ""
required: false
- name: yesterday - name: yesterday
description: 是否是昨天 description: 是否是昨天
type: Boolean type: Boolean

View File

@@ -117,7 +117,7 @@ export const crontabApi = {
* @returns Promise<ResultDomain<CrontabTask>> * @returns Promise<ResultDomain<CrontabTask>>
*/ */
async executeTaskOnce(taskId: string): Promise<ResultDomain<CrontabTask>> { async executeTaskOnce(taskId: string): Promise<ResultDomain<CrontabTask>> {
const response = await api.post<CrontabTask>(`${this.baseUrl}/task/execute/${taskId}`); const response = await api.post<CrontabTask>(`${this.baseUrl}/task/execute/${taskId}`,{},{showLoading: false});
return response.data; return response.data;
}, },

View File

@@ -157,6 +157,7 @@ export interface CrontabParam {
type: string; type: string;
/** 默认值 */ /** 默认值 */
value: any; value: any;
required: boolean;
} }
/** /**

View File

@@ -632,11 +632,11 @@ async function handleSubmit() {
for (const param of selectedMethod.value.params) { for (const param of selectedMethod.value.params) {
const value = dynamicParams.value[param.name]; const value = dynamicParams.value[param.name];
if (param.type === 'String' && (!value || value.trim() === '')) { if (param.required && param.type === 'String' && (!value || value.trim() === '')) {
ElMessage.warning(`请输入${param.description}`); ElMessage.warning(`请输入${param.description}`);
return; return;
} }
if (param.type === 'Integer' && (value === undefined || value === null || value === '')) { if (param.required && param.type === 'Integer' && (value === undefined || value === null || value === '')) {
ElMessage.warning(`请输入${param.description}`); ElMessage.warning(`请输入${param.description}`);
return; return;
} }