程序员一招解决公司前台MM手抽筋问题(爬取公开的招标信息)

某年11月的某一天,dashu准备打卡下班,故事开始...

  1. dashu:还不下班呀?每天都走得比我早的呀,今天脚抽筋了吗?
  2. 前台MM:不是脚抽,是手抽了。
  3. dashu:双11拆快递拆抽的吗?
  4. 前台MM:就买了一包吃的,忙死了,我在复印粘贴呢。你怎么走那么早呀?
  5. dashu:我今天有点低血糖,想早点走,说着就走过去一看,MM正对着复印粘贴呢。
  6. 前台MM:MM丢了一块巧克力给dashu,你试吃一下。
  7. dashu:好的,谢谢!都说吃人的嘴短,下次这种事可以叫我帮忙。
  8. 前台MM:好呀,天天都要做,你帮我做一半。
  9. dashu:啥?天天都要做?
  10. 前台MM:是呀,领导这周安排的新任务,就是把这个,这个,这个网址上面的信息复制下来。
  11. dashu:哦,简单,用python或java写个程序把它爬下来就可以了。
  12. 前台MM:我不会野。
  13. dashu:不会就学呀。
  14. 前台MM:等学会了,我都不在这里了。
  15. dashu:哦,也对。我教你,很快就会的那种。
  16. 前台MM:超过一天才学会的东西,我不学。
  17. 完了,难道一段纯结的友谊就这样结束了?没有深入的可能?故事要怎么编下去?马上安排。
  18. dashu:不用一天,下班前就能学会。
  19. 前台MM:P我,男人靠得住,母猪会上树。
  20. dashu:那是你没遇到我,让我看看是什么需求。(剧情点评:前一句情商100,后一句情商为0,典型理工男)
  21. 前台MM:你先去拖个椅子过来。
  22. dashu: dashu拖来椅子需求整理中。(剧情点评:dashu还真去拖。情商为负,还有其它方式可以加深交流)

概括下需求:访问公共资源中心,获取最新的采购公告标题;访问URL:http://ggzy.gz.gov.cn/jyywzfcgzfcgcggg/index.jhtml
开发工具:按键精娄2014.06PC版
解决思路:
1.先获取源文件(相当于在网页是点右键-查看源文件-然后保存下来,如下图)

OK,代码马上安排
如下3行代码搞定

//设置一个变量,叫公共资源URL,保存URL
公共资源URL = "http://ggzy.gz.gov.cn/jyywzfcgzfcgcggg/index.jhtml"
//获取源文件
网页 = Lib.网络.获得网页源文件_增强版(公共资源URL, "utf-8")
//保存源文件
Call Plugin.File.WriteFileEx("C:\dashu.txt", 网页)

运行后,获取的源文件如下:

2.解析源文件(通谷点根据特点截取标题)

实现步骤分析:

a)读取源文件。

b)分析标题在哪两个字符串之间,然后在网上找段功能代码用于截取两个字符串之间的值就OK了。GetStrAB这段代码网上找到,我加了点注释。OK,明白就代码马上安排

/**
**功能说明:获取采购公告的标题信息
**发表于:CSDN
**作者:大叔obnijeh
**时间:2020年11月
**/
//设置一个变量,叫公共资源URL,保存URL
公共资源URL = "http://ggzy.gz.gov.cn/jyywzfcgzfcgcggg/index.jhtml"
//获取源文件
网页 = Lib.网络.获得网页源文件_增强版(公共资源URL, "utf-8")
//保存源文件
Call Plugin.File.WriteFileEx("C:\dashu.txt", 网页)
//读取源文件
Text = Plugin.File.ReadFileEx("C:\dashu.txt")
pos = Instr(Text, "发布日期</th>")//获取源文件 发布日期</th> 第一次出现的位置
pos1 = pos + 2000//第一次出现的位置,预估标题至最后的中间所间隔的字符数
text1 = Mid(Text,pos,pos1)//取两个位置之间出现的字符串。
Call GetStrAB(text1, "class=" & Chr(34) & "title" & Chr(34) & ">", "</a")//在一个字符串中,截取两个字符之间的内容,截取标题。
//获取标题
Function GetStrAB(Str, StrA, StrB)
    Dim i,ArrStrA,Ck
    ArrStrA=Split(Str,StrA)//class="title">为分割符得出数组ArrStrA
    For i = 1 To UBound(ArrStrA)
        If InStr(ArrStrA(i), StrB) > 0 Then //,对数组ArrStrA取下标1开始循环,InStr 回某字符串在另一字符串中第一次出现的位置。
         	 biaoti = Split(ArrStrA(i), StrB)(0)         	 
		TracePrint("采集中的标题:"& biaoti)	
        End If
        If i = 10 Then 
        	Exit For
        End If
    Next
   GetStrAB = Ck
