某年11月的某一天,dashu准备打卡下班,故事开始...
- dashu:还不下班呀?每天都走得比我早的呀,今天脚抽筋了吗?
- 前台MM:不是脚抽,是手抽了。
- dashu:双11拆快递拆抽的吗?
- 前台MM:就买了一包吃的,忙死了,我在复印粘贴呢。你怎么走那么早呀?
- dashu:我今天有点低血糖,想早点走,说着就走过去一看,MM正对着复印粘贴呢。
- 前台MM:MM丢了一块巧克力给dashu,你试吃一下。
- dashu:好的,谢谢!都说吃人的嘴短,下次这种事可以叫我帮忙。
- 前台MM:好呀,天天都要做,你帮我做一半。
- dashu:啥?天天都要做?
- 前台MM:是呀,领导这周安排的新任务,就是把这个,这个,这个网址上面的信息复制下来。
- dashu:哦,简单,用python或java写个程序把它爬下来就可以了。
- 前台MM:我不会野。
- dashu:不会就学呀。
- 前台MM:等学会了,我都不在这里了。
- dashu:哦,也对。我教你,很快就会的那种。
- 前台MM:超过一天才学会的东西,我不学。
- 完了,难道一段纯结的友谊就这样结束了?没有深入的可能?故事要怎么编下去?马上安排。
- dashu:不用一天,下班前就能学会。
- 前台MM:P我,男人靠得住,母猪会上树。
- dashu:那是你没遇到我,让我看看是什么需求。(剧情点评:前一句情商100,后一句情商为0,典型理工男。)
- 前台MM:你先去拖个椅子过来。
- 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)是“号的转义字符。
- dashu:搞定了,过来看。
- 前台MM:这么快?真的假的?
- dashu:真的,看到没有,把这复制过去,用UE整理一下。(剧情点评:UE以前教过,不要惊讶)
- 前台MM:人才呀,不错!不错!才10条呀?要多几条怎么办?
- dashu:一页就10条呀。
- 前台MM:要个3页5页怎么办?
- 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
运行效果马上安排:
- dashu:又搞定了,过来看。
- 前台MM:好强大,牛!要不要帮你订个饭?
- dashu:不吃快餐,低血糖。
- 前台MM:能不能把,预公告,更正公告,结果公告的数据也取下来。
- dashu:这有什么难呀。分分钟的事。(剧情点评:继续掉坑里了)
- 前台MM:代码你马上安排吧。
- dashu:没前途呀,这么简单还要我安排。你把代码复制一下,把URL改了,截取字符串改了,不就可以了?
- 前台MM:好的,能不能给点提示呀。
- 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")
- dashu: 搞好了,发给你了,你自己抽空调试一下。
- 前台MM:感谢!感谢!
- dashu:不客气,那晚饭去哪里吃?(剧情点评:情商堪忧)
- 前台MM:那发布日期能不能帮忙获取一下?
- dashu:这个,这个,跟获取标题不是一回事吗?
- 前台MM:能帮忙写?
- dashu:给提示可以?
- 前台MM:成交。
- dashu:把<span>,</span>传进那个GetStrAB不就可以了?
- 前台MM:对哦。那这个标题的连接也是这样取咯。
- dashu:就是。
- 前台MM:能不能按关键字来自动搜索呀。
- dashu:可以呀,多大的事。?
- 前台MM:赶紧的。敲代码。
- 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")
- dashu:晚饭能吃了么?
- 前台MM:去哪里?
- dashu:我要求很低的,寿司+青酒
- 前台MM:给钱。
- dashu:不是你出钱请我么?(剧情点评:笨死,去吃了再谈其它事)
- 前台MM:想得美,死开,滚。
- dashu:心中默念“佛只度有缘人”,手抽筋成功转移至dashu身上。
后记-->感想源于生活(有时间的可以往下看看):
最终前台MM培养成公司的测试人员。
在IT企业中,有这么一个情况,初创企业或以项目为主的企业,有几个开发人员在做项目,但是呢,做完这个项目就没了,下一个项目还没着落,公司老板着急呀,怎么办呢?对了,去抢个标来做。
于是产生了这么一个工作:需要有个人每天去看一下哪里有合适本公司的招标信息,特别是初创公司,只要有点粘边都抢个标来做做,这种信息我暂且叫它标讯。
标讯的搜索工作是日常工作,重复性的工作,也是老板的日常工作。
在有点规模的公司,也就是30人左右,基本是老板及销售在做,有时也会交给前台来兼做(太正常不过了)
这些工作往往需要1个小时甚至几个小时的重复性工作,我个人称它为反人类的工作。与其类似的还是一些比较烂的考勤系统,外勤与内勤无法一起统计,导致HR或行政人员手工统计,即加班加点,还容易出错,一到月末就有恐惧症。导致对应岗位频烦离职。
因此需要设计程序工具让它半自动工作,解放双手。
归类一下问题:
问题一:为什么用按键精灵用做?
- 这是对非开发人员来讲,只要安装一个软件即可,不需要配置什么开发环境。还配环境变量,这缺包,那缺包。都不知道要搞到猴年马月。
- 对使用人员来讲,一是前台,一是售前,一是老板,一是销售。对开发没兴趣,你告诉他改哪个关键字就可以跑了。
问题二:为什么直接后台打印出来,而不是写到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与关键字可以配置。打包好给公司的相关人员使用?
- 这个没必要,除非是买家已付款,才可以做成一个产品并随时都可以给它更新。
- 相关人员不一定需要,还以为你闲得没事。
- 要做成可用的软件不是一天两天的,需要考虑的太多,比如存在哪里?判断文件、文件夹是否存在,网络是否连上,网站更新,软件本身如何自动更新。
- 如果是我,不会浪费不必要的精力来做,能够半自动就行。
博客于已经2020.11.12写完,但是标题还没有想好。后续我在写一个项目管理相关的,讲述作为一个teamleader在缺少资源的情况下如何把前台MM,会计小白,调过来充当测试人员,而前台MM竟然爱上测试,最终成为测试人员。有兴趣的关注一下,只度有缘人。