Я пишу сценарий в Excel VBA, чтобы получить эскизы из поиска картинок Google. Пытаясь выяснить, как очистить временные файлы, созданные в этом автоматическом поиске, я наткнулся на каталог INetCache
.
Дальнейшее копание показывает, что эта папка (в частности, подкаталог Low\IE
) содержит огромную загрузку изображений - некоторые из них - это миниатюры изображений, те самые файлы, которые я с трудом скачивал через vba, и уже присутствуют. Поэтому я решил провести дальнейшее расследование, шаг за шагом отлаживая мой код и посмотрев, что появилось в моем InetCache\Low\IE
, и когда. Я собираюсь просмотреть результаты и надеюсь получить ответы на некоторые вопросы.
- Что означают результаты
- Могу ли я использовать эти файлы в своих интересах, а не загружать дважды (один раз в кэш, один раз с моей программой VBA)
- Как я должен очистить этот беспорядок от VBA
NB Интернет говорит мне, что эта папка находится в разных местах в зависимости от вашей системы; у меня есть %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
скрипт для загрузки большего количества изображений при прокрутке вниз. Мой метод состоит в том, чтобы прокрутить вниз, пока не появится "кнопка получения дополнительных результатов"; это должно означать, что загружена вся страница объектов изображения (хотя их миниатюрные ссылки / строки еще не представлены).
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 jpgs и 390 изображений, по сравнению с 400 результатами изображений на всей веб-странице.
- Эти изображения либо имеют
- Случайные проверки я сделали на этих изображениях в кэше сделал , показывает , что они были в результатах поиска IE (то есть, я мог бы найти их с помощью прокрутки вокруг результатов изображения, поэтому я предполагаю , что все изображения в кэше приходят непосредственно из результаты поиска IE. Но мои чеки не были исчерпывающими)
Я также прокрутил страницу вручную в течение этого времени
- Это создало множество новых файлов
.txt
и других файлов. Он также загрузил больше изображений в кэш. - Для того, чтобы это было полезно, мне понадобится более систематический способ получить их в VBA.
Подсчет изображений
imgCount = currpage.getElementById("rg_s").getElementsByTagName("IMG").Length
- Это вернуло 400 для данного поискового URL. Кэш содержал 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 / остановить их создание
- Этот ответ не касается их, равно как и подход Сиддхарта Раута. Я не могу удалить их с помощью
CreateObject("Scripting.FileSystemObject")
из-за проблем защиты, и все другие методы, которые я нашел, являются ручными и требуют щелчка по меню IE - Насколько это безопасно? Reddit говорит, что это так, но на самом деле они не такие супер- пользователи, как вы, ребята. И я планирую запустить это программное обеспечение на машинах других людей, поэтому я хочу проверить, следует ли мне избавиться от этого, чтобы оно было передано другим людям.
- Я чувствую, что нет необходимости загружать все это в первую очередь
- Этот ответ не касается их, равно как и подход Сиддхарта Раута. Я не могу удалить их с помощью
- Наконец, чисто из интереса, для чего все файлы загружаются / создаются в любом случае?