我正在用 Excel VBA 编写一个脚本,以便从 Google 图片搜索中获取缩略图。当我试图弄清楚如何清理此自动搜索中产生的临时文件时,我偶然发现了该INetCache
目录。
进一步挖掘显示,该文件夹(特别是Low\IE
子目录)包含大量图像 - 其中一些是图像缩略图,这些文件是我通过 vba 辛苦下载的,并且已经存在。因此,我决定通过逐步调试我的代码并查看InetCache\Low\IE
目录中弹出的内容以及何时弹出的内容来进一步调查。我将介绍我的结果,并希望得到一些答案
- 结果意味着什么
- 我是否可以充分利用这些文件,而不必下载两次(一次下载到缓存,一次使用我的 VBA 程序)
- 我应该如何从 VBA 中清理这些杂乱的东西
注意:互联网告诉我,这个文件夹在不同的系统下位于不同位置;我的是%localAppData%\Microsoft\Windows\INetCache\Low\IE
Win10 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但他们说是,但事实并非如此极好的像你们这样的用户。我计划在其他人的机器上运行此软件,所以我想检查一下是否应该删除它,然后将其发布给其他人。
- 我觉得一开始就没有必要下载这些
- 这个答案不碰它们,也不Siddharth Rout 的方法。由于保护问题,我无法删除它们
- 最后,纯粹出于兴趣,下载/创建的所有文件到底是为了什么?