



SEO项目执行中,通常需要查看数据报告来反映项目表现情况,例如网站收录、域名PR、预估流量、Alexa排名等。本文将介绍采用VBA的方式,从网页端抓取网站基础数据。通过建立自动化数据报表系统,提升SEO数据汇总工作的效率。
使用Excel VBA的方式获取搜索引擎官方、第三方网站的数据需要解决以下基础技术问题(更多复杂情况以后再讨论,例如需要登录才能查询的情况等):
1. 如何在网页代码中找到目标数据(通过查看源代码,精确定位目标数据的位置)
2. 使用VBA代码得到数据(使用Microsoft.XMLHTTP等对象)
3. 字符串处理,得到目标数据(使用replace、splite等函数处理)
本次将演示如何使用VBA编写自定义函数,从百度获取收录量的数据。其他的基础数据抓取原理基本相同,暂不赘述。在此以新东方(www.xdf.cn)为例,按照刚才提到的技术环节逐一讲解。
1. 找到目标数据
在百度中使用site:xdf.cn命令可以返回查询结果,如上图所示,可以看到收录量为4,890,000。在火狐中使用Firebug插件,查看源代码,该结果出现在如下图所示蓝色区块的位置,我们要收集的数据就存在于网页HTML代码中。
2. 使用Microsoft.XMLHTTP对象获取网页数据,并用split函数进行文本处理
上图是函数代码(源代码请见下文),通过该方法可以快速的查询目标网页的收录数据。首先,定义URL参数作为函数的输入值,字符类型是String(字符串)类型;再定义htmlBody变量,用来储存网站HTML代码。
接下来比较重要的一步,定义和声明htmlObject对象,并使用With方法配置查询地址、原始数据初步清理等工作。其中Replace函数的作用是,把网页源码中回车符和换行符(vbCrLf)删除,便于下一步Split函数处理。
在得到简单处理的网页数据后,得到一份网页HTML代码,这段代码储存在htmlBody变量中,我们要取的收录数据就保存在其中。在第一步时,我们已经查看过网站源代码,网站的收录数量就包含在语句中:“找到相关结果数4,890,000个。“,使用split函数进行两次文本截取就可以将最终的收录数量提取出来。Split函数用法请大家自行百度。
由此,我们编写完成了一个简单的收录查询函数。在Excel中使用时只需要在任意单元格中输入“=baiduIndex(“xdf.cn”)”,回车后在表格中就会自动返回该收录数据。
到此,一个简单的查询函数编写过程基本结束。该方法虽然省去了频繁手动查询数据的麻烦,但是用函数获取数据的方法还存在诸多不便:
1. 函数维护成本较大。百度或者第三方网站的前端代码更新后,查询语句需要相应变化,在使用中还是会偶尔遇到需要更新split函数的情况。
2. 无法批量自动化。在做SEO项目中,我们需要查询多种数据,包括收录、PR、排名、BR等数据做成一份周报或者月报。通常收录又包含很多不同栏目、竞争对手网址等。用函数的方法在批量查询时效率还是不高。
当然,还是有解决办法的,可以结合Excel窗体控件,与VBA代码结合,通过一键操作,完成项目周报数据的查询。实现这样的功能需要更加复杂的VBA代码。在今后的文章中,我们再继续讨论。因时间有限,里面一些技术细节没有做过多解释,希望大家回帖讨论,如果有对SEO数据分析感兴趣的朋友,欢迎讨论。
=======源代码======
Function BaiduIndex(url As String) '定义函数名称
Dim htmlBody '定义string变量,用来存储网页源代码
Dim htmlObject As Object '定义对象变量
Set htmlObject = CreateObject("microsoft.xmlhttp")
With htmlObject
.Open "GET", "http://www.baidu.com/s?wd=site:" & url, False '百度收录量查询地址
.send
htmlBody = Replace(.responsetext, vbCrLf, "")
End With
BaiduIndex = Split(Split(htmlBody, "找到相关结果数")(1), "个")(0) '原始代码中提取目标数据
End Function