ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 网页采集(网页抓取)教程第三课-获取网络图片四种方法,如何判断WebBrowser控件导航结束

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-7-22 18:02 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:网页交互
本帖最后由 liucqa 于 2013-4-11 18:23 编辑

第一课:http://club.excelhome.net/thread-893760-1-1.html
第二课:http://club.excelhome.net/thread-894527-1-1.html
第三课:http://club.excelhome.net/thread-896608-1-1.html
第四课:http://club.excelhome.net/thread-897117-1-1.html
第五课:http://club.excelhome.net/thread-899268-1-1.html

高级篇:
第一课:http://club.excelhome.net/thread-902266-1-1.html
第二课:http://club.excelhome.net/thread-939881-1-1.html

***********************我是上课的分割线******************************

前两堂课,我讲解了获取网页源文件的方法,在实际应用中,除了获取网页源数据,我们也经常需要获取网页中的图片。
特别是在登录网站处理验证码的时候,我们还需要将图片读到image控件里面,以便人工输入。

获取网页图片的方法有许多,下面讲解几个常用的方法

一、使用API函数 OleLoadPicturePath 直接得到下载文件的对象,再使用这个对象就可以进行保存文件和加载到Image控件的操作了。

2.gif

  1. Private Sub cbnLoad_Click()
  2.     Dim nPicture As Picture

  3.     Set nPicture = LoadNetPicture(tbxURL.Value)                                              '将图片下载到对象
  4.     If Not nPicture Is Nothing Then
  5.         SavePicture nPicture, ThisWorkbook.Path & Application.PathSeparator & "\MyImg.bmp"   '保存到硬盘
  6.         Image1.Picture = nPicture
  7.     Else
  8.         tbxURL.Value = "链接地址错误,不能获取图片"
  9.     End If
  10. End Sub

  11. Public Function LoadNetPicture(ByVal strImgSrcName As String) As Picture
  12.     Dim riid As GUID
  13.     riid.Data1 = &H7BF80980: riid.Data2 = &HBF32: riid.Data3 = &H101A
  14.     riid.Data4(0) = &H8B: riid.Data4(1) = &HBB: riid.Data4(2) = &H0
  15.     riid.Data4(3) = &HAA: riid.Data4(4) = &H0: riid.Data4(5) = &H30
  16.     riid.Data4(6) = &HC: riid.Data4(7) = &HAB
  17.     OleLoadPicturePath StrPtr(strImgSrcName), 0&, 0&, 0&, riid, LoadNetPicture
  18. End Function

  19. Private Sub UserForm_Initialize()
  20.     Dim URL$
  21.     URL = "http://www.baidu.com/img/baidu_logo.gif"             '链接地址
  22.     tbxURL.Value = URL
  23. End Sub
复制代码



这个方法很简便,代码也容易理解和修改,推荐使用。

评分

9

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-22 18:03 | 显示全部楼层
本帖最后由 liucqa 于 2013-4-11 18:24 编辑

二、使用API中的 URLDownloadToFile函数下载文件,代码如下,

  1. Option Explicit
  2. Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
  3. Public Declare Function DeleteUrlCacheEntry Lib "wininet" Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Long

  4. Sub test()
  5.     Dim nUrl As String, localFilename As String, lngRetVal As Long

  6.     nUrl = "http://www.baidu.com/img/baidu_logo.gif"                                                    '要下载的文件链接
  7.     localFilename = ThisWorkbook.Path & Application.PathSeparator & "myimg.gif"           '保存到本地的完整路径

  8.     DeleteUrlCacheEntry nUrl    '清除缓存   
  9.     lngRetVal = URLDownloadToFile(0, nUrl, localFilename, 0, 0)
  10.     If lngRetVal = 0 Then        
  11.         MsgBox "成功"
  12.     Else
  13.         MsgBox "失败"
  14.     End If
  15. End Sub
复制代码



注意URLDownloadToFile函数会读取缓存,所以需要清空缓存或者在URL后面加上随机数。
本例使用API中的DeleteUrlCacheEntry函数清空缓存

下面是一个URLDownloadToFile函数的包装函数
http://www.cpearson.com/Excel/DownloadFile.aspx

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-22 18:03 | 显示全部楼层
本帖最后由 liucqa 于 2013-4-11 18:24 编辑

三、使用 Microsoft.XMLHTTP 对象,下载网页文件(也可以是图片等其他文件)到硬盘

  1. Sub HttpDownNetFile()
  2.     Dim nUrl As String, localFilename As String
  3.     Dim XmlHttp As Object, ayrHttpBody() As Byte

  4.     nUrl = "http://www.baidu.com/img/baidu_logo.gif"
  5.     localFilename = ThisWorkbook.Path & Application.PathSeparator & "myimg.gif"


  6.     Set XmlHttp = CreateObject("Microsoft.XMLHTTP")
  7.     XmlHttp.Open "GET", nUrl, True       '异步下载
  8.     XmlHttp.Send

  9.     Do Until XmlHttp.ReadyState = 4
  10.         DoEvents
  11.     Loop
  12.    
  13.     If XmlHttp.Status = 200 Then
  14.         ayrHttpBody() = XmlHttp.ResponseBody
  15.         Open localFilename For Binary As #1
  16.         Put #1, , ayrHttpBody()
  17.         Close #1
  18.         MsgBox "成功"
  19.     Else
  20.         MsgBox "失败"
  21.     End If
  22.     Set XmlHttp = Nothing
  23. End Sub
