```
feat(core): 添加大化县政府网采购公告数据表和相关功能 - 创建 dahuagov_announcements 表用于存储大化县政府网采购公告 - 添加相关索引以提高查询性能 - 实现 save_dahuagov_announcements、get_new_dahuagov_announcements 和 mark_dahuagov_announcements_sent 方法 - 修改统计查询以包含大化县公告数据 - 更新内容哈希检查逻辑以支持新表 feat(cron): 集成大化县政府网采购公告爬取功能 - 导入大化县政府网爬虫模块 - 修改定时任务流程以同时爬取广西政府采购网和大化县政府网 - 对不同来源公告采用不同处理策略: - 广西政府采购网:关键词筛选后推送 - 大化县政府网:全部推送,不过滤关键词 - 分别处理和统计两个来源的公告数据 - 实现独立的通知发送和状态更新机制 feat(notification): 优化企业微信通知显示大化县来源标识 - 为不同来源公告添加前缀标识(【大化县政府网】或【广西政府采购网】) - 根据公告来源动态调整通知标题: - 单一来源显示具体来源 - 双来源显示"双源监控"标识 - 改进通知卡片的来源区分度,便于用户识别公告来源 ```
This commit is contained in:
Binary file not shown.
@@ -264,12 +264,32 @@ class DatabaseManager:
|
||||
FOREIGN KEY (source_code) REFERENCES announcement_sources(code)
|
||||
);
|
||||
|
||||
-- 大化县政府网采购公告表(全部推送,不筛选)
|
||||
CREATE TABLE IF NOT EXISTS dahuagov_announcements (
|
||||
id SERIAL PRIMARY KEY,
|
||||
title VARCHAR(500) NOT NULL,
|
||||
publish_date TIMESTAMP NOT NULL,
|
||||
purchase_name VARCHAR(200),
|
||||
content_url TEXT,
|
||||
source_code VARCHAR(50) NOT NULL DEFAULT 'dahuagov',
|
||||
source_name VARCHAR(100) NOT NULL DEFAULT '大化县政府网采购公告',
|
||||
announcement_type VARCHAR(50) NOT NULL DEFAULT 'purchase',
|
||||
crawled_at TIMESTAMP,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
content_hash VARCHAR(32) UNIQUE,
|
||||
is_new BOOLEAN DEFAULT TRUE
|
||||
);
|
||||
|
||||
-- 创建索引
|
||||
CREATE INDEX IF NOT EXISTS idx_announcements_publish_date ON announcements(publish_date DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_announcements_source_code ON announcements(source_code);
|
||||
CREATE INDEX IF NOT EXISTS idx_announcements_content_hash ON announcements(content_hash);
|
||||
CREATE INDEX IF NOT EXISTS idx_announcements_created_at ON announcements(created_at DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_crawl_results_crawled_at ON crawl_results(crawled_at DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_dahuagov_publish_date ON dahuagov_announcements(publish_date DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_dahuagov_content_hash ON dahuagov_announcements(content_hash);
|
||||
CREATE INDEX IF NOT EXISTS idx_dahuagov_created_at ON dahuagov_announcements(created_at DESC);
|
||||
|
||||
-- 创建更新时间触发器
|
||||
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
||||
@@ -704,6 +724,13 @@ class DatabaseManager:
|
||||
COUNT(DISTINCT source_code) as sources,
|
||||
MAX(crawled_at) as last_crawl
|
||||
FROM manual_announcements
|
||||
UNION ALL
|
||||
SELECT
|
||||
'dahuagov_announcements' as table_name,
|
||||
COUNT(*) as count,
|
||||
COUNT(DISTINCT source_code) as sources,
|
||||
MAX(crawled_at) as last_crawl
|
||||
FROM dahuagov_announcements
|
||||
"""
|
||||
|
||||
cursor.execute(detail_sql)
|
||||
@@ -742,12 +769,14 @@ class DatabaseManager:
|
||||
SELECT content_hash FROM auto_announcements WHERE content_hash = %s
|
||||
UNION ALL
|
||||
SELECT content_hash FROM manual_announcements WHERE content_hash = %s
|
||||
UNION ALL
|
||||
SELECT content_hash FROM dahuagov_announcements WHERE content_hash = %s
|
||||
) as combined_check LIMIT 1
|
||||
"""
|
||||
|
||||
try:
|
||||
with get_db_cursor() as cursor:
|
||||
cursor.execute(sql, (content_hash, content_hash, content_hash))
|
||||
cursor.execute(sql, (content_hash, content_hash, content_hash, content_hash))
|
||||
return cursor.fetchone() is not None
|
||||
except Exception as e:
|
||||
logger.error(f"检查公告存在性失败: {str(e)}")
|
||||
@@ -790,6 +819,133 @@ class DatabaseManager:
|
||||
logger.error(f"获取最近公告失败: {str(e)}")
|
||||
return []
|
||||
|
||||
@retry_on_exception(RetryConfig(max_retries=3))
|
||||
def save_dahuagov_announcements(self, announcements: List[Announcement]) -> int:
|
||||
"""
|
||||
保存大化县政府网公告(全部推送,不筛选关键词)
|
||||
|
||||
Args:
|
||||
announcements: 公告列表
|
||||
|
||||
Returns:
|
||||
int: 成功保存的新公告数量
|
||||
"""
|
||||
if not self.config.database.enabled:
|
||||
return 0
|
||||
|
||||
if not announcements:
|
||||
return 0
|
||||
|
||||
# 为没有哈希的公告生成哈希
|
||||
for announcement in announcements:
|
||||
if not announcement.content_hash:
|
||||
announcement.generate_content_hash()
|
||||
|
||||
sql = """
|
||||
INSERT INTO dahuagov_announcements (
|
||||
title, publish_date, purchase_name, content_url, source_code, source_name,
|
||||
announcement_type, crawled_at, content_hash, is_new
|
||||
) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
|
||||
ON CONFLICT (content_hash) DO NOTHING
|
||||
"""
|
||||
|
||||
values = []
|
||||
for announcement in announcements:
|
||||
values.append((
|
||||
announcement.title,
|
||||
announcement.publish_date,
|
||||
announcement.purchase_name,
|
||||
announcement.content_url,
|
||||
announcement.source_code,
|
||||
announcement.source_name,
|
||||
announcement.announcement_type.value,
|
||||
announcement.crawled_at,
|
||||
announcement.content_hash,
|
||||
announcement.is_new
|
||||
))
|
||||
|
||||
try:
|
||||
with get_db_cursor() as cursor:
|
||||
extras.execute_batch(cursor, sql, values)
|
||||
affected_rows = cursor.rowcount
|
||||
logger.info(f"保存大化县公告完成,新增 {affected_rows} 条")
|
||||
return affected_rows
|
||||
except Exception as e:
|
||||
logger.error(f"保存大化县公告失败: {str(e)}")
|
||||
return 0
|
||||
|
||||
@retry_on_exception(RetryConfig(max_retries=3))
|
||||
def get_new_dahuagov_announcements(self) -> List[Announcement]:
|
||||
"""
|
||||
获取大化县未推送的新公告(is_new = TRUE)
|
||||
|
||||
Returns:
|
||||
List[Announcement]: 未推送的公告列表
|
||||
"""
|
||||
if not self.config.database.enabled:
|
||||
return []
|
||||
|
||||
sql = """
|
||||
SELECT * FROM dahuagov_announcements
|
||||
WHERE is_new = TRUE
|
||||
ORDER BY publish_date DESC
|
||||
"""
|
||||
|
||||
try:
|
||||
with get_db_cursor() as cursor:
|
||||
cursor.execute(sql)
|
||||
rows = cursor.fetchall()
|
||||
|
||||
announcements = []
|
||||
for row in rows:
|
||||
row_dict = dict(row)
|
||||
row_dict['announcement_type'] = AnnouncementType(row_dict['announcement_type'])
|
||||
announcements.append(Announcement.from_dict(row_dict))
|
||||
|
||||
return announcements
|
||||
except Exception as e:
|
||||
logger.error(f"获取大化县新公告失败: {str(e)}")
|
||||
return []
|
||||
|
||||
@retry_on_exception(RetryConfig(max_retries=3))
|
||||
def mark_dahuagov_announcements_sent(self, announcements: List[Announcement]) -> int:
|
||||
"""
|
||||
标记大化县公告已发送(is_new = FALSE)
|
||||
|
||||
Args:
|
||||
announcements: 已发送的公告列表
|
||||
|
||||
Returns:
|
||||
int: 更新的记录数
|
||||
"""
|
||||
if not self.config.database.enabled:
|
||||
return 0
|
||||
|
||||
if not announcements:
|
||||
return 0
|
||||
|
||||
# 获取所有公告的哈希值
|
||||
hashes = [ann.content_hash for ann in announcements if ann.content_hash]
|
||||
|
||||
if not hashes:
|
||||
return 0
|
||||
|
||||
sql = """
|
||||
UPDATE dahuagov_announcements
|
||||
SET is_new = FALSE, updated_at = CURRENT_TIMESTAMP
|
||||
WHERE content_hash = ANY(%s)
|
||||
"""
|
||||
|
||||
try:
|
||||
with get_db_cursor() as cursor:
|
||||
cursor.execute(sql, (hashes,))
|
||||
affected_rows = cursor.rowcount
|
||||
logger.info(f"标记大化县公告已发送完成,更新 {affected_rows} 条")
|
||||
return affected_rows
|
||||
except Exception as e:
|
||||
logger.error(f"标记大化县公告已发送失败: {str(e)}")
|
||||
return 0
|
||||
|
||||
|
||||
# 全局数据库管理器实例
|
||||
_db_manager = None
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,355 @@
|
||||
"""
|
||||
大化瑶族自治县政府采购公告爬虫
|
||||
爬取大化县政府网站的采购公告页面
|
||||
"""
|
||||
|
||||
import time
|
||||
import random
|
||||
from typing import List, Optional, Tuple
|
||||
from datetime import datetime
|
||||
from urllib.parse import urljoin, urlparse
|
||||
from bs4 import BeautifulSoup
|
||||
import requests
|
||||
from fake_useragent import UserAgent
|
||||
|
||||
try:
|
||||
from ..core.models import Announcement, AnnouncementSource, AnnouncementType, CrawlResult, CrawlStatus
|
||||
from ..core.config_manager import get_config
|
||||
from ..core.logger import get_logger, log_crawl_start, log_crawl_success, log_crawl_error
|
||||
from ..core.reliability import (
|
||||
retry_on_exception, RetryConfig, session_with_retry,
|
||||
TimeoutConfig, safe_execute, check_system_health
|
||||
)
|
||||
except ImportError:
|
||||
from core.models import Announcement, AnnouncementSource, AnnouncementType, CrawlResult, CrawlStatus
|
||||
from core.config_manager import get_config
|
||||
from core.logger import get_logger, log_crawl_start, log_crawl_success, log_crawl_error
|
||||
from core.reliability import (
|
||||
retry_on_exception, RetryConfig, session_with_retry,
|
||||
TimeoutConfig, safe_execute, check_system_health
|
||||
)
|
||||
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
|
||||
class DahuagovSpider:
|
||||
"""大化县政府网站爬虫"""
|
||||
|
||||
# 大化县政府网站配置
|
||||
BASE_URL = "http://www.gxdh.gov.cn"
|
||||
ANNOUNCEMENT_PATH = "/xxgk/zdlyxxgk/ggzypzly/zfcgly/cggg/"
|
||||
|
||||
def __init__(self):
|
||||
self.config = get_config()
|
||||
self.ua = UserAgent()
|
||||
self.session = None
|
||||
self.request_count = 0
|
||||
self.error_count = 0
|
||||
|
||||
def _get_random_user_agent(self) -> str:
|
||||
"""获取随机User-Agent"""
|
||||
try:
|
||||
from fake_useragent import UserAgent
|
||||
return self.ua.random
|
||||
except:
|
||||
return random.choice(self.config.crawler.user_agents)
|
||||
|
||||
def init_session(self):
|
||||
"""初始化会话"""
|
||||
if self.session is None:
|
||||
timeout_config = TimeoutConfig(
|
||||
connect_timeout=self.config.crawler.timeout,
|
||||
read_timeout=self.config.crawler.timeout
|
||||
)
|
||||
|
||||
retry_config = RetryConfig(
|
||||
max_retries=self.config.crawler.max_retries,
|
||||
initial_delay=self.config.crawler.retry_delay,
|
||||
max_delay=self.config.crawler.max_retry_delay,
|
||||
backoff_factor=self.config.crawler.backoff_factor
|
||||
)
|
||||
|
||||
self.session = requests.Session()
|
||||
|
||||
adapter = requests.adapters.HTTPAdapter(
|
||||
pool_connections=10,
|
||||
pool_maxsize=20,
|
||||
max_retries=0
|
||||
)
|
||||
self.session.mount('http://', adapter)
|
||||
self.session.mount('https://', adapter)
|
||||
|
||||
self.session.timeout = (timeout_config.connect_timeout, timeout_config.read_timeout)
|
||||
|
||||
return self.session
|
||||
|
||||
def close_session(self):
|
||||
"""关闭会话"""
|
||||
if self.session:
|
||||
self.session.close()
|
||||
self.session = None
|
||||
|
||||
def _fetch_page(self, url: str) -> Tuple[Optional[str], Optional[str]]:
|
||||
"""
|
||||
获取页面内容
|
||||
|
||||
Args:
|
||||
url: 页面URL
|
||||
|
||||
Returns:
|
||||
Tuple[Optional[str], Optional[str]]: (页面内容, 错误信息)
|
||||
"""
|
||||
try:
|
||||
session = self.init_session()
|
||||
user_agent = self._get_random_user_agent()
|
||||
|
||||
headers = {
|
||||
"User-Agent": user_agent,
|
||||
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
|
||||
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
|
||||
"Connection": "keep-alive",
|
||||
"Referer": self.BASE_URL
|
||||
}
|
||||
|
||||
# 添加随机延迟
|
||||
delay = random.uniform(
|
||||
self.config.crawler.request_delay,
|
||||
self.config.crawler.request_delay_max
|
||||
)
|
||||
time.sleep(delay)
|
||||
|
||||
response = session.get(url, headers=headers, timeout=self.session.timeout)
|
||||
|
||||
self.request_count += 1
|
||||
|
||||
if response.status_code == 200:
|
||||
# 确保使用正确的编码
|
||||
response.encoding = response.apparent_encoding or 'utf-8'
|
||||
return response.text, None
|
||||
else:
|
||||
return None, f"请求失败, 状态码: {response.status_code}"
|
||||
|
||||
except Exception as e:
|
||||
self.error_count += 1
|
||||
logger.error(f"获取页面异常: {str(e)}")
|
||||
return None, f"请求异常: {str(e)}"
|
||||
|
||||
def _parse_page(self, html: str, crawled_at: datetime) -> List[Announcement]:
|
||||
"""
|
||||
解析页面内容
|
||||
|
||||
Args:
|
||||
html: 页面HTML内容
|
||||
crawled_at: 爬取时间
|
||||
|
||||
Returns:
|
||||
List[Announcement]: 解析后的公告列表
|
||||
"""
|
||||
announcements = []
|
||||
|
||||
try:
|
||||
soup = BeautifulSoup(html, 'html.parser')
|
||||
|
||||
# 查找公告列表
|
||||
# 大化县政府网站使用 ul.more-list 结构
|
||||
lists = soup.find_all('ul', class_='more-list')
|
||||
|
||||
if not lists:
|
||||
logger.info("未找到公告列表")
|
||||
return announcements
|
||||
|
||||
for ul in lists:
|
||||
lis = ul.find_all('li')
|
||||
|
||||
for li in lis:
|
||||
try:
|
||||
announcement = self._parse_li_element(li, crawled_at)
|
||||
if announcement:
|
||||
announcements.append(announcement)
|
||||
except Exception as e:
|
||||
logger.warning(f"解析单个公告失败: {str(e)}")
|
||||
continue
|
||||
|
||||
logger.info(f"成功解析 {len(announcements)} 条公告")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"解析页面失败: {str(e)}")
|
||||
|
||||
return announcements
|
||||
|
||||
def _parse_li_element(self, li, crawled_at: datetime) -> Optional[Announcement]:
|
||||
"""
|
||||
解析单个li元素
|
||||
|
||||
Args:
|
||||
li: BeautifulSoup li元素
|
||||
crawled_at: 爬取时间
|
||||
|
||||
Returns:
|
||||
Optional[Announcement]: 解析后的公告对象
|
||||
"""
|
||||
try:
|
||||
# 查找日期 span
|
||||
date_span = li.find('span')
|
||||
if not date_span:
|
||||
return None
|
||||
|
||||
date_text = date_span.get_text(strip=True)
|
||||
if not date_text:
|
||||
return None
|
||||
|
||||
# 解析日期
|
||||
try:
|
||||
publish_date = datetime.strptime(date_text, "%Y-%m-%d")
|
||||
except ValueError:
|
||||
logger.warning(f"日期格式无法解析: {date_text}")
|
||||
return None
|
||||
|
||||
# 查找链接和标题
|
||||
link_tag = li.find('a')
|
||||
if not link_tag:
|
||||
return None
|
||||
|
||||
title = link_tag.get('title', '') or link_tag.get_text(strip=True)
|
||||
if not title:
|
||||
return None
|
||||
|
||||
href = link_tag.get('href', '')
|
||||
if not href:
|
||||
return None
|
||||
|
||||
# 构建完整URL
|
||||
if href.startswith('./') or href.startswith('../'):
|
||||
content_url = urljoin(self.BASE_URL + self.ANNOUNCEMENT_PATH, href)
|
||||
elif href.startswith('/'):
|
||||
content_url = self.BASE_URL + href
|
||||
elif href.startswith('http'):
|
||||
content_url = href
|
||||
else:
|
||||
content_url = urljoin(self.BASE_URL + self.ANNOUNCEMENT_PATH, href)
|
||||
|
||||
# 创建公告对象
|
||||
announcement = Announcement(
|
||||
title=title,
|
||||
publish_date=publish_date,
|
||||
purchase_name="大化瑶族自治县", # 默认采购单位
|
||||
content_url=content_url,
|
||||
source_code="dahuagov",
|
||||
source_name="大化县政府网采购公告",
|
||||
announcement_type=AnnouncementType.PURCHASE,
|
||||
crawled_at=crawled_at,
|
||||
is_new=True
|
||||
)
|
||||
|
||||
# 生成内容哈希用于去重
|
||||
announcement.generate_content_hash()
|
||||
|
||||
return announcement
|
||||
|
||||
except Exception as e:
|
||||
logger.warning(f"解析li元素失败: {str(e)}")
|
||||
return None
|
||||
|
||||
@retry_on_exception(RetryConfig(max_retries=2))
|
||||
def crawl(self) -> CrawlResult:
|
||||
"""
|
||||
爬取公告(只爬取第一页)
|
||||
|
||||
Returns:
|
||||
CrawlResult: 爬取结果
|
||||
"""
|
||||
log_crawl_start("大化县政府网采购公告")
|
||||
|
||||
start_time = datetime.now()
|
||||
result = CrawlResult(
|
||||
source=AnnouncementSource(
|
||||
code="dahuagov",
|
||||
category_id=0,
|
||||
name="大化县政府网采购公告",
|
||||
type=AnnouncementType.PURCHASE
|
||||
),
|
||||
status=CrawlStatus.RUNNING,
|
||||
crawled_at=start_time
|
||||
)
|
||||
|
||||
try:
|
||||
# 构建完整URL(只爬取第一页)
|
||||
url = self.BASE_URL + self.ANNOUNCEMENT_PATH
|
||||
|
||||
logger.info(f"开始爬取大化县政府网站: {url}")
|
||||
|
||||
# 获取页面内容
|
||||
html, error_msg = self._fetch_page(url)
|
||||
|
||||
if error_msg:
|
||||
logger.warning(f"获取页面失败: {error_msg}")
|
||||
result.status = CrawlStatus.FAILED
|
||||
result.error_message = error_msg
|
||||
return result
|
||||
|
||||
if not html:
|
||||
logger.info("页面内容为空")
|
||||
result.status = CrawlStatus.SUCCESS
|
||||
result.total_count = 0
|
||||
result.new_count = 0
|
||||
return result
|
||||
|
||||
# 解析页面
|
||||
announcements = self._parse_page(html, start_time)
|
||||
|
||||
# 更新结果
|
||||
result.announcements = announcements
|
||||
result.total_count = len(announcements)
|
||||
result.new_count = len(announcements)
|
||||
result.status = CrawlStatus.SUCCESS
|
||||
|
||||
duration = (datetime.now() - start_time).total_seconds()
|
||||
result.duration = duration
|
||||
|
||||
log_crawl_success("大化县政府网采购公告", len(announcements), duration)
|
||||
|
||||
except Exception as e:
|
||||
duration = (datetime.now() - start_time).total_seconds()
|
||||
result.duration = duration
|
||||
result.status = CrawlStatus.FAILED
|
||||
result.error_message = str(e)
|
||||
|
||||
log_crawl_error("大化县政府网采购公告", str(e))
|
||||
|
||||
return result
|
||||
|
||||
def get_stats(self) -> dict:
|
||||
"""获取爬虫统计信息"""
|
||||
return {
|
||||
"request_count": self.request_count,
|
||||
"error_count": self.error_count,
|
||||
"error_rate": self.error_count / max(self.request_count, 1),
|
||||
"session_active": self.session is not None
|
||||
}
|
||||
|
||||
|
||||
def create_dahuagov_spider() -> DahuagovSpider:
|
||||
"""
|
||||
创建大化县爬虫实例
|
||||
|
||||
Returns:
|
||||
DahuagovSpider: 爬虫实例
|
||||
"""
|
||||
return DahuagovSpider()
|
||||
|
||||
|
||||
def crawl_dahuagov_announcements() -> List[CrawlResult]:
|
||||
"""
|
||||
便捷函数:爬取大化县公告
|
||||
|
||||
Returns:
|
||||
List[CrawlResult]: 爬取结果列表
|
||||
"""
|
||||
spider = create_dahuagov_spider()
|
||||
|
||||
try:
|
||||
result = spider.crawl()
|
||||
return [result]
|
||||
finally:
|
||||
spider.close_session()
|
||||
+134
-76
@@ -16,6 +16,7 @@ try:
|
||||
from gx_gp_monitor.core.config_manager import load_config, get_config
|
||||
from gx_gp_monitor.core.logger import init_logger, get_logger
|
||||
from gx_gp_monitor.crawler.spider import crawl_announcements
|
||||
from gx_gp_monitor.crawler.dahuagov_spider import crawl_dahuagov_announcements
|
||||
from gx_gp_monitor.filters.filters import filter_from_config
|
||||
from gx_gp_monitor.storage.postgresql import init_storage, save_announcements_to_storage, save_all_announcements_by_source_to_storage, save_auto_announcements_to_storage
|
||||
from gx_gp_monitor.notification.wechat import send_announcements_notification, send_system_notification
|
||||
@@ -39,17 +40,37 @@ try:
|
||||
# 初始化存储
|
||||
init_storage()
|
||||
|
||||
# 执行搜索(爬取所有公告,筛选出新增的关键词匹配公告)
|
||||
logger.info("开始执行定时搜索任务")
|
||||
crawl_results = crawl_announcements()
|
||||
# 导入数据库模块
|
||||
import gx_gp_monitor.core.database as db_module
|
||||
db_manager = db_module.get_database_manager()
|
||||
|
||||
if not crawl_results:
|
||||
# 执行搜索(爬取所有公告)
|
||||
logger.info("开始执行定时搜索任务")
|
||||
|
||||
# 收集所有爬取结果
|
||||
all_crawl_results = []
|
||||
|
||||
# 1. 爬取广西政府采购网
|
||||
logger.info("开始爬取广西政府采购网...")
|
||||
gxgp_results = crawl_announcements()
|
||||
if gxgp_results:
|
||||
all_crawl_results.extend(gxgp_results)
|
||||
logger.info(f"广西政府采购网爬取完成,获取 {sum(len(r.announcements) for r in gxgp_results)} 条公告")
|
||||
|
||||
# 2. 爬取大化县政府网采购公告(全部推送,不筛选)
|
||||
logger.info("开始爬取大化县政府网采购公告(全部推送)...")
|
||||
dahua_results = crawl_dahuagov_announcements()
|
||||
if dahua_results:
|
||||
all_crawl_results.extend(dahua_results)
|
||||
logger.info(f"大化县政府网爬取完成,获取 {sum(len(r.announcements) for r in dahua_results)} 条公告")
|
||||
|
||||
if not all_crawl_results:
|
||||
logger.info("爬取完成:无数据")
|
||||
return True
|
||||
|
||||
# 收集所有公告
|
||||
all_announcements = []
|
||||
for result in crawl_results:
|
||||
for result in all_crawl_results:
|
||||
if result.announcements:
|
||||
all_announcements.extend(result.announcements)
|
||||
|
||||
@@ -60,93 +81,130 @@ try:
|
||||
logger.info("没有获取到任何公告")
|
||||
return True
|
||||
|
||||
# 对所有公告进行关键词筛选
|
||||
from gx_gp_monitor.filters.filters import KeywordFilter, DateFilter
|
||||
from datetime import date
|
||||
# 分离广西政府采购网和大化县政府网的公告
|
||||
gxgp_all_announcements = [a for a in all_announcements if a.source_code != 'dahuagov']
|
||||
dahua_all_announcements = [a for a in all_announcements if a.source_code == 'dahuagov']
|
||||
|
||||
keyword_filter = KeywordFilter()
|
||||
keyword_filtered = keyword_filter.filter_announcements(all_announcements, keywords=config.crawler.keyword)
|
||||
logger.info(f"广西政府采购网: {len(gxgp_all_announcements)} 条")
|
||||
logger.info(f"大化县政府网: {len(dahua_all_announcements)} 条")
|
||||
|
||||
# 对关键词筛选结果进行日期筛选(只处理今天的)
|
||||
date_filter = DateFilter()
|
||||
today_keyword_announcements = date_filter.filter_announcements(
|
||||
keyword_filtered,
|
||||
start_date=date.today(),
|
||||
end_date=date.today()
|
||||
)
|
||||
# ========== 处理广西政府采购网(关键词筛选)==========
|
||||
gxgp_filtered = []
|
||||
if gxgp_all_announcements:
|
||||
# 对广西政府采购网公告进行关键词筛选
|
||||
from gx_gp_monitor.filters.filters import KeywordFilter, DateFilter
|
||||
from datetime import date
|
||||
|
||||
logger.info(f"关键词筛选后剩余 {len(keyword_filtered)} 条公告")
|
||||
logger.info(f"筛选出今天关键词匹配 {len(today_keyword_announcements)} 条公告")
|
||||
keyword_filter = KeywordFilter()
|
||||
gxgp_keyword_filtered = keyword_filter.filter_announcements(
|
||||
gxgp_all_announcements, keywords=config.crawler.keyword)
|
||||
|
||||
if not today_keyword_announcements:
|
||||
logger.info("今天没有关键词匹配的公告")
|
||||
# 日期筛选(只处理今天的)
|
||||
date_filter = DateFilter()
|
||||
gxgp_today_filtered = date_filter.filter_announcements(
|
||||
gxgp_keyword_filtered,
|
||||
start_date=date.today(),
|
||||
end_date=date.today()
|
||||
)
|
||||
|
||||
logger.info(f"广西政府采购网关键词筛选后: {len(gxgp_keyword_filtered)} 条")
|
||||
logger.info(f"广西政府采购网今日匹配: {len(gxgp_today_filtered)} 条")
|
||||
|
||||
# 检查是否已存在
|
||||
for ann in gxgp_today_filtered:
|
||||
try:
|
||||
with db_module.get_db_cursor() as cursor:
|
||||
cursor.execute(
|
||||
"SELECT 1 FROM auto_announcements WHERE content_hash = %s LIMIT 1",
|
||||
(ann.content_hash,)
|
||||
)
|
||||
exists = cursor.fetchone() is not None
|
||||
if not exists:
|
||||
gxgp_filtered.append(ann)
|
||||
except Exception as e:
|
||||
logger.warning(f"检查公告是否存在失败: {str(e)}")
|
||||
pass
|
||||
|
||||
logger.info(f"广西政府采购网新增公告: {len(gxgp_filtered)} 条")
|
||||
|
||||
# ========== 处理大化县政府网(全部推送,不筛选)==========
|
||||
dahua_new_announcements = []
|
||||
if dahua_all_announcements:
|
||||
# 大化县公告不需要关键词筛选,直接检查是否已存在于dahuagov_announcements表
|
||||
for ann in dahua_all_announcements:
|
||||
try:
|
||||
with db_module.get_db_cursor() as cursor:
|
||||
cursor.execute(
|
||||
"SELECT 1 FROM dahuagov_announcements WHERE content_hash = %s LIMIT 1",
|
||||
(ann.content_hash,)
|
||||
)
|
||||
exists = cursor.fetchone() is not None
|
||||
if not exists:
|
||||
# 标记为新公告
|
||||
ann.is_new = True
|
||||
dahua_new_announcements.append(ann)
|
||||
except Exception as e:
|
||||
logger.warning(f"检查大化县公告是否存在失败: {str(e)}")
|
||||
pass
|
||||
|
||||
logger.info(f"大化县政府网新增公告: {len(dahua_new_announcements)} 条")
|
||||
|
||||
# 如果没有新增公告,直接结束
|
||||
if not gxgp_filtered and not dahua_new_announcements:
|
||||
logger.info("没有新增公告,任务完成")
|
||||
return True
|
||||
|
||||
# 检查auto_announcements表,筛选出真正新增的公告
|
||||
truly_new_announcements = []
|
||||
for ann in today_keyword_announcements:
|
||||
try:
|
||||
# 直接导入,避免相对导入问题
|
||||
import gx_gp_monitor.core.database as db_module
|
||||
with db_module.get_db_cursor() as cursor:
|
||||
cursor.execute(
|
||||
"SELECT 1 FROM auto_announcements WHERE content_hash = %s LIMIT 1",
|
||||
(ann.content_hash,)
|
||||
)
|
||||
exists = cursor.fetchone() is not None
|
||||
if not exists:
|
||||
truly_new_announcements.append(ann)
|
||||
except Exception as e:
|
||||
logger.warning(f"检查公告是否存在失败: {str(e)}")
|
||||
# 如果检查失败,为了安全起见,不添加到新公告列表
|
||||
pass
|
||||
# ========== 保存到数据库 ==========
|
||||
# 保存广西政府采购网公告
|
||||
if gxgp_filtered:
|
||||
saved_gxgp = save_auto_announcements_to_storage(gxgp_filtered)
|
||||
logger.info(f"保存广西政府采购网公告: {saved_gxgp} 条")
|
||||
|
||||
logger.info(f"从今天关键词匹配公告中筛选出 {len(truly_new_announcements)} 条auto_announcements表中不存在的新公告")
|
||||
# 保存大化县政府网公告到专用表
|
||||
if dahua_new_announcements:
|
||||
saved_dahua = db_manager.save_dahuagov_announcements(dahua_new_announcements)
|
||||
logger.info(f"保存大化县政府网公告: {saved_dahua} 条")
|
||||
|
||||
if not truly_new_announcements:
|
||||
logger.info("没有真正新增的关键词匹配公告,任务完成")
|
||||
return True
|
||||
|
||||
# 构造筛选统计信息
|
||||
filter_stats = type('FilterResult', (), {
|
||||
"keyword_filtered": len(all_announcements) - len(keyword_filtered),
|
||||
"date_filtered": len(keyword_filtered) - len(today_keyword_announcements),
|
||||
"duplicate_filtered": len(today_keyword_announcements) - len(truly_new_announcements),
|
||||
"source_filtered": 0
|
||||
})()
|
||||
|
||||
filtered_announcements = truly_new_announcements
|
||||
|
||||
logger.info(f"关键词筛选后剩余 {len(filtered_announcements)} 条公告")
|
||||
|
||||
if not filtered_announcements:
|
||||
logger.info("没有匹配关键词的公告,任务完成")
|
||||
return True
|
||||
|
||||
# 保存筛选后的公告到定时搜索专用表
|
||||
saved_count = save_auto_announcements_to_storage(filtered_announcements)
|
||||
logger.info(f"保存定时搜索公告完成:{saved_count} 条")
|
||||
|
||||
# 发送企业微信卡片通知
|
||||
# ========== 发送企业微信通知 ==========
|
||||
if config.wechat_app.enabled:
|
||||
logger.info("开始发送企业微信卡片通知...")
|
||||
notify_success = send_announcements_notification(filtered_announcements)
|
||||
notify_success = True
|
||||
|
||||
# 发送广西政府采购网通知
|
||||
if gxgp_filtered:
|
||||
logger.info(f"发送广西政府采购网通知,共 {len(gxgp_filtered)} 条...")
|
||||
gxgp_success = send_announcements_notification(gxgp_filtered)
|
||||
if gxgp_success:
|
||||
logger.info("广西政府采购网通知发送成功")
|
||||
else:
|
||||
logger.error("广西政府采购网通知发送失败")
|
||||
notify_success = False
|
||||
|
||||
# 发送大化县政府网通知
|
||||
if dahua_new_announcements:
|
||||
logger.info(f"发送大化县政府网通知,共 {len(dahua_new_announcements)} 条...")
|
||||
dahua_success = send_announcements_notification(dahua_new_announcements)
|
||||
if dahua_success:
|
||||
logger.info("大化县政府网通知发送成功")
|
||||
# 标记为已发送
|
||||
db_manager.mark_dahuagov_announcements_sent(dahua_new_announcements)
|
||||
else:
|
||||
logger.error("大化县政府网通知发送失败")
|
||||
notify_success = False
|
||||
|
||||
if notify_success:
|
||||
logger.info("企业微信卡片通知发送成功")
|
||||
else:
|
||||
logger.error("企业微信卡片通知发送失败")
|
||||
else:
|
||||
logger.info("企业微信通知未启用,跳过发送")
|
||||
notify_success = True
|
||||
|
||||
# 输出统计信息
|
||||
# ========== 输出统计信息 ==========
|
||||
print("\n=== 定时搜索任务完成 ===")
|
||||
print(f"总共爬取: {total_crawled} 条公告")
|
||||
print(f"关键词筛选: {len(keyword_filtered)} 条")
|
||||
print(f"今日关键词匹配: {len(today_keyword_announcements)} 条")
|
||||
print(f"真正新增公告: {len(truly_new_announcements)} 条")
|
||||
print(f"筛选后公告: {len(filtered_announcements)} 条")
|
||||
print(f"保存到数据库: {saved_count} 条")
|
||||
print(f"广西政府采购网:")
|
||||
print(f" - 爬取: {len(gxgp_all_announcements)} 条")
|
||||
print(f" - 关键词匹配: {len(gxgp_filtered)} 条")
|
||||
print(f"大化县政府网:")
|
||||
print(f" - 爬取: {len(dahua_all_announcements)} 条")
|
||||
print(f" - 新增推送: {len(dahua_new_announcements)} 条")
|
||||
print(f"企业微信通知: {'成功' if notify_success else '失败' if config.wechat_app.enabled else '未启用'}")
|
||||
|
||||
logger.info("=== 定时搜索任务完成 ===")
|
||||
|
||||
Binary file not shown.
@@ -383,14 +383,21 @@ class WeChatService:
|
||||
if len(source_name) > 25: # 限制来源名称长度
|
||||
source_name = source_name[:22] + "..."
|
||||
|
||||
# 根据来源代码添加前缀标识
|
||||
source_prefix = ""
|
||||
if announcement.source_code == 'dahuagov':
|
||||
source_prefix = "【大化县政府网】"
|
||||
else:
|
||||
source_prefix = "【广西政府采购网】"
|
||||
|
||||
# 时间格式化
|
||||
if announcement.publish_date:
|
||||
time_str = announcement.publish_date.strftime("%Y-%m-%d %H:%M")
|
||||
else:
|
||||
time_str = "时间未知"
|
||||
|
||||
# 生成描述:类型 | 来源 | 时间(使用默认颜色)
|
||||
description = f'<div style="font-size: 14px; margin-top: 8px;">{announcement_type_display} | {source_name} | {time_str}</div>'
|
||||
# 生成描述:来源标识 | 类型 | 来源单位 | 时间
|
||||
description = f'<div style="font-size: 14px; margin-top: 8px;">{source_prefix}{announcement_type_display} | {source_name} | {time_str}</div>'
|
||||
|
||||
# URL:公告详情链接
|
||||
url = announcement.content_url
|
||||
@@ -434,7 +441,18 @@ class WeChatService:
|
||||
|
||||
# 标题和概要
|
||||
total_count = len(announcements)
|
||||
lines.append("# 🔔 广西政府采购网公告更新")
|
||||
|
||||
# 检查是否包含多个来源
|
||||
has_gxgp = any(a.source_code != 'dahuagov' for a in announcements)
|
||||
has_dahua = any(a.source_code == 'dahuagov' for a in announcements)
|
||||
|
||||
if has_gxgp and has_dahua:
|
||||
lines.append("# 🔔 政府采购公告更新(双源监控)")
|
||||
elif has_dahua:
|
||||
lines.append("# 🔔 大化县政府网采购公告更新")
|
||||
else:
|
||||
lines.append("# 🔔 广西政府采购网公告更新")
|
||||
|
||||
lines.append("")
|
||||
lines.append(f"📊 **共发现 {total_count} 条新公告**")
|
||||
lines.append("")
|
||||
@@ -541,7 +559,17 @@ class WeChatService:
|
||||
|
||||
# 生成标题
|
||||
total_count = len(announcements)
|
||||
title = f"🔔 广西政府采购网公告更新 ({total_count}条)"
|
||||
|
||||
# 检查是否包含多个来源
|
||||
has_gxgp = any(a.source_code != 'dahuagov' for a in announcements)
|
||||
has_dahua = any(a.source_code == 'dahuagov' for a in announcements)
|
||||
|
||||
if has_gxgp and has_dahua:
|
||||
title = f"🔔 政府采购公告更新 ({total_count}条) - 双源监控"
|
||||
elif has_dahua:
|
||||
title = f"🔔 大化县政府网采购公告更新 ({total_count}条)"
|
||||
else:
|
||||
title = f"🔔 广西政府采购网公告更新 ({total_count}条)"
|
||||
|
||||
# 生成描述HTML
|
||||
html_parts = []
|
||||
|
||||
+6366
-22019
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,493 @@
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 512
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: GwLOHlMWE3qBsHJ3DegXZk5RGOb0hEg2g9SbYIvxkhynxr/43t...
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: vlN4cpR79+nVcy2Cvf22D4nsbOxqtyYFlVO3nvPdIz2NLVZTCr...
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 052516f0e87dd3793a1035dccb0f3b3d9fd806de
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 060aff2e6666d1df9c957ebb61d214664c64e72f
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 052516f0e87dd3793a1035dccb0f3b3d9fd806de
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 060aff2e6666d1df9c957ebb61d214664c64e72f
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=text
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.wechat.callback_server - INFO - 处理文本消息: content=河池分行大化瑶族自治县中医医院结算系
|
||||
统项目..., user=NongGuangGuo
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.wechat.message_handler - INFO - 处理文本消息: 河池分行大化瑶族自治县中医医院结算系
|
||||
统项目, user: NongGuangGuo
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.wechat.message_handler - INFO - 用户 NongGuangGuo 关键词搜索: ['河池分行大化瑶族自治县中医医院结算系', '统项目']
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=crawl_now, user=NongGuangGuo
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: crawl_now, user: NongGuangGuo
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.wechat.message_handler - INFO - 用户 NongGuangGuo 触发立即搜索
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.main - INFO - === 广西政府采购网公告监控系统启动 ===
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.main - INFO - 版本: 1.0.0
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.main - INFO - 配置文件: 默认配置
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.main - INFO - === 广西政府采购网公告监控系统启动 ===
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.main - INFO - 版本: 1.0.0
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.main - INFO - 配置文件: 默认配置
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.core.database - INFO - 数据库连接池初始化成功
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.main - INFO - 应用初始化完成
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.main - INFO - 开始执行搜索任务 (手动搜索: False)
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源
|
||||
2026-05-06 15:08:19 - gx_gp_monitor - INFO - 开始爬取 采购公告
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.core.reliability - INFO - 健康检查通过
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.core.database - INFO - 开始初始化数据库表结构
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.core.database - INFO - 数据库表结构初始化完成
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.storage.postgresql - INFO - 存储初始化完成
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.main - INFO - 应用初始化完成
|
||||
2026-05-06 15:08:19 - gx_gp_monitor.main - INFO - 开始执行搜索任务 (手动搜索: True)
|
||||
2026-05-06 15:08:20 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源
|
||||
2026-05-06 15:08:20 - gx_gp_monitor - INFO - 开始爬取 采购公告
|
||||
2026-05-06 15:08:20 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:20 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 0.44秒
|
||||
2026-05-06 15:08:20 - gx_gp_monitor - INFO - 开始爬取 结果公告
|
||||
2026-05-06 15:08:20 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:20 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.40秒
|
||||
2026-05-06 15:08:20 - gx_gp_monitor - INFO - 开始爬取 合同公告
|
||||
2026-05-06 15:08:21 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:21 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.46秒
|
||||
2026-05-06 15:08:21 - gx_gp_monitor - INFO - 开始爬取 更正公告
|
||||
2026-05-06 15:08:21 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:21 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.32秒
|
||||
2026-05-06 15:08:21 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示
|
||||
2026-05-06 15:08:21 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:21 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.32秒
|
||||
2026-05-06 15:08:21 - gx_gp_monitor - INFO - 开始爬取 单一来源公示
|
||||
2026-05-06 15:08:22 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:22 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.32秒
|
||||
2026-05-06 15:08:22 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示
|
||||
2026-05-06 15:08:22 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:22 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.50秒
|
||||
2026-05-06 15:08:22 - gx_gp_monitor - INFO - 开始爬取 履约验收公示
|
||||
2026-05-06 15:08:22 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:22 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.27秒
|
||||
2026-05-06 15:08:22 - gx_gp_monitor - INFO - 开始爬取 工程类公告
|
||||
2026-05-06 15:08:23 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:23 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.30秒
|
||||
2026-05-06 15:08:23 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告
|
||||
2026-05-06 15:08:23 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:23 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.27秒
|
||||
2026-05-06 15:08:23 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告
|
||||
2026-05-06 15:08:23 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:23 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.26秒
|
||||
2026-05-06 15:08:23 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:24 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.27秒
|
||||
2026-05-06 15:08:24 - gx_gp_monitor - INFO - 开始爬取 采购意向公开
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:24 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.29秒
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.main - INFO - 搜索到 1300 条原始公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.storage.postgresql - INFO - 开始按来源保存 1300 条公告,每个来源最多保留 100 条
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 1 条
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement1 保存了 1 条公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 1 条
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement2 保存了 1 条公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 1 条
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement3 保存了 1 条公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 1 条
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement4 保存了 1 条公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 1 条
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement5 保存了 1 条公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement6 保存了 0 条公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement7 保存了 0 条公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement10 保存了 0 条公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement11 保存了 0 条公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement20 保存了 0 条公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement21 保存了 0 条公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement23 保存了 0 条公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.storage.postgresql - INFO - 来源 61-266648 保存了 0 条公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.storage.postgresql - INFO - 按来源保存完成,总计保存 5 条公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.main - INFO - 保存自动爬取公告完成:共保存 5 条,按来源统计: {'ZcyAnnouncement1': 1, 'ZcyAnnouncement2': 1, 'ZcyAnnouncement3': 1, 'ZcyAnnouncement4': 1, 'ZcyAnnouncement5': 1, 'ZcyAnnouncement6': 0, 'ZcyAnnouncement7': 0, 'ZcyAnnouncement10': 0, 'ZcyAnnouncement11': 0, 'ZcyAnnouncement20': 0, 'ZcyAnnouncement21': 0, 'ZcyAnnouncement23': 0, '61-266648': 0}
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.main - INFO - 筛选出 1300 条新公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 1300 -> 1300 条公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.filters.filters - INFO - 去重筛选: 移除了 1300 条重复公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 0 -> 0 条公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.filters.filters - INFO - 筛选完成: 总数 1300 -> 筛选后 0 (关键词: 0, 日期: 0, 去重: 1300, 来源: 0)
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.main - INFO - 筛选后剩余 0 条公告
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.storage.md_generator - INFO - Markdown文件已保存到: onu.md (共 0 条公告)
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.main - INFO - 爬取任务完成: {'success': True, 'total_crawled': 1300, 'filtered': 0, 'saved': 0, 'markdown_generated': True, 'notification_sent': False, 'filter_stats': {'keyword_filtered': 1300, 'date_filtered': 0, 'duplicate_filtered': 1300, 'source_filtered': 0}}
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: /GWEdhQRyz77Ot0gML2ySdkbya+0yS/l2Zun0R3RRbsUsiZ/5/...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: a3f07c703a094e51e6f65f10e1207347ba52e516
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: a3f07c703a094e51e6f65f10e1207347ba52e516
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_search, user=WeiJueSen
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_search, user: WeiJueSen
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 触发关键词搜索菜单
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: Zh2CaGZnzxNyfY2UAmovYgB312yS33AE9njwfsmdnR4Zdz6dpM...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 2b12a7b22e5b1ce6051b25e1239eb3f89e168f89
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 2b12a7b22e5b1ce6051b25e1239eb3f89e168f89
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_manage, user=NongGuangGuo
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_manage, user: NongGuangGuo
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 用户 NongGuangGuo 请求关键词管理
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: /GWEdhQRyz77Ot0gML2ySdkbya+0yS/l2Zun0R3RRbsUsiZ/5/...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: a3f07c703a094e51e6f65f10e1207347ba52e516
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: a3f07c703a094e51e6f65f10e1207347ba52e516
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_search, user=WeiJueSen
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_search, user: WeiJueSen
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 触发关键词搜索菜单
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: BShc5Ko31VKzOh2A5AV7Id4WWX6+b+i013Kb+j4gOeFD4QpMz/...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: bcacf78d1048a9a06df24a596f173cd483feff96
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: bcacf78d1048a9a06df24a596f173cd483feff96
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_manage, user=NongGuangGuo
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_manage, user: NongGuangGuo
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 用户 NongGuangGuo 请求关键词管理
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: Zh2CaGZnzxNyfY2UAmovYgB312yS33AE9njwfsmdnR4Zdz6dpM...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 2b12a7b22e5b1ce6051b25e1239eb3f89e168f89
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 2b12a7b22e5b1ce6051b25e1239eb3f89e168f89
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_manage, user=NongGuangGuo
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_manage, user: NongGuangGuo
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 用户 NongGuangGuo 请求关键词管理
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: Hj5eJcf9InnhKnkJxjUdwjrfJLtEGw9pSsTXEZUemhGwdaseGY...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: efc35b9b2fb9c388203fd0d92725e4c52e7971bd
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: efc35b9b2fb9c388203fd0d92725e4c52e7971bd
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_manage, user=WeiJueSen
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_manage, user: WeiJueSen
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求关键词管理
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: /GWEdhQRyz77Ot0gML2ySdkbya+0yS/l2Zun0R3RRbsUsiZ/5/...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: a3f07c703a094e51e6f65f10e1207347ba52e516
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: a3f07c703a094e51e6f65f10e1207347ba52e516
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_search, user=WeiJueSen
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_search, user: WeiJueSen
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 触发关键词搜索菜单
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: BShc5Ko31VKzOh2A5AV7Id4WWX6+b+i013Kb+j4gOeFD4QpMz/...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: bcacf78d1048a9a06df24a596f173cd483feff96
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: bcacf78d1048a9a06df24a596f173cd483feff96
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_manage, user=NongGuangGuo
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_manage, user: NongGuangGuo
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 用户 NongGuangGuo 请求关键词管理
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: Zh2CaGZnzxNyfY2UAmovYgB312yS33AE9njwfsmdnR4Zdz6dpM...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 2b12a7b22e5b1ce6051b25e1239eb3f89e168f89
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 2b12a7b22e5b1ce6051b25e1239eb3f89e168f89
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_manage, user=NongGuangGuo
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_manage, user: NongGuangGuo
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 用户 NongGuangGuo 请求关键词管理
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: Hj5eJcf9InnhKnkJxjUdwjrfJLtEGw9pSsTXEZUemhGwdaseGY...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: efc35b9b2fb9c388203fd0d92725e4c52e7971bd
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: efc35b9b2fb9c388203fd0d92725e4c52e7971bd
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_manage, user=WeiJueSen
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_manage, user: WeiJueSen
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求关键词管理
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: s2AORSQopkHXxA09QhYM2xaxUQiwXq6SbJmEVtAdVgBsKdaTyk...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 09b95c92d81b3fdf2e2ce2d39f26f3fabb702ca2
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 09b95c92d81b3fdf2e2ce2d39f26f3fabb702ca2
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=help_guide, user=WeiJueSen
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: help_guide, user: WeiJueSen
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求使用说明
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: BShc5Ko31VKzOh2A5AV7Id4WWX6+b+i013Kb+j4gOeFD4QpMz/...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: bcacf78d1048a9a06df24a596f173cd483feff96
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: bcacf78d1048a9a06df24a596f173cd483feff96
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_manage, user=NongGuangGuo
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_manage, user: NongGuangGuo
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 用户 NongGuangGuo 请求关键词管理
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: koSh3mf1jROPiRIjbk0r2Wxz6G45YqfC7e6FEMFpko9WHl2TaA...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: b1009660d3a9d1248e4f4ae0380f311e15a31b35
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: b1009660d3a9d1248e4f4ae0380f311e15a31b35
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_manage, user=NongGuangGuo
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_manage, user: NongGuangGuo
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 用户 NongGuangGuo 请求关键词管理
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: Hj5eJcf9InnhKnkJxjUdwjrfJLtEGw9pSsTXEZUemhGwdaseGY...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: efc35b9b2fb9c388203fd0d92725e4c52e7971bd
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: efc35b9b2fb9c388203fd0d92725e4c52e7971bd
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_manage, user=WeiJueSen
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_manage, user: WeiJueSen
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求关键词管理
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: s2AORSQopkHXxA09QhYM2xaxUQiwXq6SbJmEVtAdVgBsKdaTyk...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 09b95c92d81b3fdf2e2ce2d39f26f3fabb702ca2
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 09b95c92d81b3fdf2e2ce2d39f26f3fabb702ca2
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=help_guide, user=WeiJueSen
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: help_guide, user: WeiJueSen
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求使用说明
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: Wf8nBEZm2h74BAUuJO4v23ZodRVoaehzIkrZmu5znNTFx6ZviG...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 1374c68c6060fedb594170f77ac661f74115216a
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 1374c68c6060fedb594170f77ac661f74115216a
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_manage, user=NongGuangGuo
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_manage, user: NongGuangGuo
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 用户 NongGuangGuo 请求关键词管理
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: gpwcqJRahQ4lkz8z+9dRmAKMTp6cZTj7TFaoc7dXjJ+gpiTKee...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 2f83d678f4cf2d420d13889341727e94da5f7e20
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 2f83d678f4cf2d420d13889341727e94da5f7e20
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=text
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.callback_server - INFO - 处理文本消息: content=你好..., user=WeiJueSen
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 处理文本消息: 你好, user: WeiJueSen
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 关键词搜索: ['你好']
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.main - INFO - 开始执行搜索任务 (手动搜索: True)
|
||||
2026-05-06 15:08:24 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源
|
||||
2026-05-06 15:08:24 - gx_gp_monitor - INFO - 开始爬取 采购公告
|
||||
2026-05-06 15:08:25 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:25 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 0.45秒
|
||||
2026-05-06 15:08:25 - gx_gp_monitor - INFO - 开始爬取 结果公告
|
||||
2026-05-06 15:08:25 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:25 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.36秒
|
||||
2026-05-06 15:08:25 - gx_gp_monitor - INFO - 开始爬取 合同公告
|
||||
2026-05-06 15:08:26 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:26 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.30秒
|
||||
2026-05-06 15:08:26 - gx_gp_monitor - INFO - 开始爬取 更正公告
|
||||
2026-05-06 15:08:26 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:26 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.31秒
|
||||
2026-05-06 15:08:26 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示
|
||||
2026-05-06 15:08:26 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:26 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.31秒
|
||||
2026-05-06 15:08:26 - gx_gp_monitor - INFO - 开始爬取 单一来源公示
|
||||
2026-05-06 15:08:26 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:26 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.30秒
|
||||
2026-05-06 15:08:26 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示
|
||||
2026-05-06 15:08:27 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:27 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.48秒
|
||||
2026-05-06 15:08:27 - gx_gp_monitor - INFO - 开始爬取 履约验收公示
|
||||
2026-05-06 15:08:27 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:27 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.29秒
|
||||
2026-05-06 15:08:27 - gx_gp_monitor - INFO - 开始爬取 工程类公告
|
||||
2026-05-06 15:08:28 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:28 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.40秒
|
||||
2026-05-06 15:08:28 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告
|
||||
2026-05-06 15:08:28 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:28 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.32秒
|
||||
2026-05-06 15:08:28 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告
|
||||
2026-05-06 15:08:28 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:28 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.27秒
|
||||
2026-05-06 15:08:28 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:29 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.29秒
|
||||
2026-05-06 15:08:29 - gx_gp_monitor - INFO - 开始爬取 采购意向公开
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:29 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.31秒
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.main - INFO - 搜索到 1300 条原始公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.storage.postgresql - INFO - 开始按来源保存 1300 条手动搜索公告到专用表,每个来源最多保留 100 条
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement1 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement2 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement3 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement4 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement5 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement6 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement7 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement10 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement11 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement20 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement21 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement23 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.storage.postgresql - INFO - 来源 61-266648 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.storage.postgresql - INFO - 按来源保存手动搜索公告完成,总计保存 13 条公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.main - INFO - 保存手动搜索公告完成:共保存 13 条,按来源统计: {'ZcyAnnouncement1': 1, 'ZcyAnnouncement2': 1, 'ZcyAnnouncement3': 1, 'ZcyAnnouncement4': 1, 'ZcyAnnouncement5': 1, 'ZcyAnnouncement6': 1, 'ZcyAnnouncement7': 1, 'ZcyAnnouncement10': 1, 'ZcyAnnouncement11': 1, 'ZcyAnnouncement20': 1, 'ZcyAnnouncement21': 1, 'ZcyAnnouncement23': 1, '61-266648': 1}
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.filters.filters - INFO - 日期筛选: 1300 -> 352 条公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 352 -> 0 条公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 0 -> 0 条公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.main - INFO - 筛选后剩余 0 条公告
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.main - INFO - 手动爬取模式:跳过筛选后公告的数据库保存
|
||||
2026-05-06 15:08:29 - gx_gp_monitor.main - INFO - 爬取任务完成: {'success': True, 'total_crawled': 1300, 'filtered': 0, 'saved': 0, 'markdown_generated': False, 'notification_sent': False, 'filter_stats': {'keyword_filtered': 352, 'date_filtered': 948, 'duplicate_filtered': 0, 'source_filtered': 0}, 'filtered_announcements': []}
|
||||
2026-05-06 15:08:39 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:08:39 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: rMwd7/7jivhj3K171JP9cTR0n/vSdK/XxP5FWC4NirBXOkApNN...
|
||||
2026-05-06 15:08:39 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: aff09303a74cb9b91b58bda7f544420d89e99342
|
||||
2026-05-06 15:08:39 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: aff09303a74cb9b91b58bda7f544420d89e99342
|
||||
2026-05-06 15:08:39 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:39 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:39 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:08:39 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_manage, user=NongGuangGuo
|
||||
2026-05-06 15:08:39 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_manage, user: NongGuangGuo
|
||||
2026-05-06 15:08:39 - gx_gp_monitor.wechat.message_handler - INFO - 用户 NongGuangGuo 请求关键词管理
|
||||
2026-05-06 15:08:46 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:08:46 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: 9BiCuWCpV4Por0LpC3Q2d+iJL/AY9a8gv724JzeANrK2O/S/9L...
|
||||
2026-05-06 15:08:46 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 3b373232e89cde03fef86f3efae1d3848558428c
|
||||
2026-05-06 15:08:46 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 3b373232e89cde03fef86f3efae1d3848558428c
|
||||
2026-05-06 15:08:46 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:08:46 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:08:46 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:08:46 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_manage, user=NongGuangGuo
|
||||
2026-05-06 15:08:46 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_manage, user: NongGuangGuo
|
||||
2026-05-06 15:08:46 - gx_gp_monitor.wechat.message_handler - INFO - 用户 NongGuangGuo 请求关键词管理
|
||||
2026-05-06 15:08:50 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:50 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 30.48秒
|
||||
2026-05-06 15:08:50 - gx_gp_monitor - INFO - 开始爬取 结果公告
|
||||
2026-05-06 15:08:50 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:50 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.32秒
|
||||
2026-05-06 15:08:50 - gx_gp_monitor - INFO - 开始爬取 合同公告
|
||||
2026-05-06 15:08:51 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:51 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.29秒
|
||||
2026-05-06 15:08:51 - gx_gp_monitor - INFO - 开始爬取 更正公告
|
||||
2026-05-06 15:08:51 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:51 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.34秒
|
||||
2026-05-06 15:08:51 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示
|
||||
2026-05-06 15:08:51 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:51 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.32秒
|
||||
2026-05-06 15:08:51 - gx_gp_monitor - INFO - 开始爬取 单一来源公示
|
||||
2026-05-06 15:08:52 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:52 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.28秒
|
||||
2026-05-06 15:08:52 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示
|
||||
2026-05-06 15:08:52 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:52 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.46秒
|
||||
2026-05-06 15:08:52 - gx_gp_monitor - INFO - 开始爬取 履约验收公示
|
||||
2026-05-06 15:08:52 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:52 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.40秒
|
||||
2026-05-06 15:08:52 - gx_gp_monitor - INFO - 开始爬取 工程类公告
|
||||
2026-05-06 15:08:53 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:53 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.30秒
|
||||
2026-05-06 15:08:53 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告
|
||||
2026-05-06 15:08:53 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:53 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.26秒
|
||||
2026-05-06 15:08:53 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告
|
||||
2026-05-06 15:08:53 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:53 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.28秒
|
||||
2026-05-06 15:08:53 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:54 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.32秒
|
||||
2026-05-06 15:08:54 - gx_gp_monitor - INFO - 开始爬取 采购意向公开
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:54 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.30秒
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.main - INFO - 搜索到 1300 条原始公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.storage.postgresql - INFO - 开始按来源保存 1300 条手动搜索公告到专用表,每个来源最多保留 100 条
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement1 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement2 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement3 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement4 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement5 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement6 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement7 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement10 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement11 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement20 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement21 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement23 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.core.database - INFO - 批量保存公告到manual_announcements完成,影响行数: 1
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.storage.postgresql - INFO - 来源 61-266648 保存了 1 条手动搜索公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.storage.postgresql - INFO - 按来源保存手动搜索公告完成,总计保存 13 条公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.main - INFO - 保存手动搜索公告完成:共保存 13 条,按来源统计: {'ZcyAnnouncement1': 1, 'ZcyAnnouncement2': 1, 'ZcyAnnouncement3': 1, 'ZcyAnnouncement4': 1, 'ZcyAnnouncement5': 1, 'ZcyAnnouncement6': 1, 'ZcyAnnouncement7': 1, 'ZcyAnnouncement10': 1, 'ZcyAnnouncement11': 1, 'ZcyAnnouncement20': 1, 'ZcyAnnouncement21': 1, 'ZcyAnnouncement23': 1, '61-266648': 1}
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.filters.filters - INFO - 日期筛选: 1300 -> 352 条公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 352 -> 0 条公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 0 -> 0 条公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.main - INFO - 筛选后剩余 0 条公告
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.main - INFO - 手动爬取模式:跳过筛选后公告的数据库保存
|
||||
2026-05-06 15:08:54 - gx_gp_monitor.main - INFO - 爬取任务完成: {'success': True, 'total_crawled': 1300, 'filtered': 0, 'saved': 0, 'markdown_generated': False, 'notification_sent': False, 'filter_stats': {'keyword_filtered': 352, 'date_filtered': 948, 'duplicate_filtered': 0, 'source_filtered': 0}, 'filtered_announcements': []}
|
||||
2026-05-06 15:09:28 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:09:28 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: thc6lzWswZ3ZylEM+A5xlLi2CKg5D6FMa1JFGzAuW6/IrfJMqq...
|
||||
2026-05-06 15:09:28 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 16e97f27eb0f7307ebb9b87c5a072b613b2c8a18
|
||||
2026-05-06 15:09:28 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 16e97f27eb0f7307ebb9b87c5a072b613b2c8a18
|
||||
2026-05-06 15:09:28 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:09:28 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:09:28 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:09:28 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=help_guide, user=NongGuangGuo
|
||||
2026-05-06 15:09:28 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: help_guide, user: NongGuangGuo
|
||||
2026-05-06 15:09:28 - gx_gp_monitor.wechat.message_handler - INFO - 用户 NongGuangGuo 请求使用说明
|
||||
2026-05-06 15:09:33 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:09:33 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: 5ju3K87vTeR4WaPsI8IqATUO1g30XklsBfeGNDSzcH09aZgr3x...
|
||||
2026-05-06 15:09:33 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 5c49ef855bd9a5763992d62e734aef75666a4a2c
|
||||
2026-05-06 15:09:33 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 5c49ef855bd9a5763992d62e734aef75666a4a2c
|
||||
2026-05-06 15:09:33 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:09:33 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:09:33 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:09:33 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=today_stats, user=WeiJueSen
|
||||
2026-05-06 15:09:33 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: today_stats, user: WeiJueSen
|
||||
2026-05-06 15:09:33 - gx_gp_monitor.wechat.message_handler - INFO - 用户 WeiJueSen 请求今日统计
|
||||
2026-05-09 10:31:46 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 384
|
||||
2026-05-09 10:31:46 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: Cu+8S6elykWeq3afFdD/lbMtOni21mETVdpRjEn+AHtiYRlBYV...
|
||||
2026-05-09 10:31:46 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 21012d5bc0f6d7e71328b0ec2ccb62b938898f89
|
||||
2026-05-09 10:31:46 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 21012d5bc0f6d7e71328b0ec2ccb62b938898f89
|
||||
2026-05-09 10:31:46 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-09 10:31:46 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-09 10:31:46 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-09 10:31:46 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=subscribe, event_key=None, user=LuLiuCui
|
||||
2026-05-09 10:31:46 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: subscribe, key: None, user: LuLiuCui
|
||||
@@ -0,0 +1,139 @@
|
||||
2026-05-06 15:07:43 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:07:43 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: vlN4cpR79+nVcy2Cvf22D4nsbOxqtyYFlVO3nvPdIz2NLVZTCr...
|
||||
2026-05-06 15:07:43 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 060aff2e6666d1df9c957ebb61d214664c64e72f
|
||||
2026-05-06 15:07:43 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 060aff2e6666d1df9c957ebb61d214664c64e72f
|
||||
2026-05-06 15:07:43 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:07:43 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:07:43 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:07:43 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=crawl_now, user=NongGuangGuo
|
||||
2026-05-06 15:07:43 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: crawl_now, user: NongGuangGuo
|
||||
2026-05-06 15:07:43 - gx_gp_monitor.wechat.message_handler - INFO - 用户 NongGuangGuo 触发立即搜索
|
||||
2026-05-06 15:07:43 - gx_gp_monitor.main - INFO - 开始执行搜索任务 (手动搜索: False)
|
||||
2026-05-06 15:07:43 - gx_gp_monitor.core.reliability - INFO - 健康检查通过
|
||||
2026-05-06 15:07:43 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源
|
||||
2026-05-06 15:07:43 - gx_gp_monitor - INFO - 开始爬取 采购公告
|
||||
2026-05-06 15:07:44 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:07:44 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 0.53秒
|
||||
2026-05-06 15:07:44 - gx_gp_monitor - INFO - 开始爬取 结果公告
|
||||
2026-05-06 15:07:44 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:07:44 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.43秒
|
||||
2026-05-06 15:07:44 - gx_gp_monitor - INFO - 开始爬取 合同公告
|
||||
2026-05-06 15:07:45 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:07:45 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.29秒
|
||||
2026-05-06 15:07:45 - gx_gp_monitor - INFO - 开始爬取 更正公告
|
||||
2026-05-06 15:07:45 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:07:45 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.38秒
|
||||
2026-05-06 15:07:45 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示
|
||||
2026-05-06 15:07:45 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:07:45 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.31秒
|
||||
2026-05-06 15:07:45 - gx_gp_monitor - INFO - 开始爬取 单一来源公示
|
||||
2026-05-06 15:07:46 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:07:46 - gx_gp_monitor - INFO - 单一来源公示 爬取完成,共获取 100 条公告,耗时 0.34秒
|
||||
2026-05-06 15:07:46 - gx_gp_monitor - INFO - 开始爬取 电子卖场公示
|
||||
2026-05-06 15:07:46 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:07:46 - gx_gp_monitor - INFO - 电子卖场公示 爬取完成,共获取 100 条公告,耗时 0.51秒
|
||||
2026-05-06 15:07:46 - gx_gp_monitor - INFO - 开始爬取 履约验收公示
|
||||
2026-05-06 15:07:47 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:07:47 - gx_gp_monitor - INFO - 履约验收公示 爬取完成,共获取 100 条公告,耗时 0.30秒
|
||||
2026-05-06 15:07:47 - gx_gp_monitor - INFO - 开始爬取 工程类公告
|
||||
2026-05-06 15:07:47 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:07:47 - gx_gp_monitor - INFO - 工程类公告 爬取完成,共获取 100 条公告,耗时 0.27秒
|
||||
2026-05-06 15:07:47 - gx_gp_monitor - INFO - 开始爬取 框架协议征集公告
|
||||
2026-05-06 15:07:47 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:07:47 - gx_gp_monitor - INFO - 框架协议征集公告 爬取完成,共获取 100 条公告,耗时 0.35秒
|
||||
2026-05-06 15:07:47 - gx_gp_monitor - INFO - 开始爬取 框架协议入围结果公告
|
||||
2026-05-06 15:07:47 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:07:47 - gx_gp_monitor - INFO - 框架协议入围结果公告 爬取完成,共获取 100 条公告,耗时 0.32秒
|
||||
2026-05-06 15:07:47 - gx_gp_monitor - INFO - 开始爬取 框架协议成交结果汇总公告
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:07:48 - gx_gp_monitor - INFO - 框架协议成交结果汇总公告 爬取完成,共获取 100 条公告,耗时 0.35秒
|
||||
2026-05-06 15:07:48 - gx_gp_monitor - INFO - 开始爬取 采购意向公开
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:07:48 - gx_gp_monitor - INFO - 采购意向公开 爬取完成,共获取 100 条公告,耗时 0.33秒
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.crawler.spider - INFO - 爬取完成: 共处理 13 个来源,成功 13 个,失败 0 个,获取 1300 条公告
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.main - INFO - 搜索到 1300 条原始公告
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.storage.postgresql - INFO - 开始按来源保存 1300 条公告,每个来源最多保留 100 条
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.core.database - ERROR - 数据库连接错误: connection already closed
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.core.database - ERROR - 批量保存公告失败: connection already closed
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement1 保存了 0 条公告
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.core.database - ERROR - 数据库连接错误: connection already closed
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.core.database - ERROR - 批量保存公告失败: connection already closed
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement2 保存了 0 条公告
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.core.database - ERROR - 数据库连接错误: connection already closed
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.core.database - ERROR - 批量保存公告失败: connection already closed
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement3 保存了 0 条公告
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.core.database - ERROR - 数据库连接错误: connection already closed
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.core.database - ERROR - 批量保存公告失败: connection already closed
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement4 保存了 0 条公告
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.core.database - ERROR - 数据库连接错误: connection already closed
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.core.database - ERROR - 批量保存公告失败: connection already closed
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement5 保存了 0 条公告
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement6 保存了 0 条公告
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 1 条
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement7 保存了 1 条公告
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 1 条
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement10 保存了 1 条公告
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 1 条
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement11 保存了 1 条公告
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement20 保存了 0 条公告
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement21 保存了 0 条公告
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 0 条
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.storage.postgresql - INFO - 来源 ZcyAnnouncement23 保存了 0 条公告
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.core.database - INFO - 批量保存公告完成,成功保存 1 条
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.storage.postgresql - INFO - 来源 61-266648 保存了 1 条公告
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.storage.postgresql - INFO - 按来源保存完成,总计保存 4 条公告
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.main - INFO - 保存自动爬取公告完成:共保存 4 条,按来源统计: {'ZcyAnnouncement1': 0, 'ZcyAnnouncement2': 0, 'ZcyAnnouncement3': 0, 'ZcyAnnouncement4': 0, 'ZcyAnnouncement5': 0, 'ZcyAnnouncement6': 0, 'ZcyAnnouncement7': 1, 'ZcyAnnouncement10': 1, 'ZcyAnnouncement11': 1, 'ZcyAnnouncement20': 0, 'ZcyAnnouncement21': 0, 'ZcyAnnouncement23': 0, '61-266648': 1}
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.main - INFO - 筛选出 1300 条新公告
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.filters.filters - INFO - 来源筛选: 1300 -> 1300 条公告
|
||||
2026-05-06 15:07:49 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 512
|
||||
2026-05-06 15:07:49 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: GwLOHlMWE3qBsHJ3DegXZk5RGOb0hEg2g9SbYIvxkhynxr/43t...
|
||||
2026-05-06 15:07:49 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 052516f0e87dd3793a1035dccb0f3b3d9fd806de
|
||||
2026-05-06 15:07:49 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 052516f0e87dd3793a1035dccb0f3b3d9fd806de
|
||||
2026-05-06 15:07:49 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:07:49 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:07:49 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=text
|
||||
2026-05-06 15:07:49 - gx_gp_monitor.wechat.callback_server - INFO - 处理文本消息: content=河池分行大化瑶族自治县中医医院结算系
|
||||
统项目..., user=NongGuangGuo
|
||||
2026-05-06 15:07:49 - gx_gp_monitor.wechat.message_handler - INFO - 处理文本消息: 河池分行大化瑶族自治县中医医院结算系
|
||||
统项目, user: NongGuangGuo
|
||||
2026-05-06 15:07:49 - gx_gp_monitor.wechat.message_handler - INFO - 用户 NongGuangGuo 关键词搜索: ['河池分行大化瑶族自治县中医医院结算系', '统项目']
|
||||
2026-05-06 15:07:49 - gx_gp_monitor.main - INFO - 开始执行搜索任务 (手动搜索: True)
|
||||
2026-05-06 15:07:49 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源
|
||||
2026-05-06 15:07:49 - gx_gp_monitor - INFO - 开始爬取 采购公告
|
||||
2026-05-06 15:07:49 - gx_gp_monitor.filters.filters - INFO - 去重筛选: 移除了 803 条重复公告
|
||||
2026-05-06 15:07:49 - gx_gp_monitor.filters.filters - INFO - 关键词筛选: 497 -> 0 条公告
|
||||
2026-05-06 15:07:49 - gx_gp_monitor.filters.filters - INFO - 筛选完成: 总数 1300 -> 筛选后 0 (关键词: 497, 日期: 0, 去重: 803, 来源: 0)
|
||||
2026-05-06 15:07:49 - gx_gp_monitor.main - INFO - 筛选后剩余 0 条公告
|
||||
2026-05-06 15:07:49 - gx_gp_monitor.storage.md_generator - INFO - Markdown文件已保存到: onu.md (共 0 条公告)
|
||||
2026-05-06 15:07:49 - gx_gp_monitor.main - INFO - 爬取任务完成: {'success': True, 'total_crawled': 1300, 'filtered': 0, 'saved': 0, 'markdown_generated': True, 'notification_sent': False, 'filter_stats': {'keyword_filtered': 1797, 'date_filtered': 0, 'duplicate_filtered': 803, 'source_filtered': 0}}
|
||||
2026-05-06 15:07:51 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:07:51 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: p4+cMpoxGV5kJJ2lLlM6u6/HHN4OJMSHH/wxWwSxKkZGGxajZn...
|
||||
2026-05-06 15:07:51 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: fc48810bdc9c0216f44d1adde162007b4cca0790
|
||||
2026-05-06 15:07:51 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: fc48810bdc9c0216f44d1adde162007b4cca0790
|
||||
2026-05-06 15:07:51 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:07:51 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:07:51 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:07:51 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=crawl_now, user=NongGuangGuo
|
||||
2026-05-06 15:07:51 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: crawl_now, user: NongGuangGuo
|
||||
2026-05-06 15:07:51 - gx_gp_monitor.wechat.message_handler - INFO - 用户 NongGuangGuo 触发立即搜索
|
||||
2026-05-06 15:07:51 - gx_gp_monitor.main - INFO - 开始执行搜索任务 (手动搜索: False)
|
||||
2026-05-06 15:07:51 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源
|
||||
2026-05-06 15:07:51 - gx_gp_monitor - INFO - 开始爬取 采购公告
|
||||
2026-05-06 15:08:20 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:20 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 30.54秒
|
||||
2026-05-06 15:08:20 - gx_gp_monitor - INFO - 开始爬取 结果公告
|
||||
2026-05-06 15:08:20 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:20 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.34秒
|
||||
2026-05-06 15:08:20 - gx_gp_monitor - INFO - 开始爬取 合同公告
|
||||
2026-05-06 15:08:20 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:20 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.31秒
|
||||
2026-05-06 15:08:20 - gx_gp_monitor - INFO - 开始爬取 更正公告
|
||||
2026-05-06 15:08:21 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:21 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.33秒
|
||||
2026-05-06 15:08:21 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示
|
||||
2026-05-06 15:08:21 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:21 - gx_gp_monitor - INFO - 招标文件预公示 爬取完成,共获取 100 条公告,耗时 0.31秒
|
||||
2026-05-06 15:08:21 - gx_gp_monitor - INFO - 开始爬取 单一来源公示
|
||||
@@ -0,0 +1,48 @@
|
||||
2026-05-06 15:07:40 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: QMt5ylkt6tq8Vl8TdJuv5/WIdXPum6+KEhz/iY06ZJZ6cc6oAi...
|
||||
2026-05-06 15:07:40 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: d9502bdfb3f5fe20997c0668e5f7af42d6444726
|
||||
2026-05-06 15:07:40 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: d9502bdfb3f5fe20997c0668e5f7af42d6444726
|
||||
2026-05-06 15:07:40 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:07:40 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:07:40 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:07:40 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=keyword_manage, user=NongGuangGuo
|
||||
2026-05-06 15:07:40 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: keyword_manage, user: NongGuangGuo
|
||||
2026-05-06 15:07:40 - gx_gp_monitor.wechat.message_handler - INFO - 用户 NongGuangGuo 请求关键词管理
|
||||
2026-05-06 15:07:46 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:07:46 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: p4+cMpoxGV5kJJ2lLlM6u6/HHN4OJMSHH/wxWwSxKkZGGxajZn...
|
||||
2026-05-06 15:07:46 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: fc48810bdc9c0216f44d1adde162007b4cca0790
|
||||
2026-05-06 15:07:46 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: fc48810bdc9c0216f44d1adde162007b4cca0790
|
||||
2026-05-06 15:07:46 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:07:46 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:07:46 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:07:46 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=crawl_now, user=NongGuangGuo
|
||||
2026-05-06 15:07:46 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: crawl_now, user: NongGuangGuo
|
||||
2026-05-06 15:07:46 - gx_gp_monitor.wechat.message_handler - INFO - 用户 NongGuangGuo 触发立即搜索
|
||||
2026-05-06 15:07:46 - gx_gp_monitor.main - INFO - 开始执行搜索任务 (手动搜索: False)
|
||||
2026-05-06 15:07:46 - gx_gp_monitor.core.reliability - INFO - 健康检查通过
|
||||
2026-05-06 15:07:46 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源
|
||||
2026-05-06 15:07:46 - gx_gp_monitor - INFO - 开始爬取 采购公告
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.wechat.callback_server - ERROR - ✅ XML解析成功,提取的encrypt长度: 472
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.wechat.callback_server - ERROR - 提取的encrypt前50字符: vlN4cpR79+nVcy2Cvf22D4nsbOxqtyYFlVO3nvPdIz2NLVZTCr...
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.wechat.callback_server - ERROR - 计算的签名: 060aff2e6666d1df9c957ebb61d214664c64e72f
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.wechat.callback_server - ERROR - 接收的签名: 060aff2e6666d1df9c957ebb61d214664c64e72f
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.wechat.callback_server - ERROR - 签名匹配: True
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.wechat.callback_server - ERROR - 尝试使用默认token计算签名...
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.wechat.callback_server - INFO - 收到企业微信消息: 类型=event
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.wechat.callback_server - INFO - 处理事件消息: event=click, event_key=crawl_now, user=NongGuangGuo
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.wechat.message_handler - INFO - 处理事件: click, key: crawl_now, user: NongGuangGuo
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.wechat.message_handler - INFO - 用户 NongGuangGuo 触发立即搜索
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.main - INFO - 开始执行搜索任务 (手动搜索: False)
|
||||
2026-05-06 15:07:48 - gx_gp_monitor.crawler.spider - INFO - 开始爬取 13 个公告来源
|
||||
2026-05-06 15:07:48 - gx_gp_monitor - INFO - 开始爬取 采购公告
|
||||
2026-05-06 15:08:17 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:17 - gx_gp_monitor - INFO - 采购公告 爬取完成,共获取 100 条公告,耗时 30.47秒
|
||||
2026-05-06 15:08:17 - gx_gp_monitor - INFO - 开始爬取 结果公告
|
||||
2026-05-06 15:08:17 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:17 - gx_gp_monitor - INFO - 结果公告 爬取完成,共获取 100 条公告,耗时 0.34秒
|
||||
2026-05-06 15:08:17 - gx_gp_monitor - INFO - 开始爬取 合同公告
|
||||
2026-05-06 15:08:17 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:17 - gx_gp_monitor - INFO - 合同公告 爬取完成,共获取 100 条公告,耗时 0.31秒
|
||||
2026-05-06 15:08:17 - gx_gp_monitor - INFO - 开始爬取 更正公告
|
||||
2026-05-06 15:08:18 - gx_gp_monitor.crawler.parsers - INFO - 成功解析 100/100 条公告记录
|
||||
2026-05-06 15:08:18 - gx_gp_monitor - INFO - 更正公告 爬取完成,共获取 100 条公告,耗时 0.33秒
|
||||
2026-05-06 15:08:18 - gx_gp_monitor - INFO - 开始爬取 招标文件预公示
|
||||
File diff suppressed because it is too large
Load Diff
+107029
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
📋 关键词搜索: `未知` - 总公告数: `0`
|
||||
|
||||
**更新时间: 2026-01-09 17:12:55**
|
||||
**更新时间: 2026-05-06 15:08:57**
|
||||
|
||||
|
||||
## 无匹配公告
|
||||
|
||||
+9
-6
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
# 定时搜索脚本启动器
|
||||
# 用于启动广西政府采购网公告定时搜索任务
|
||||
# 用于启动广西政府采购网和大化县政府网公告定时搜索任务
|
||||
# 自动激活项目虚拟环境并运行Python脚本
|
||||
|
||||
# 设置脚本遇到错误时退出
|
||||
@@ -11,8 +11,11 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$SCRIPT_DIR"
|
||||
|
||||
echo "========================================"
|
||||
echo "🕒 广西政府采购网公告定时搜索任务"
|
||||
echo "🕒 政府采购公告定时搜索任务"
|
||||
echo "📂 项目目录: $PROJECT_ROOT"
|
||||
echo "🌐 监控网站:"
|
||||
echo " - 广西政府采购网 (zfcg.gxzf.gov.cn)"
|
||||
echo " - 大化县政府网 (gxdh.gov.cn)"
|
||||
echo "⏰ 开始时间: $(date '+%Y-%m-%d %H:%M:%S')"
|
||||
echo "========================================"
|
||||
|
||||
@@ -67,15 +70,15 @@ fi
|
||||
|
||||
echo "✅ 环境检查通过"
|
||||
|
||||
# 检查当前时间是否在凌晨休息时间段 (00:10 - 07:00)
|
||||
# 检查当前时间是否在夜间休息时间段 (23:00 - 07:00)
|
||||
CURRENT_HOUR=$(date +%H)
|
||||
CURRENT_MINUTE=$(date +%M)
|
||||
CURRENT_TIME=$((CURRENT_HOUR * 60 + CURRENT_MINUTE))
|
||||
START_TIME=$((0 * 60 + 10)) # 00:10
|
||||
START_TIME=$((23 * 60 + 0)) # 23:00
|
||||
END_TIME=$((7 * 60 + 0)) # 07:00
|
||||
|
||||
if [ $CURRENT_TIME -ge $START_TIME ] && [ $CURRENT_TIME -lt $END_TIME ]; then
|
||||
echo "🌙 当前时间 $(date '+%H:%M') 在凌晨休息时间段 (00:10-07:00)"
|
||||
if [ $CURRENT_TIME -ge $START_TIME ] || [ $CURRENT_TIME -lt $END_TIME ]; then
|
||||
echo "🌙 当前时间 $(date '+%H:%M') 在夜间休息时间段 (23:00-07:00)"
|
||||
echo "💤 跳过爬取任务,直接结束"
|
||||
echo "========================================"
|
||||
echo "🏁 任务跳过"
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
1265
|
||||
984557
|
||||
|
||||
Reference in New Issue
Block a user