123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393 |
- # -*- coding: utf-8 -*-
- """
- Created on 2025-04-24
- ---------
- @summary: 湖南省网上中介服务超市
- ---------
- @author: lzz
- """
- import feapder
- from items.spider_item import DataBakItem
- from untils.attachment import AttachmentDownloader
- class Details(feapder.BiddingDetailSpider):
- def start_requests(self):
- data_list = self.get_tasks_by_rabbitmq(limit=30)
- for item in data_list:
- # log.debug(item)
- request_params = item.get("request_params")
- yield feapder.Request(url=item.get("parse_url"), item=item, files_info=item.get("files"),
- deal_detail=item.get("deal_detail"),
- callback=eval(item.get("parse")), **request_params)
- def detail_get(self,request,response):
- items = request.item
- list_item = DataBakItem(**items)
- detail_info = response.json.get('data').get('purchaseNoticeViewVo')
- if detail_info.get('isPark') is False:
- isPark = "否"
- elif detail_info.get('isPark') is True:
- isPark = "是"
- else:
- isPark = "否"
- if detail_info.get('isInvestmentProject') is False:
- isInvestmentProject = "否"
- elif detail_info.get('isInvestmentProject') is False:
- isInvestmentProject = "是"
- else:
- isInvestmentProject = "否"
- restrictionsForehead = str(detail_info.get('restrictionsForehead'))
- restrictionsForeheadType = detail_info.get('restrictionsForeheadType')
- if restrictionsForeheadType == "tallyAmount":
- restrictionsForehead = "账上金额(¥" + restrictionsForehead +"元)"
- elif restrictionsForeheadType == "totalAssets":
- restrictionsForehead = "资产总额(¥" + restrictionsForehead + "元)"
- elif restrictionsForeheadType == "squareMeter":
- restrictionsForehead = "平方米(" + restrictionsForehead + "平方米)"
- elif restrictionsForeheadType == "amountInvested":
- restrictionsForehead = "投资额(¥" + restrictionsForehead + "元)"
- elif restrictionsForeheadType == "other":
- restrictionsForehead = "其他(" + restrictionsForehead + ")"
- else:
- restrictionsForehead = restrictionsForehead
- zjfwjgyq_html = ""
- zjfwjgyq = detail_info.get('zjfwjgyq')
- if "sfyzzyq" in zjfwjgyq:
- zjfwjgyq_html += "资质(资格)要求、"
- if "sfybayq" in zjfwjgyq:
- zjfwjgyq_html += "备案要求、"
- if "sfyryzzzcyq" in zjfwjgyq:
- zjfwjgyq_html += "执业(职业)人员要求、"
- if "sfjcnfwjk" in zjfwjgyq:
- zjfwjgyq_html += "仅承诺服务即可、"
- biddingMode = detail_info.get('biddingMode')
- if biddingMode == "MONEY":
- if not detail_info.get('lowPrice') and detail_info.get('highPrice'):
- ServicePrice = " 低于或等于¥" + str(detail_info.get('highPrice')) + "元 "
- elif detail_info.get('lowPrice') and detail_info.get('highPrice'):
- ServicePrice = " ¥" + str(detail_info.get('lowPrice')) + "元至¥" + str(detail_info.get('highPrice')) + "元 "
- else:
- ServicePrice = " 高于或等于¥" + str(detail_info.get('lowPrice')) + "元 "
- elif biddingMode == "RATE":
- if not detail_info.get('lowPrice') and detail_info.get('highPrice'):
- ServicePrice = " 低于或等于" + str(detail_info.get('highPrice')) + "%下浮率 "
- elif detail_info.get('lowPrice') and detail_info.get('highPrice'):
- ServicePrice = str(detail_info.get('lowPrice')) + "至" + str(detail_info.get('highPrice')) + "%下浮率 "
- else:
- ServicePrice = " 高于或等于" + str(detail_info.get('lowPrice')) + "%下浮率 "
- else:
- if not detail_info.get('lowPrice') and detail_info.get('highPrice'):
- ServicePrice = " ¥" + str(detail_info.get('highPrice')) + "元 "
- elif detail_info.get('lowPrice') and detail_info.get('highPrice'):
- ServicePrice = " ¥" + str(detail_info.get('lowPrice')) + "元至¥" + str(detail_info.get('highPrice')) + "元 "
- else:
- ServicePrice = " ¥" + str(detail_info.get('lowPrice')) + "元 "
- if detail_info.get('selectTypeName'):
- selectTypeName = detail_info.get('selectTypeName')
- else:
- selectTypeName = detail_info.get('selectModeTypeName')
- if detail_info.get('approvalOrgName'):
- approvalOrgName = detail_info.get('approvalOrgName')
- else:
- approvalOrgName = ""
- if detail_info.get('publishDate'):
- footer_publishDate = detail_info.get('publishDate').split(" ")[0]
- else:
- footer_publishDate = ""
- file_html = "暂无附件"
- file_list = detail_info.get('attachmentVoList')
- if file_list:
- attachments = {}
- for f_item in file_list:
- temp = f'''
- <a class="download-btn">{f_item.get('name')}</a>
- '''
- file_html = file_html.replace("暂无附件","") + temp
- file_name = f_item.get('name')
- file_type = f_item.get('fileType').replace(".","")
- file_url = f"http://zwfw-new.hunan.gov.cn/hn-zjcs-pub/file/downloadfile/PjAttachment/{f_item.get('attachmentCode')}"
- file_types = ['zip','docx','ftp','pdf','doc','rar','gzzb','jpg','png','zbid','xls','xlsx','swp']
- if file_type in file_types:
- attachment = AttachmentDownloader().fetch_attachment(
- file_name=file_name, file_type=file_type, download_url=file_url,
- enable_proxy=False)
- attachments[str(len(attachments) + 1)] = attachment
- if len(attachments) == 0:
- pass
- else:
- list_item.projectinfo = {"attachments": attachments}
- html = f'''
- <div class="pannel-cont">
- <div class="pannel-title">
- <div class="pannel-title-name">
- 关于为【{detail_info.get('purOrgName')}】公开选取【{detail_info.get('serviceTypeName')}】机构的公告
- </div>
- <div class="pannel-title-content">
- <div class="content-phone">
- <span class="info-label">采购发布时间:</span>
- <span class="info-value">{detail_info.get('publishDate')}</span>
- </div>
- <div class="content-addr">
- <span class="info-label">报名结束时间:</span>
- <span class="info-value">{detail_info.get('signUpEndTime')}</span>
- </div>
- </div>
- </div>
- <div >
- <div>
- <div class="content-info">
- <div>
- <div>
- <div class="content-name">采购项目名称</div>
- </div>
- <div>
- <div class="content-value">{detail_info.get('projectName')}</div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">委托人名称</div>
- </div>
- <div>
- <div class="content-value">{detail_info.get('purOrgName')}</div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">区域性评估采购</div>
- </div>
- <div>
- <div class="content-value">{isPark}</div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">中介事项名称</div>
- </div>
- <div>
- <div class="content-value">{detail_info.get('serviceSubjectName')}</div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">投资审批项目</div>
- </div>
- <div>
- <div class="content-value">{isInvestmentProject}</div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">投资审批项目编码</div>
- </div>
- <div>
- <div class="content-value">{detail_info.get('vcProcessProjectCode')}</div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">采购项目编码</div>
- </div>
- <div>
- <div class="content-value">{detail_info.get('projectCode')}</div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">项目规模</div>
- </div>
- <div>
- <div class="content-value">{restrictionsForehead}</div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">项目规模说明</div>
- </div>
- <div>
- <div class="content-value">
- {detail_info.get('restrictionsDescription')}
- </div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">服务类型</div>
- </div>
- <div>
- <div class="content-value">{detail_info.get('serviceTypeName')}</div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">服务时限</div>
- </div>
- <div>
- <div class="content-value">{detail_info.get('serviceTimeLimit')}</div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">服务金额</div>
- </div>
- <div>
- <div class="content-value"> {ServicePrice}</div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">金额说明</div>
- </div>
- <div>
- <div class="content-value">{detail_info.get('priceDescription')}</div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">服务内容</div>
- </div>
- <div>
- <div class="content-value">{detail_info.get('servcieContent')}</div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">中介机构要求</div>
- </div>
- <div>
- <div class="content-value">{zjfwjgyq_html}</div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">资质要求</div>
- </div>
- <div>
- <div class="content-value">
- {detail_info.get('qualRequire')}
- </div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">备案要求说明</div>
- </div>
- <div>
- <div class="content-value">{detail_info.get('bayqsm')}</div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">其他要求说明</div>
- </div>
- <div>
- <div class="content-value">
- {detail_info.get('otherRequirements')}
- </div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">选取中介方式</div>
- </div>
- <div>
- <div class="content-value">
- {selectTypeName}
- </div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">截止报名时间</div>
- </div>
- <div>
- <div class="content-value">{detail_info.get('signUpEndTime')}</div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">公开选取中介时间</div>
- </div>
- <div>
- <div class="content-value">{detail_info.get('selectTime')}</div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">咨询电话</div>
- </div>
- <div>
- <div class="content-value">{detail_info.get('consultPhone')}</div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">监督电话</div>
- </div>
- <div>
- <div class="content-value">{detail_info.get('complaintsHotline')}</div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">备注</div>
- </div>
- <div>
- <div class="content-value">
- {detail_info.get('note')}
- </div>
- </div>
- </div>
- <div>
- <div>
- <div class="content-name">附件下载</div>
- </div>
- <div>
- <div class="content-value">
- <div>
- {file_html}
- </div>
- </div>
- </div>
- </div>
- <div>
- <div class="el-col el-col-24" style="padding-left: 10px; padding-right: 10px;">
- <div class="content-value" style="text-align: right;">{approvalOrgName}</div>
- </div>
- <div class="el-col el-col-24" style="padding-left: 10px; padding-right: 10px;">
- <div class="content-value" style="text-align: right;">{footer_publishDate}</div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- '''
- list_item.contenthtml = html.replace("None","无")
- yield list_item
- if __name__ == "__main__":
- Details(redis_key="lzz:Hnswszjfwcs").start()
|