End Function

先看效果,再解释下关键地方。运行效果图(速度超快):

解释以下两段是什么意思

pos = Instr(Text, "发布日期</th>")//获取源文件 发布日期</th> 第一次出现的位置
Call GetStrAB(text1, "class=" & Chr(34) & "title" & Chr(34) & ">", "</a")//在一个字符串中,截取两个字符之间的内容,截取标题。

解释一:为什么要从 发布日期 开始截?

因为在这个字符串之前还有一大堆不需要字符,不在分析范围。为了提高程序的运行速度。

解释一: Chr(34)是什么鬼?

因为标题在"class= "title">与 </a>两个字符串之间。Chr(34)是“号的转义字符。

  1. dashu:搞定了,过来看。
  2. 前台MM:这么快?真的假的?
  3. dashu:真的,看到没有,把这复制过去,用UE整理一下。(剧情点评:UE以前教过,不要惊讶)
  4. 前台MM:人才呀,不错!不错!才10条呀?要多几条怎么办?
  5. dashu:一页就10条呀。
  6. 前台MM:要个3页5页怎么办?
  7. dashu:好的,马上安排。(剧情点评:感觉掉坑里了)

解决思路:

a)分析当前页url、下一页url

当前页:http://ggzy.gz.gov.cn/jyywzfcgzfcgcggg/index.jhtml下一页:http://ggzy.gz.gov.cn/jyywzfcgzfcgcggg/index_2.jhtml

简单,这时注意,保存路径就不能写死了,要几页就用for循环加if判断就OK了,代码马上安排:

/**
**功能说明:获取采购公告的标题信息
**发表于:CSDN
**作者:大叔obnijeh
**时间:2020年11月
**/
//设置一个变量,叫公共资源URL,保存URL
公共资源URL = "http://ggzy.gz.gov.cn/jyywzfcgzfcgcggg/index.jhtml"
公共资源URL2 = "http://ggzy.gz.gov.cn/jyywzfcgzfcgcggg/index"
dim CURL 
For k = 1 To 3//要几页就写几页
    mynowtime = MyYear & "-" & MyMonth & "-" & MyDay & "-" & MyHour & ":" & MyMinute
    path = "C:\dashu" & mynowtime & ".txt"
    If k = 1 Then 
        CURL = 公共资源URL
    Else 
        CURL = 公共资源URL2&"_"&k&".jhtml"
    End If
    //获取源文件
    网页 = Lib.网络.获得网页源文件_增强版(CURL, "utf-8")
    //保存源文件
    Call Plugin.File.WriteFileEx(path, 网页)
    //读取源文件
    Text = Plugin.File.ReadFileEx(path)
    pos = Instr(Text, "发布日期</th>")//获取源文件 发布日期</th> 第一次出现的位置
    pos1 = pos + 2000//第一次出现的位置,预估标题至最后的中间所间隔的字符数
    text1 = Mid(Text, pos, pos1)//取两个位置之间出现的字符串。
    TracePrint ("第 "&k&" 页标题获取如下:")
    Call GetStrAB(text1, "class=" & Chr(34) & "title" & Chr(34) & ">", "</a")//在一个字符串中,截取两个字符之间的内容,截取标题。
