我的结果

我的结果

我正在用 Excel VBA 编写一个脚本,以便从 Google 图片搜索中获取缩略图。当我试图弄清楚如何清理此自动搜索中产生的临时文件时,我偶然发现了该INetCache目录。

进一步挖掘显示,该文件夹(特别是Low\IE子目录)包含大量图像 - 其中一些是图像缩略图,这些文件是我通过 vba 辛苦下载的,并且已经存在。因此,我决定通过逐步调试我的代码并查看InetCache\Low\IE目录中弹出的内容以及何时弹出的内容来进一步调查。我将介绍我的结果,并希望得到一些答案

  • 结果意味着什么
  • 我是否可以充分利用这些文件,而不必下载两次(一次下载到缓存,一次使用我的 VBA 程序)
  • 我应该如何从 VBA 中清理这些杂乱的东西

注意:互联网告诉我,这个文件夹在不同的系统下位于不同位置;我的是%localAppData%\Microsoft\Windows\INetCache\Low\IEWin10 IE11,但一个相当可靠的方法是输入

?CreateObject("Shell.Application").Namespace(32).self.path

进入 vba 立即窗口。所有文件都是受保护的系统文件,因此必须清晰可见

我的结果


INetCache\Low\IE这是我在运行 VBA 代码时发现文件夹中的内容。我首先将现有文件夹重命名为oldIE

启动浏览器

Set objIE = New InternetExplorer 'requires referencing Microsoft Internet Controls
  • 新建IE文件夹为空

使浏览器可见

objIE.Visible = True
  • 在以下位置创建的新container.dat文件IE

导航至网页并等待加载

objIE.Navigate "https://www.google.com/search?q=cookies&safe=off&tbs=isz:ex,iszw:1366,iszh:768&tbm=isch&source=lnt"
'google images search for "cookies"
Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop 'wait for load
  • 4 使用 8 个字符的字母数字(大写)名称创建的新子文件夹
  • 这些包含一些通用图标(Chrome,FB,twitter),尽管其中一个包含第一个图像结果的缩略图(名为images[1].jpg

页面滚动

当您向下滚动时,Google 会运行一些Ajax脚本来加载更多图片。我的方法是向下滚动直到显示“获取更多结果按钮”;这应该表示整个页面的图片对象都已加载(尽管它们的缩略图 URL/字符串尚未出现)。

Set currpage = objIE.Document
Set myDiv = currpage.getElementById("fbar") 'this is the load more images button
Do Until elemRect.bottom > 0 'scroll until myDiv is in view
    currpage.parentWindow.scrollBy 0, 10000 'scroll by a big amount to trigger next part to load
    Set elemRect = myDiv.getBoundingClientRect
Loop
  • 所有 4 个文件夹都充满了图像
    • 这些图像要么有images[1-10].ext名称,要么images后面跟着一个 8 个字符的字母数字字符串
    • 我想知道这里是否存在将文件名/其他属性与其在网页上的位置相关联的模式,因为这将允许我在 VBA 程序中使用这些图像
    • 页面完全加载后,缓存中总共有 375 张 jpg 和 390 张图片,而整个网页中有 400 张图片
  • 我对缓存中的这些图片进行了随机检查,结果显示它们确实在 IE 搜索结果中(也就是说,我可以通过滚动图片结果找到它们,所以我猜测缓存中的所有图片直接来自 IE 搜索结果。但我的检查并不详尽)

在此期间我也手动滚动了页面

  • 这样做会创建大量新.txt文件和其他文件。它还会将更多图像下载到缓存中。
  • 为了使其有用,我需要一种更系统的方法将它们放入 vba。

计数图像

imgCount = currpage.getElementById("rg_s").getElementsByTagName("IMG").Length
  • 对于给定的搜索网址,此代码返回 400。缓存包含 375 张看起来像搜索缩略图的图片,以及一些其他徽标和图标图片
  • 造成这种差异的一个可能原因是,一些(通常是前 10 个左右)缩略图是 base 64 编码的字符串,其他缩略图有 url,也许只有带有 url 的缩略图才会被缓存(尽管这看起来并不总是正确的)

退出 IE

objIE.Quit
  • 这对缓存中的文件没有任何明显影响

最后,下载图像缩略图

Public 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

其次是

fileurl = currpage.getElementById("rg_s").getElementsByTagName("IMG")(0).src
'returns thumbnail url of first image result
strFile = Environ("Temp") & "\Temp.jpg" 'place file in temp folder
ret = URLDownloadToFile(0, fileURL, strFile, 0, 0) 'fileurl is the web url, strfile is the save location
  • 对缓存中的图像也不做任何处理

我想知道什么(TL;DR)

这一切都很好,但我实际上问的是什么?

出色地:

  • IE 缓存中的图像文件命名是否存在逻辑 - 或者我可以使用这些缓存文件以与 IE 搜索相同的顺序显示图像缩略图的其他属性?
  • 如果我真的不能使用它们,因为它们的位置/命名完全不可预测;我怎样才能从 VBA 中清除它们/阻止它们被创建
    • 这个答案不碰它们,也不Siddharth Rout 的方法。由于保护问题,我无法删除它们CreateObject("Scripting.FileSystemObject"),而且我发现的所有其他方法都是手动的,需要点击 IE 菜单
    • 这样做安全吗?Reddit但他们说是,但事实并非如此极好的像你们这样的用户。我计划在其他人的机器上运行此软件,所以我想检查一下是否应该删除它,然后将其发布给其他人。
    • 我觉得一开始就没有必要下载这些
  • 最后,纯粹出于兴趣,下载/创建的所有文件到底是为了什么?

相关内容