新闻
This commit is contained in:
@@ -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)}"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -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 = {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -157,6 +157,7 @@ export interface CrontabParam {
|
|||||||
type: string;
|
type: string;
|
||||||
/** 默认值 */
|
/** 默认值 */
|
||||||
value: any;
|
value: any;
|
||||||
|
required: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user