复制代码



本例采用伪异步下载的方法,异步下载可以避免下载时间过长导致Excel挂起。





评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-22 18:04 | 显示全部楼层
本帖最后由 liucqa 于 2013-4-11 18:25 编辑

四、可以使用WebBrowser控件来导航页面,并遍历图片。这个方法需要熟练掌握控件的使用,适合中高级水平的人使用。

1.gif

知识点1:使用WebBrowser_DocumentComplete事件来确认网页导航完毕
知识点2:使用API 剪贴板函数来得到图片
知识点3:使用stdole.SavePicture方法保存图片到本地

代码如下:
  1. Private bLoadComplete As Boolean

  2. Private Sub CommandButton1_Click()
  3.     Dim Pic As PicBmp, IPic As Picture, IID_IDispatch As Guid
  4.     Dim nUrl As String, localFilename As String, lngRetVal As Long, objElement, n&, nRange

  5.     nUrl = "http://www.baidu.com/"         '网址
  6.     localFilename = "Myimg.gif"               '保存到本地的文件名

  7.     Label1.Caption = "开始导航页面..."
  8.     frmWB.WebBrowser1.Silent = True    '关闭交互   禁止脚本错误
  9.     frmWB.WebBrowser1.Navigate nUrl    '开始导航

  10.     bLoadComplete = False
  11.     Do While Not bLoadComplete             '等待DocumentComplete事件确认加载结束
  12.         DoEvents
  13.     Loop

  14.     n = 1
  15.     For Each objElement In WebBrowser1.Document.images
  16.         Set nRange = WebBrowser1.Document.body.createControlRange()
  17.         nRange.Add objElement
  18.         nRange.execCommand "Copy"                               '复制到剪贴板
  19.         OpenClipboard 0                                                  'OpenClipboard

  20.         With IID_IDispatch                                               'GUID理论上可以随便写,只要和操作系统已有的不重复就行
  21.             .Data1 = &H20400
  22.             .Data4(0) = &HC0
  23.             .Data4(7) = &H46
  24.         End With

  25.         With Pic
  26.             .Size = Len(Pic)
  27.             .Type = 1
  28.             .hBmp = GetClipboardData(CF_BITMAP)
  29.         End With

  30.         OleCreatePictureIndirect Pic, IID_IDispatch, 1, IPic
  31.         stdole.SavePicture IPic, ThisWorkbook.Path & Application.PathSeparator & n & localFilename                      '图片保存到本地
  32.         CloseClipboard

  33.         Set Image1.Picture = IPic                                '图片显示到Image控件
  34.         Label1.Caption = "第" & n & "张图片"
  35.         frmWB.Repaint                                               '刷新窗体,以便显示图片
  36.         Sleep 1000
  37.         n = n + 1
  38.     Next
  39.     Set Image1.Picture = Nothing
  40.     Label1.Caption = "图片显示完毕"
  41. End Sub

  42. Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
  43.     If pDisp Is WebBrowser1 Then bLoadComplete = True                                                                                  '确认页面加载完毕
  44. End Sub
复制代码


使用Webbrowser控件可以处理几乎所有的网页,与使用IE相比,用户界面和程序可控性要好一些。
但是窗体中自带的Webbrowser控件目前问题较多,使用时需要仔细调试。

如果想进一步学习Webbrowser控件的使用可以参考下贴
http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=815805&pid=6110079






TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-22 18:05 | 显示全部楼层
本帖最后由 liucqa 于 2012-8-11 14:48 编辑

第三课小结:

    本课以四个实例,讲解了四种方法获取下载图片,并保存到本地硬盘或放到Image控件的方法。其中除了XmlHttp方法之外,其余都使用了API函数。对初学者来说,可能一看到API函数就头晕目眩,大呼看不懂。其实,只要耐心下来,慢慢看,至少前两种方法的API函数并不难理解,也很容易使用。
    推荐一个API速查的网站  http://ahan.sourceforge.net/api/  ,本课用到的函数都可以在此网站查询到使用方法。

    使用Image控件加载网络图片,在需要进行验证码输入的时候非常有用。

    在下一课,我会演示处理验证码图片的例子。
   


本课的示例代码在这里
网页采集和抓取教程-第三课示例.rar (28.22 KB, 下载次数: 2067)


TA的精华主题

TA的得分主题

发表于 2012-7-22 18:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
占位听课。。
老师还不贴出来呢。

TA的精华主题

TA的得分主题

发表于 2012-7-22 18:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
占位听课,开讲吧。已经学习了1,2课。1课明白了些。

TA的精华主题

TA的得分主题

发表于 2012-7-22 18:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
收藏下先,慢慢学!!

TA的精华主题

TA的得分主题

发表于 2012-7-22 20:22 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-22 22:52 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-21 23:14 , Processed in 0.045689 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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