
影刀RPA 政府公开数据获取招投标公示信息采集什么情况用什么 → 怎么做 → 有什么坑作者林焱 | 飞行社出品什么情况用什么企业需要跟踪政府招投标信息寻找商机。手动刷中国政府采购网、“各省公共资源交易中心”每天花1小时还容易漏掉。这套方案适合企业市场/销售部门跟踪招投标机会招标代理机构批量采集公告信息数据分析公司做招投标数据分析核心工具影刀RPA网页自动化 政府采购平台API部分平台有 数据分析怎么做第一步确定目标平台和数据源主要招投标信息平台中国政府采购网http://www.ccgp.gov.cn/ 国家级各省公共资源交易中心如上海市公共资源交易中心中国招标投标公共服务平台http://bulletin.cebpubservice.com/拼多多店群自动化上架方案企业自己的招标平台如中国移动采购与招标网# 主要平台URL规律PLATFORMS{中国政府采购网:{list_url:http://www.ccgp.gov.cn/search/getTips?keywords{keyword}page{page},detail_base:http://www.ccgp.gov.cn/notice/},上海公共资源交易:{list_url:https://www.shggzy.com/jyxxgczscq/list_{page}.html,detail_base:https://www.shggzy.com/jyxxgczscq/},# ... 其他平台}第二步采集招投标公告列表以中国政府采购网为例importrequestsfrombs4importBeautifulSoupimportpandasaspdimporttimeimportredeffetch_ccgp_list(keyword,max_pages10):采集中国政府采购网的招标公告results[]headers{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...,Referer:http://www.ccgp.gov.cn/}forpageinrange(1,max_pages1):urlfhttp://www.ccgp.gov.cn/search/getTips?keywords{keyword}page{page}print(f采集第{page}页...)try:resprequests.get(url,headersheaders,timeout10)dataresp.json()ifnotdata.get(data):break# 没有更多数据foritemindata[data]:results.append({标题:item.get(title,),发布时间:item.get(time,),采购人:item.get(purchaser,),金额:item.get(amount,),链接:http://www.ccgp.gov.cnitem.get(url,),来源平台:中国政府采购网})time.sleep(2)# 避免请求过快exceptExceptionase:print(f采集第{page}页失败:{e})breakreturnpd.DataFrame(results)# 使用dffetch_ccgp_list(keyword信息化,max_pages20)print(f采集到{len(df)}条招标公告)第三步采集公告详情页列表页信息有限需要进入详情页采集完整内容招标要求、投标截止时间、联系方式等deffetch_ccgp_detail(notice_url):采集招标公告详情headers{User-Agent:Mozilla/5.0 ...}resprequests.get(notice_url,headersheaders,timeout15)resp.encodingutf-8soupBeautifulSoup(resp.text,html.parser)detail{链接:notice_url}# 提取标题titlesoup.select_one(.notice-title)orsoup.select_one(h1)detail[标题]title.text.strip()iftitleelse# 提取发布时间time_elemsoup.select_one(.notice-time)orsoup.select_one(.time)detail[发布时间]time_elem.text.strip()iftime_elemelse# 提取正文内容content_elemsoup.select_one(.notice-content)orsoup.select_one(#content)ifcontent_elem:contentcontent_elem.get_text(stripTrue)detail[正文]content[:500]# 只取前500字# 从正文中提取关键信息# 1. 投标截止时间deadlinere.search(r投标截止时间[:]\s*([0-9年月至日\s:]),content)ifdeadline:detail[投标截止时间]deadline.group(1).strip()# 2. 预算金额budgetre.search(r预算金额[:]\s*([0-9,]\.?[0-9]*)\s*万元?,content)ifbudget:detail[预算金额]float(budget.group(1).replace(,,))# 3. 采购人联系方式contactre.search(r采购人[:]\s*([^\n]{2,50}),content)ifcontact:detail[采购人]contact.group(1).strip()returndetail# 批量采集详情多线程加速fromconcurrent.futuresimportThreadPoolExecutordefbatch_fetch_details(df,max_workers5):批量采集详情页withThreadPoolExecutor(max_workersmax_workers)asexecutor:futures[]forurlindf[链接].tolist()[:50]:# 只采集前50条futureexecutor.submit(fetch_ccgp_detail,url)futures.append(future)details[]forfutureinfutures:try:detailfuture.result(timeout30)details.append(detail)exceptExceptionase:print(f采集详情失败:{e})returnpd.DataFrame(details)第四步关键词匹配与商机预警importjiebaimportjieba.analyseclassBidOpportunityFinder:招投标商机发现器# 定义本公司的业务关键词COMPANY_KEYWORDS[信息化,软件开发,系统集成,IT服务,安防监控,网络设备,云计算,大数据]def__init__(self,company_keywordsNone):ifcompany_keywords:self.COMPANY_KEYWORDScompany_keywords# 加载自定义词典行业术语jieba.load_userdict(industry_dict.txt)defcalculate_relevance(self,title,content):计算招标公告与本公司业务的相关度0-100分score0# 1. 标题匹配权重最高forkeywordinself.COMPANY_KEYWORDS:ifkeywordintitle:score20# 2. 内容关键词匹配keywordsjieba.analyse.extract_tags(content,topK10,withWeightTrue)forword,weightinkeywords:ifwordinself.COMPANY_KEYWORDS:scoreint(weight*10)# 3. 预算金额金额越大优先级越高budgetself._extract_budget(content)ifbudget1000000:# 100万以上score15elifbudget500000:# 50万以上score10returnmin(score,100)# 最高100分def_extract_budget(self,content):从内容中提取预算金额# 多种预算金额表达方式patterns[r预算金额[:]\s*([0-9,]\.?[0-9]*)\s*万元?,r采购预算[:]\s*([0-9,]\.?[0-9]*)\s*元?,r项目概算[:]\s*([0-9,]\.?[0-9]*)\s*万元?]forpatterninpatterns:matchre.search(pattern,content)ifmatch:amountfloat(match.group(1).replace(,,))if万notinpattern:amountamount/10000# 转换为万元returnamountreturn0deffind_opportunities(self,bids_df):从招标公告中发现商机opportunities[]for_,rowinbids_df.iterrows():relevanceself.calculate_relevance(row[标题],row.get(正文,))ifrelevance40:# 相关度阈值opportunities.append({标题:row[标题],链接:row[链接],发布时间:row[发布时间],预算金额:row.get(预算金额,未知),投标截止时间:row.get(投标截止时间,未知),相关度评分:relevance,优先级:高ifrelevance70else中ifrelevance40else低})# 按相关度排序opportunities.sort(keylambdax:x[相关度评分],reverseTrue)returnopportunities第五步自动推送商机预警defsend_opportunity_alert(opportunities,webhook_url):将高价值商机推送到企微/钉钉# 只推送高优先级的商机high_priority[oforoinopportunitiesifo[优先级]高]ifnothigh_priority:print(今天没有高优先级商机)return# 构造消息内容content **招投标商机预警**\n\ncontentf今日发现 **{len(high_priority)}** 条高优先级商机\n\nfori,oppinenumerate(high_priority[:10],1):# 最多显示10条contentf**{i}.{opp[标题][:50]}**\ncontentf- 预算金额{opp[预算金额]}万元\ncontentf- 投标截止{opp[投标截止时间]}\ncontentf- [查看详情]({opp[链接]})\n\n# 发送到企微payload{msgtype:markdown,markdown:{content:content}}importrequests resprequests.post(webhook_url,jsonpayload)ifresp.json().get(errcode)0:print(f成功推送{len(high_priority)}条商机预警)else:print(f推送失败:{resp.text})第六步影刀RPA完整流程编排【定时触发】每天早上7:30早于上班时间 ↓ 【Python节点】fetch_ccgp_list() → 采集中国政府采购网 ↓ 【Python节点】fetch_other_platforms() → 采集其他平台 ↓ 【合并数据】将多个平台的招标公告合并 ↓ 【去重】根据标题发布时间去重同一公告可能出现在多个平台 ↓ 【Python节点】finder.find_opportunities() → 计算相关度 ↓ 【筛选】只保留相关度≥40分的公告 ↓ 【Python节点】send_opportunity_alert() → 推送高优先级商机 ↓ 【写入数据库】所有公告存入本地数据库用于历史分析 ↓ 【生成报告】招投标商机日报.xlsx → 按相关度排序 → 包含标题、平台、预算、截止时间、链接 ↓ 【发送邮件】将报告发送给市场/销售团队有什么坑坑1各平台网页结构差异大需要分别写解析规则中国政府采购网、各省公共资源交易中心、企业招标平台每个网站的HTML结构都不一样需要为每个平台单独写解析代码。解决方案用配置文件管理各平台的解析规则# platforms_config.json{中国政府采购网:{list_url:...,title_selector:.notice-title,time_selector:.notice-time,content_selector:.notice-content},上海公共资源交易:{list_url:...,title_selector:h2 a,time_selector:.publish-time,content_selector:#detail-content}}用影刀的【智能匹配】指令如果平台支持坑2网站改版解析规则失效政府网站不定期改版原来能用的CSS选择器突然失效。解决方案TEMU店群如何管理运营多选择器备选前面文章讲过监控解析成功率如果成功率80%自动发送告警defrobust_extract_with_fallback(soup,selectors,field_name):多选择器备选提取forselectorinselectors:elemsoup.select_one(selector)ifelem:returnelem.text.strip()# 所有选择器都失败记录日志logging.warning(f提取{field_name}失败可能页面已改版)return# 用法titlerobust_extract_with_fallback(soup,[.notice-title,h1.title,div.title h1,h2 a# 备选],标题)坑3访问频率限制IP被封政府网站也有反爬策略短时间大量请求会被封IP。解决方案降低请求频率每次请求间隔3-5秒使用代理IP池分布式采集多台电脑分别采集不同平台坑4数据量太大如何存储和检索如果每天采集100条公告一年就是3.6万条如何高效存储和检索解决方案用数据库SQLite/MySQL 全文搜索引擎Elasticsearch# 使用Elasticsearch存储和检索招标公告fromelasticsearchimportElasticsearchdefsave_to_elasticsearch(bid_data):保存到ES支持全文搜索esElasticsearch([localhost:9200])doc{title:bid_data[标题],content:bid_data[正文],publish_time:bid_data[发布时间],platform:bid_data[来源平台],budget:bid_data.get(预算金额,0),deadline:bid_data.get(投标截止时间,),url:bid_data[链接]}es.index(indexbid_notices,documentdoc)defsearch_bids(keyword,min_budget0,days7):搜索招标公告esElasticsearch([localhost:9200])query{bool:{must:[{match:{content:keyword}},{range:{budget:{gte:min_budget}}}],filter:[{range:{publish_time:{gte:fnow-{days}d}}}]}}resultes.search(indexbid_notices,queryquery,size50)returnresult[hits][hits]总结平台数据质量采集难度推荐指数中国政府采购网⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐各省公共资源交易⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐中国招标投标公共服务⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐企业招标平台⭐⭐⭐⭐⭐⭐⭐⭐实际落地建议先采集中国政府采购网数据最全格式最规范用影刀可视化流程比纯代码更容易维护做好异常处理网络超时、解析失败要有重试机制遵守法律法规不要对政府网站造成过大访问压力如果需要更稳定的数据可以考虑购买第三方招投标数据服务如招标雷达、采招网等他们有专业的采集团队和数据清洗流程。