怎么下载小说在手机上,用VBA下载一部完整小说

VBA可以做的事情很多,除了快速处理数据和分析数据外,还可以帮助我们下载小说,通常也就是我们所说的“爬虫”!当然,用python进行爬虫是最方便的,但是有些部分小伙是不懂编程的,只会用excel这些办公软件那么VBA可以帮助到大家。当然python爬取大型数据是非常方便的,小小一部小说还不如VBA用得顺手。

用VBA下载一部完整小说

我们一起感受一下效果吧,《水浒传》就这么轻松下载了。

用VBA下载一部完整小说

完整的代码如下:

Sub downLoadText()Application.DisplayAlerts = False '关闭提示Dim regText As Object ‘定义一个对象存放正则表达式得到的结果Dim strText As String ’定义一个字符对象存放存放网页内容For i = 7070949 To 7071068 ’利用FOR循环得到小说各章的内容 URL = "https://www.513gp.org/book2/26330/" & i & ".html" With CreateObject("MSXML2.XMLHTTP") ‘引用网页请求的类 .Open "GET", URL, False .send 'strText = .responseText strText = StrConv(.ResponseBody, vbUnicode) '不用.responseText,因为XMLHTTP默认是UTF-8,不能识别gb2312,会发现数据乱码。所以要获取网页二进代码,再进行字符编码。 End With With CreateObject("VBScript.Regexp") ’引用正则表达式的类来获取想要的小说文字 .Global = True '查找范围,True表示全部查找,False表示只查找第一个,默认值是False。 .Pattern = "<h1>(.*?)</h1>" ’标题的表达式 Set regText = .Execute(strText) ‘'Execute方法查找表达式的内容并返回一个数组,存放在regText对象。 titleText = regText(0).submatches(0) ’第一个零表示数组第1个值,第二个零表示 获取表达式"<h1>(.*?)</h1>"括号里面的内容,也称第一个item值。 Range("a1048576").End(xlUp).Offset(1, 0) = titleText ‘在空的表格存放内容 .Pattern = " (.*?)<br" ’段落文字的表达式 Set regText = .Execute(strText) For Each paragrahText In regText '利用FOR循环获取数组的每个值 Range("a1048576").End(xlUp).Offset(1, 0) = paragrahText.submatches(0) ‘在空的表格存放内容 Next End WithNextApplication.DisplayAlerts = TrueEnd Sub

主要用到的三个知识点:

第一,分析网址及网页(这里演示的案例网址是https://www.513gp.org/book2/26330/)。

网址:我们可以看到《水浒传》这部小说不连序言共有120章,每一章都一个链接,分别点开网页发现其URL变化的是后面一串数字,第1章是“7070949”,第2章是“7070950”……最后一章是“7071068”,每一章都是加1。用FOR循环就可以轻松得到所有网址。

网页:这个网站的网页较为简单是静态加载方式,在第一章网页点击右键,选择“查看网页源代码”可以看到小说完整的文字。但有些网站的网页是动态加载的方式,看不到完整的内容。看到网页源代码就可以利用正则表达式获取我们想要的内容了。

用VBA下载一部完整小说

第二,引用获取网页信息的类,CreateObject("VBScript.Regexp") ,常规简单用法,如下:

URL = "目标网址"With CreateObject("MSXML2.XMLHTTP") ‘引用网页请求的类 .Open "GET", URL, False .send strText = .responseText '返回网页内容 ’strText = .ResponseBody '返回网页内容End With

有一个需要注意的地方,VBA是识别是utf-8编码数据,这个目标网站的编码是GBK,因此如果用responseText返回网页数据,读取会出现乱码,需要采用二进制数据进行返回,即ResponseBody,再用StrConv函数编码。

第三,引用正则表达式的类,With CreateObject("VBScript.Regexp") ,常规简单用法,如下:

With CreateObject("VBScript.Regexp") ’引用正则表达式的类 .Global = True '查找范围,True表示全部查找,False表示只查找第一个,默认值是False。 .Pattern = "表达内容(item)" ’表达式 Set regTexts = .Execute(strText) ‘'Execute方法查找表达式的内容并返回一个数组,存放在regText对象。 regText = regText(0).submatches(0) ’第一个零表示数组第1个值,第二个零表示 获取表达式括号里面的内容,也称第一个item值。 end with

需要说明的地方,.Execute()返回的是一个数组对象。 小说每章标题表达式.Pattern = "<h1>(.*?)</h1>" ,括号里面表示一个item,如果多个括号,如:"<h1>(.*?)回(.*?)</h1>",则有多个item,用submatches()获取其值。.*?,实心点、星号和问号三个符号组合的表达式是正则表达式较为常用的格式,基本万能。

欢迎大家评论及提意见,提更多VBA相关问题及具体项目要求。

(0)
打赏 微信扫一扫 微信扫一扫

相关推荐

本文内容由互联网用户自发贡献,该文观点仅代表作者本人,不代表万网时代立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 qulianxi@foxmail.com 举报,一经查实,本站将立刻删除。