ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: 13907933959

[求助] 请前辈们编写一个网抓的宏

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-7-25 07:46 | 显示全部楼层
duquancai 发表于 2016-7-25 00:59
建议你一本书抓一次,一本书保存为一个word文件。
比如:第一本书,参数这样:for i=1 to 1    for j=3  ...

前辈好!
回复正在审核中…。

TA的精华主题

TA的得分主题

发表于 2016-7-25 09:06 | 显示全部楼层
duquancai 发表于 2016-7-24 18:43
Sub shishi()
    Dim strText$, n%
    URL = "http://www.tcm100.com/"

正则很强大!

TA的精华主题

TA的得分主题

发表于 2016-7-25 13:23 | 显示全部楼层
13907933959 发表于 2016-7-25 07:29
前辈好!感谢前辈!可不可一次抓取5本或10本?如可该如何设置?还有就是如前面的5本如以抓取了,又如何让它 ...

下面代码是网抓整个网站的内容,请一定要注意看代码中的注释,还是那个话:建议一本抓一个word文档,你实在要5本一抓也行。
比如:For i = 1 To UBound(arr)    改为:For i = 1 To 1  抓第一本  For i = 2 To 2  抓第三本 For i = 3 To 3  抓第三本;For i = 1 To 5 抓第一本到第五本 For i = 1 To 10  抓第一本到第10本。
  1. Sub shishi()
  2.     Dim strText$, i&, j&, arr, arr1
  3.     URL = "http://www.tcm100.com/"
  4.     Application.ScreenUpdating = True
  5.     With CreateObject("msxml2.xmlhttp")
  6.         .Open "GET", URL & "zhongyiguji.aspx", False
  7.         .send
  8.         strText = .responseText
  9.         arr = Split(strText, "<a target='_blank' href='") '表示有多少本书(本网站共有“762本书”)
  10.         For i = 1 To UBound(arr) '建议每一次就设置“1”就是抓一本书,设置“2”就是抓第二本书,一定要改,否则把整个网站都抓下来了!呵呵呵!!!
  11.             .Open "GET", URL & Split(Split(strText, "<a target='_blank' href='")(i), "'>")(0), False
  12.             .send
  13.             strText = .responseText
  14.             arr1 = Split(strText, "<a target='_blank' href='")
  15.             For j = 1 To UBound(arr1)  '这个循环表示每一本书中的数目数量
  16.                 .Open "GET", Split(Split(strText, "<a target='_blank' href='")(j), "'>")(0), False
  17.                 .send
  18.                 strText = strText & .responseText '表示包含所有书的所有页面内容的超文本
  19.             Next
  20.         Next
  21. '        Debug.Print strText
  22.     End With
  23.     With CreateObject("VBScript.Regexp")
  24.         .Global = True
  25.         .Pattern = "<td[\s\S]*?<div\s*class='title'[\s\S]*?>([\s\S]+?)<[\s\S]*?<div\s* class='content'>([\s\S]+?)</div>[\s\S]*?</td>"
  26.         For Each RegMatch In .Execute(strText)
  27.             t1 = RegMatch.SubMatches(0)
  28.             t2 = RegMatch.SubMatches(1)
  29.             t = t & t1 & Chr(13) & t2 & Chr(13)
  30.         Next
  31.         .Pattern = "(?:<a\s*href=[\s\S]+?>)|</a>": t = .Replace(t, "")
  32.         .Pattern = "(?!<br>)(?:&nbsp;)+": t = .Replace(t, "  ")
  33.         .Pattern = "<br>\s+": t = .Replace(t, Chr(13))
  34.     End With
  35.     Application.ScreenUpdating = True
  36.     Documents.Add.Content.Text = t
  37. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2016-7-25 13:45 | 显示全部楼层
13907933959 发表于 2016-7-25 07:29
前辈好!感谢前辈!可不可一次抓取5本或10本?如可该如何设置?还有就是如前面的5本如以抓取了,又如何让它 ...

只有分步抓,我测试了,就是只抓第二本书,就会抓不下来。你还想咋地!
我重新编写了抓取整网抓的通用代码(在审核中,肯定是运行会出错),所以手动逐步抓吧?
改两个地方:第(1):  For i = 1 To UBound(arr),这个表示整个网抓的所有书共762本书(看arr数组的个数就知道了) 改为: For i = 1 To 1   抓第一本    For i = 2 To 2  抓第二本。第(2)需要改的: For j = 1 To UBound(arr1),这个表示某一本书下面的所有目录或者所有章节,自己看数组arr1是个数就知道有多少了。
整个代码只抓2层,如果有第三层,不抓了!太累!呵呵呵!

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-7-25 15:53 | 显示全部楼层
本帖最后由 13907933959 于 2016-8-3 07:03 编辑
duquancai 发表于 2016-7-25 13:45
只有分步抓,我测试了,就是只抓第二本书,就会抓不下来。你还想咋地!
我重新编写了抓取整网抓的通用代 ...

前辈好!
为了我这样一个生手,太难为了您,真是让人感动!在下拜谢了!感谢前辈!!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-13 19:35 , Processed in 0.019895 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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