设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 3614|回复: 6
打印 上一主题 下一主题

[其它] 网络数据采集问题

[复制链接]
跳转到指定楼层
1#
发表于 2016-6-19 13:46:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个是比较有代表性的网页,请看:http://www.chinatax.gov.cn/n810214/n810621/n810668/index.html,是税务总局的,请放心查看

需要采集标题和连接.
不使用浏览器组件,直接从源码中提取.因为组件比较依赖平台,所以尽量不用.

目前想到的问题:
1.如何得到总页数
2.如何翻页
3.如何提取标题和连接

请大神指教,谢谢

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2016-6-19 13:54:40 | 只看该作者
本帖最后由 风中漫步 于 2016-6-19 13:57 编辑

最好用正则提取,不使用DCOM(好象是叫这个名字,就是分析HTML的那个)
3#
发表于 2016-6-20 10:23:57 | 只看该作者
关于网页抓取,我研究不多,不过还是说两句吧。网页抓取主要依靠2种方式:
1、使用webbrowser或者IE组件装载页面后,通过CSS选择器(Selector)来读取数据。
2、发送HTTPRequest请求(深层次则属于Ajax技术),对返回源码进一步处理。
所谓的“正则提取”,只是对源码字符串进行处理的一个手段罢了,谈不上核心技术。事实上,如果不喜欢正则,或者觉得正则表达式测试麻烦的话,也可以用substring(js),instr(vb)之类的函数来处理。
--------------------------------------
说完这些,现在可以来回答这几个问题了:
1和2:通过对源码的分析,应该是先读取内容页列表,然后使用HTTPRequest来发送请求来获取源码,再通过自定义函数createrul来创建链接以及按模板写成页面。因此读取页码或者翻页,只需要先读取内容页列表即可完成。不过里面的脚本文件一对代码,而且是压缩过的。我实在没兴趣,你可以自行下载附件研究。
3:标题和超链接的问题,其实你已经提出解决方案了:那就是正则表达式。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
4#
发表于 2016-6-20 10:55:58 | 只看该作者
1、总页数取id为pag_831221的innerHTML;
2、翻页就是导航到某个地址,该地址为:
url="../../../n810214/n810621/n810668/index_831221_{x}.html"
用1、2、3...分别替换{x}即可翻页;
3、遍历id为comp_831221中的dd标签即可得到标题和链接。

点评

多谢斑竹指点,已找到这几个地方了  发表于 2016-6-20 13:27
5#
 楼主| 发表于 2016-6-20 13:25:58 | 只看该作者
roych 发表于 2016-6-20 10:23
关于网页抓取,我研究不多,不过还是说两句吧。网页抓取主要依靠2种方式:
1、使用webbrowser或者IE组件装 ...

多谢斑竹解答及提供的资料
6#
发表于 2016-6-21 17:49:32 | 只看该作者
本帖最后由 todaynew 于 2016-6-21 17:51 编辑
风中漫步 发表于 2016-6-20 13:25
多谢斑竹解答及提供的资料

Private Function GetText() As Variant
    '功能:从税务总局网页提取地址和项目名称
    Dim xmlhttp As Object
    Dim url As String
    Dim txt As String
    Dim Arr, i
    Dim A()
    url = "http://www.chinatax.gov.cn/n810214/n810621/n810668/index.html"

    Set xmlhttp = CreateObject("Microsoft.XMLHTTP")
    With xmlhttp
        .Open "GET", url, False
        .send
        txt = .responsetext
    End With
    txt = Mid(txt, InStr(txt, "<dd>"))
    txt = Left(txt, InStrRev(txt, "</dd>") + 4)
    txt = Replace(txt, "<dd class=" & Chr(34) & "sv_linel" & Chr(34) & "></dd>", "")
    Arr = MatchArr(txt, "<.*>")

    If Arr(0) = "True" Then
        For i = 1 To UBound(Arr)
            ReDim Preserve A(1, i - 1)
            A(0, i - 1) = Mid(Arr(i), InStr(Arr(i), Chr(34)) + 1)
            A(0, i - 1) = Left(A(0, i - 1), InStr(A(0, i - 1), Chr(34)) - 1)
            A(0, i - 1) = Replace(A(0, i - 1), "../../..", "http://www.chinatax.gov.cn")

            A(1, i - 1) = Mid(Arr(i), InStr(Arr(i), "</span>") + 7)
            A(1, i - 1) = Left(A(1, i - 1), InStr(A(1, i - 1), "</a") - 1)
        Next
    End If
    GetText = A
End Function


Public Function MatchArr(ByVal s As String, ByVal match_str As String) As Variant
    '引用:Microsoft VBScript Regular Expressions 5.5
    '功能:返回与正则表达式中捕获的子字符串
    '参数:s--字符串,match_str--正则表达式
    '示例:A=MatchArr(str,"sum\(v\(\d+,\d+,\d+\):v\(\d+,\d+,\d+\)\)")
    Dim re As New regexp
    Dim m As Match
    Dim objs As MatchCollection
    Dim A()
    Dim i As Long, j As Long
    re.Pattern = match_str
    re.IgnoreCase = True
    re.Global = True
    ReDim A(0)
    A(0) = CStr(re.Test(s))
    If re.Test(s) = True Then
        Set objs = re.Execute(s)
        ReDim Preserve A(objs.Count)
        i = 0
        For Each m In objs
            i = i + 1
            A(i) = m.Value
        Next
    End If
    MatchArr = A
    Set re = Nothing
    Set m = Nothing
    Set objs = Nothing
End Function

评分

参与人数 1经验 +5 收起 理由
风中漫步 + 5 感谢斑竹的持续关注,代码很有启发.谢谢

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-21 12:53 , Processed in 0.107828 second(s), 35 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表