怎么用VBA或网络爬虫程序抓取网站数据

怎么用VBA或网络爬虫程序抓取网站数据,第1张

VBA网抓常用方法

1、xmlhttp/winhttp法:

用xmlhttp/winhttp模拟向服务器发送请求,接收服务器返回的数据。

优点:效率高,基本无兼容性问题。

缺点:需要借助如fiddler的工具来模拟http请求。

2、IE/webbrowser法:

创建IE控件或webbrowser控件,结合htmlfile对象的方法和属性,模拟浏览器 *** 作,获取浏览器页面的数据。

优派基贺点:这个方法可以模拟大部分的浏览器 *** 作。所见即所得,浏览器能看到的数据就能用代码获取。

缺点:各种d窗相当烦人,兼容性也确实是个很伤脑筋的问题。上传文件在IE里根本无法实现。

3、QueryTables法:

因为它锋烂是excel自带,所以勉强也算是一种方法。尘派其实此法和xmlhttp类似,也是GET或POST方式发送请求,然后得到服务器的response返回到单元格内。

优点:excel自带,可以通过录制宏得到代码,处理table很方便

。代码简短,适合快速获取一些存在于源代码的table里的数据。

缺点:无法模拟referer等发包头

也可以利用采集工具进行采集网页端的数据,无需写代码。

Option Explicit'此如猜强制定义变量(如果有本句存橡燃于开始,则所有变量需定义)

Type DataInfo'类型DataInfo

'

End Type'End类型

'

Public myDataInfo As DataInfo'公有的myDataInfo类型为DataInfo

'

Public JS_Name As String'公有的JS_名称类型为字符串

Public objJS As Object'公有的objJS类型为对象

Public arr As Variant'公有的arr类型为Variant

Sub Main()'子程序Main()

'

Dim strRgStartName As String '起始单元格名称'定义变量strRgStartName类型为字符串'起始单元格名称

Dim strRgEndName As String '结束单元格名称'定义变量strRgEndName类型为字符串'结束单元格名称

Dim strTemp As String'定义变量strTemp类型为字符串

Dim strT() As String'定义变量strT()类型为字符串

Dim lngR As Long, lngC As Long '定义变量lngR类型为长整型值,lngC类型为长整型值

Application.Cursor = xlWait' 应用程序的光标=xlWait

Application.ScreenUpdating = False' 应用程序的屏幕刷新=False

GetBasicInfo '初始化数据'GetBasicInfo'初始化数据

'如果无数据则退出

If myDataInfo.RecordCount = 0 Then'如果 myDataInfo的RecordCount=0 则执行

Application.Cursor = xlDefault' 应用程序的光标=xlDefault

Application.ScreenUpdating = True' 应用程序的屏幕刷新=True

MsgBox "无数据!", vbCritical'<消息框>:"无数据!",vbCritical

Exit Sub'退出子程序

End If'If判断过程结束

strRgStartName = "A1" '从A1单元格开始'strRgStartName="A1"'从A1单元格开始

strRgEndName = Cells(myDataInfo.RecordCount, myDataInfo.lngCols).Address(0, 0)'strRgEndName=<单元格>坐标( myDataInfo的RecordCount, myDataInfo的lngCols )的Address(0,0)

Sheet1.UsedRange.ClearContents' Sheet1的已使用区域的清除内容

arr = Sheet1.Range(strRgStartName &":" &strRgEndName)'arr= Sheet1的<单元格>区域(strRgStartName &":" &strRgEndName)

'逐条读取

For lngR = 1 To myDataInfo.RecordCount'森型设定变量范围为lngR=1到 myDataInfo的RecordCount

strTemp = objJS.eval(JS_Name &".data[" &lngR - 1 &"]")'strTemp= objJS的eval(JS_名称 &".data[" &lngR-1 &"]")

strT = Split(strTemp, ",")'strT=<分割字符串>(strTemp,",")

For lngC = 0 To UBound(strT)'设定变量范围为lngC=0到<数组上限>(strT)

arr(lngR, lngC + 1) = strT(lngC)'arr(lngR,lngC+1)=strT(lngC)

Next'下一个

Next'下一个

'填充

Sheet1.Range(strRgStartName &":" &strRgEndName) = arr' Sheet1的<单元格>区域(strRgStartName &":" &strRgEndName)=arr

Application.Cursor = xlDefault' 应用程序的光标=xlDefault

Application.ScreenUpdating = True' 应用程序的屏幕刷新=True

End Sub'子程序结束

代码:

Private Sub CommandButton1_Click()

Dim IE As Object

Dim i As Integer

i = 1

'打开网页:创建一个IE对象,然后给一些弯世属性赋值。Visible是可见性,navigate是网页地址

Set IE = CreateObject('internetexplorer.application')

With IE

.Visible = True

.navigate 'http://hanyu.iciba.com/pinyin.html'

'等待网页完全加载

Do Until .ReadyState = 4

DoEvents

Loop

'拷贝汉字到网页文本框,然后点击转换按钮,并取出转换结果

Do While Sheets('sheet1').Cells(i 1, 1).Value <>''

'从IE.Document.all句柄中把页面上要使用的节点找出来。这里的方法是:

.document.all('source').Value 给以source为ID的文本框赋值

.document.all.tags('img')(1).Click 点击图片集合里的第二张图片

.document.all('to').Value 取出以to为ID的文本框内容

.document.all('source').Value = Sheets('sheet1').Cells(i 1, 1).Value

.document.all.tags('img')(1).Click

Do Until .ReadyState = 4

DoEvents

Loop

Sheets('sheet1').Cells(i 1, 2).Value = .document.all('to').Value

i = i 1

Loop

'关闭网页

.quit

End With

End Sub

代码解释:(见注释)

贴士:

1)VBA只能 *** 作IE浏览器,原亮闹棚因就一句话:都是微软家的产品嘛

2)要先引敬则用Micorsoft Internet Controls


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12545564.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存