简单小爬虫爬取招标信息 您所在的位置:网站首页 中标短信图片 简单小爬虫爬取招标信息

简单小爬虫爬取招标信息

2023-03-12 04:09| 来源: 网络整理| 查看: 265

以图像算法开发的名义入职的第一天,直属领导不在,隔壁通讯组小头目说,你就做个爬虫吧......虫吧......吧...... 没办法,写吧。但很久以前只写过很简单的爬虫,这次就边学边写。 基本功能:爬取某招投标网站上的项目内容和具体每个项目的截止日期时间,有关键字查询功能和截止日期设置功能。 已添加的后续功能:QQ聊天和电子邮件提示功能。

待添加的后续功能:网页UI或者程序UI

目标网站为招标公告,由于是数据是动态加载的url不变的多页表格内容,按爬取静态网站的方法是不可行,参考文章Python 爬虫爬取多页数据中的内容,首先对按F12对本网页工作原理进行分析。

第一部分:获取公告名称和相应id

F12打开控制台,选择Network->XHR,Ctrl+R重新跳转下,点击Name下的文件,选择Headers,下方显示的就是请求头文件信息,可以看到这是一个POST请求。

而我们要的消息就在Response中。

 使用Python模拟请求,在Headers下找到Request Headers部分,这是请求的头数据。同时观察Form Data部分,可见这部分定义了请求的表格的页码和每页的行数。进行模拟发送请求时,改变这部分内容就能获取不同页上的数据。

 将这部分内容复制后做整理,使用request.post就能获得response内容。

def visit_home(x=10):#默认找前10页 #模拟头部分 headers = { 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh,zh-CN;q=0.9,en-US;q=0.8,en;q=0.7', 'Connection': 'keep-alive', 'Content-Length': '14', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie': 'JSESSIONID=6938F495DAA5F25B2E458C7AB108BEDF', 'Host': '218.2.208.144:8094', 'Origin': 'http://218.2.208.144:8094', 'Referer': 'http://218.2.208.144:8094/EBTS/publish/announcement/paglist1?type=1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest' } #模拟form data部分 form_data = { 'page':'1', 'rows': '10' } #空字典存放信息 home_dict = {} #从第一页开始 times = 1 while times =str_data: print(str(num),task,"公告截止日期:",str_state) msg_content = msg_content+str(num)+" : "+task+" 公告截止日期:"+str(str_state)+'\n' else: print(str(num),task,"公告截止日期早于初始日期") msg_content = msg_content+str(num)+" : "+task+" 公告截止日期早于初始日期"+'\n' except: task = "项目网址出错" str_state = "未能获取时间" print(str(num),task,str_state) msg_content = msg_content+str(num)+" : "+task+" "+str_state+'\n' else: address_url = data_address_first1+str(i) return_data = requests.get(address_url) try: task = str(json.loads(return_data.content).get('BNNAME')) state = json.loads(return_data.content).get('KBBEGINTIME') state = str(state) str_state = state.replace("T"," ") #对截止日期的字符串进行处理,成为datatime时间日期格式 str_state = datetime.datetime.strptime(str_state, '%Y-%m-%d %H:%M:%S') #与设置的截止日期对比 if str_state>=str_data: print(str(num),task,"公告截止日期:",str_state) msg_content = msg_content+str(num)+" : "+task+" 公告截止日期:"+str(str_state)\ +'\n' else: print(str(num),task,"公告截止日期早于初始日期") msg_content = msg_content+str(num)+" : "+task+" 公告截止日期早于初始日期"+'\n' except: task = "项目网址出错" str_state = "未能获取时间" print(str(num),task,str_state) msg_content = msg_content+str(num)+" : "+task+" "+str_state+'\n' #此处为了统一方便,直接从具体公告信息内再次调出公告名,而放弃使用之前字典中的公告名 num = num + 1 return msg_content

这里的日期时间大约已经没问题了_(:зゝ∠)_ 

第三部分: 判断输入关键字是否出现函数和输入时间转换函数 #判断输入关键字是否出现函数 def get_name(str_key,home_dict): address_list = [] if len(str_key)!=0: for key in home_dict: if str_key in key: if int((home_dict[key])[1])==2:#即非首次发布的公告 address_list.append("gengzhenggonggao#"+str(home_dict[key][0])) else: address_list.append(str(home_dict[key][0])) if len(address_list)


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有