Next
//获取标题
Function GetStrAB(Str, StrA, StrB)
    Dim i,ArrStrA,Ck
    ArrStrA=Split(Str,StrA)//class="title">为分割符得出数组ArrStrA
    For i = 1 To UBound(ArrStrA)
        If InStr(ArrStrA(i), StrB) > 0 Then //,对数组ArrStrA取下标1开始循环,InStr 回某字符串在另一字符串中第一次出现的位置。
            biaoti = Split(ArrStrA(i), StrB)(0)         	 
            TracePrint("采集中的标题:"& biaoti)	
        End If
        If i = 10 Then 
            Exit For
        End If
    Next
    GetStrAB = Ck
End Function

运行效果马上安排:

 

  1. dashu:又搞定了,过来看。
  2. 前台MM:好强大,牛!要不要帮你订个饭?
  3. dashu:不吃快餐,低血糖。
  4. 前台MM:能不能把,预公告,更正公告,结果公告的数据也取下来。
  5. dashu:这有什么难呀。分分钟的事。(剧情点评:继续掉坑里了)
  6. 前台MM:代码你马上安排吧。
  7. dashu:没前途呀,这么简单还要我安排。你把代码复制一下,把URL改了,截取字符串改了,不就可以了?
  8. 前台MM:好的,能不能给点提示呀。
  9. dashu:好吧,把它写死一点。关键代码等下给你show一下。

思考分析中,URL关键不同就一段字符串,外面再加一个for循环。关键代码安排:

url1 = "http://ggzy.gz.gov.cn/jyywzfcgzf"
 url2 = "/index.jhtml"
 采购公告 = "cgcggg"
 预公告 = "cgggygg"
 更正公告 = "cggggzgg"
 结果公告 = "cgggjggg"
For i = 1 To 4
    If i = 1 Then 
        dtype = 采购公告
        typexls="采购公告"
    ElseIf i = 2 Then
        dtype = 预公告
        typexls="预公告"
    ElseIf i = 3 Then
        dtype = 更正公告
        typexls="更正公告"
    ElseIf i = 4 Then
        dtype = 结果公告
        typexls="结果公告"
    End If
    
    网页 = Lib.网络.获得网页源文件_增强版(url1&dtype&url2, "utf-8")
  1. dashu: 搞好了,发给你了,你自己抽空调试一下。
  2. 前台MM:感谢!感谢!
  3. dashu:不客气,那晚饭去哪里吃?(剧情点评:情商堪忧)
  4. 前台MM:那发布日期能不能帮忙获取一下?
  5. dashu:这个,这个,跟获取标题不是一回事吗?
  6. 前台MM:能帮忙写?
  7. dashu:给提示可以?
  8. 前台MM:成交。
  9. dashu:把<span>,</span>传进那个GetStrAB不就可以了?
  10. 前台MM:对哦。那这个标题的连接也是这样取咯。
  11. dashu:就是。
  12. 前台MM:能不能按关键字来自动搜索呀。
  13. dashu:可以呀,多大的事。?
  14. 前台MM:赶紧的。敲代码。
  15. dashu:好无语。关键代码给你贴,剩下的自己思考。
UserVar txt="人才" "输入搜索的关键字"
bw = "QQBrowser.exe" //这里是浏览器,最好是用无边框的。
Call Plugin.Web.Bind(bw)
Call Plugin.Web.Go("http://ggzy.gz.gov.cn/jyywzfcgzfcgcggg/index.jhtml")
//搜索内容
Call Plugin.Web.HtmlInput(txt,"tag:input&name:q")
//点击搜索
Call Plugin.Web.HtmlClick("tag:Button&class:searchIconBtn")
Delay 5000
path =  "C:\dashu.txt"
//获取当前输入关键字后点击后的url赋值给geturl ,这里省去了这段,免得有些小哥写个死循环恶攻击正常网站。
网页 = Lib.网络.获得网页源文件_增强版(geturl, "utf-8")
  1. dashu:晚饭能吃了么?
  2. 前台MM:去哪里?
  3. dashu:我要求很低的,寿司+青酒
  4. 前台MM:给钱。
  5. dashu:不是你出钱请我么?(剧情点评:笨死,去吃了再谈其它事)
  6. 前台MM:想得美,死开,滚。
  7. dashu:心中默念“佛只度有缘人”,手抽筋成功转移至dashu身上。

