Excel vba 网抓天气预报

  • 发布时间:2016年2月15日 13:50
  • 作者:杨仕航

最近在弄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

上一篇:Django在WebFaction服务器的邮箱设置

下一篇:Python字符串处理方法总结

评论列表

18665917059@163.com

18665917059@163.com

杨老师您好,我购买了您的网抓课程,第一个手机号码的网站已经过期:⁣http://v.showji.com/Locating/showji.com20150416.aspx?output=json 请问,现在改成了什么呢?

2017-09-04 03:24 回复

新的评论

清空