关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
最近在弄Excel vba 网抓教程,写了不少实例。春节过后,写个网抓天气预报。
这个天气预报有现成的接口,不过要注册帐号什么的,有些麻烦。所以,我打算直接抓取“中国天气网”的数据。
在第一个表格加一个按钮,选择省份和城市,再点击按钮即可。那些城市代码信息也是我自己收集整理的,弄了一个下拉框联动。效果如下图:

代码如下:
'按钮点击事件'
Sub btnQuery_Click()
On Error GoTo Err_Handle:
Dim strCity As String
strCity = WorksheetFunction.VLookup([B2], [城市代码表!A:B], 2, 0)
GetWeather strCity
Exit Sub
Err_Handle:
MsgBox "请选择省份和城市"
End Sub
'网抓数据'
'参数:strCity 字符串,城市代码'
Public Sub GetWeather(strCity As String)
On Error GoTo Err_Handle:
[A5:D11].ClearContents '清空数据'
'创建XmlHttp对象'
Dim xmlHttp As Object
Set xmlHttp = CreateObject("MSXML2.XMLHTTP")
'创建并发送请求'
xmlHttp.Open "GET", "http://www.weather.com.cn/weather/" & strCity & ".shtml", False
xmlHttp.setRequestHeader "If-Modified-Since", "0" '不要缓存'
xmlHttp.Send
'等待响应'
Do While xmlHttp.readyState <> 4
DoEvents
Loop
'得到响应结果'
Dim strResponse As String
strResponse = xmlHttp.responsetext
'创建正则表达式对象'
Dim regExp As Object
Set regExp = CreateObject("VBScript.RegExp")
'设置正则表达式'
regExp.Global = True
'这个表达式比较复杂,估计只有上帝和我知道是怎么回事。'
'过段时间应该就只有上帝才知道。'
'具体分析可以看我的《Excel vba 网抓教程》'
regExp.Pattern = "([\s\S]+?)[\s\S]+?""wea"">([\s\S]+?)[\s\S]+?(\d+?)[\s\S]+?([\s\S]+?)[\s\S]+?([\s\S]+?)"
'匹配结果'
Dim matches As Object, i As Long, arr()
Set matches = regExp.Execute(strResponse)
If matches.Count = 0 Then
MsgBox "找不到天气信息"
Exit Sub
End If
'处理匹配结果'
ReDim arr(matches.Count - 1, 3)
For i = 0 To matches.Count - 1
arr(i, 0) = matches(i).SubMatches(0)
arr(i, 1) = matches(i).SubMatches(1)
arr(i, 2) = matches(i).SubMatches(2) & "/" & matches(i).SubMatches(3)
arr(i, 3) = matches(i).SubMatches(4)
Next
[A5:D11] = arr '写到Excel中'
Exit Sub
Err_Handle:
MsgBox Err.Description
End Sub原理不复杂,就是通过城市代码抓取对应的天气预报数据。通过正则表达式匹配结果并处理。
百度网盘下载:http://pan.baidu.com/s/1eRdmpaU 密码: ehq9
18665917059@163.com
杨老师您好,我购买了您的网抓课程,第一个手机号码的网站已经过期:http://v.showji.com/Locating/showji.com20150416.aspx?output=json 请问,现在改成了什么呢?
2017-09-04 03:24 回复