后记-->感想源于生活(有时间的可以往下看看):

最终前台MM培养成公司的测试人员。

在IT企业中,有这么一个情况,初创企业或以项目为主的企业,有几个开发人员在做项目,但是呢,做完这个项目就没了,下一个项目还没着落,公司老板着急呀,怎么办呢?对了,去抢个标来做。

于是产生了这么一个工作:需要有个人每天去看一下哪里有合适本公司的招标信息,特别是初创公司,只要有点粘边都抢个标来做做,这种信息我暂且叫它标讯

标讯的搜索工作是日常工作,重复性的工作,也是老板的日常工作。

在有点规模的公司,也就是30人左右,基本是老板及销售在做,有时也会交给前台来兼做(太正常不过了)

这些工作往往需要1个小时甚至几个小时的重复性工作,我个人称它为反人类的工作。与其类似的还是一些比较烂的考勤系统,外勤与内勤无法一起统计,导致HR或行政人员手工统计,即加班加点,还容易出错,一到月末就有恐惧症。导致对应岗位频烦离职。

因此需要设计程序工具让它半自动工作,解放双手。

归类一下问题:
问题一:为什么用按键精灵用做?

  1. 这是对非开发人员来讲,只要安装一个软件即可,不需要配置什么开发环境。还配环境变量,这缺包,那缺包。都不知道要搞到猴年马月。
  2. 对使用人员来讲,一是前台,一是售前,一是老板,一是销售。对开发没兴趣,你告诉他改哪个关键字就可以跑了。

问题二:为什么直接后台打印出来,而不是写到txt或者excel里面?
这样,这个读写excel需要安装Microsoft Office,是Microsoft Office不是wps。写excel关键代码,马上安排。

//初始化一个空的excel表格,exlname比如是"C:\dashu.xls"
Function loadexcel(exlname)
    //打开Excel文档工作表
    Call Plugin.Office.OpenXls(exlname)
    //向Excel文档工作表(1)单元格(1, 1)写入("编号")内容
    Call Plugin.Office.WriteXls(1, 1, 1, "编号")
    //向Excel文档工作表(1)单元格(1, 2)写入("标题")内容
    Call Plugin.Office.WriteXls(1, 1, 2, "标题")
    Call Plugin.Office.WriteXls(1, 1, 3, "类型")
    //向Excel文档工作表(1)单元格(1, 3)写入("获取日期")内容
    Call Plugin.Office.WriteXls(1, 1, 4, "发布日期")
    Call Plugin.Office.CloseXls()
End Function

问题三:有没有考虑把它做成带界面的,URL与关键字可以配置。打包好给公司的相关人员使用?

  1. 这个没必要,除非是买家已付款,才可以做成一个产品并随时都可以给它更新。
  2. 相关人员不一定需要,还以为你闲得没事。
  3. 要做成可用的软件不是一天两天的,需要考虑的太多,比如存在哪里?判断文件、文件夹是否存在,网络是否连上,网站更新,软件本身如何自动更新。
  4. 如果是我,不会浪费不必要的精力来做,能够半自动就行。

博客于已经2020.11.12写完,但是标题还没有想好。后续我在写一个项目管理相关的,讲述作为一个teamleader在缺少资源的情况下如何把前台MM,会计小白,调过来充当测试人员,而前台MM竟然爱上测试,最终成为测试人员。有兴趣的关注一下,只度有缘人。

 

 

 

 

 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值