#vba #excel
#vba #excel
Вопрос:
Возможно ли написать макрос или vba, который будет выполнять поиск изображений по содержимому ячейки в строке A и возвращать URL-адрес изображения? Мне удалось вернуть первый результат в прошлом или первый результат поиска, но я не могу понять, как создать тот, который вернет соответствующее изображение, например:
Буду признателен за любую помощь, поскольку, по-моему, функция поиска исчерпана.
Спасибо.
Вот код, который я использовал, который работает не так, как хотелось.
Sub XMLHTTP()
Dim url As String, lastRow As Long
Dim XMLHTTP As Object, html As Object, objResultDiv As Object, objH3 As Object, link As Object
Dim start_time As Date
Dim end_time As Date
lastRow = Range("A" amp; Rows.Count).End(xlUp).Row
Dim cookie As String
Dim result_cookie As String
start_time = Time
Debug.Print "start_time:" amp; start_time
For i = 2 To lastRow
url = "https://www.google.co.in/search?q=" amp; Cells(i, 1) amp; "amp;rnd=" amp; WorksheetFunction.RandBetween(1, 10000)
Set XMLHTTP = CreateObject("MSXML2.serverXMLHTTP")
XMLHTTP.Open "GET", url, False
XMLHTTP.setRequestHeader "Content-Type", "text/xml"
XMLHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0"
XMLHTTP.send
Set html = CreateObject("htmlfile")
html.body.innerHTML = XMLHTTP.ResponseText
Set objResultDiv = html.getelementbyid("rso")
Set objH3 = objResultDiv.getelementsbytagname("H3")(0)
Set link = objH3.getelementsbytagname("a")(0)
str_text = Replace(link.innerHTML, "<EM>", "")
str_text = Replace(str_text, "</EM>", "")
Cells(i, 2) = str_text
Cells(i, 3) = link.href
DoEvents
Next
end_time = Time
Debug.Print "end_time:" amp; end_time
Debug.Print "done" amp; "Time taken : " amp; DateDiff("n", start_time, end_time)
MsgBox "done" amp; "Time taken : " amp; DateDiff("n", start_time, end_time)
End Sub
Комментарии:
1. Да, это возможно. Что вы уже пробовали?
2. Просто этот код, который перебирает текстовые строки в столбце a, выполняет поиск Google по каждой строке и сохраняет заголовок и URL первого результата в соответствующие ячейки в столбцах b и c. это не позволит мне опубликовать код здесь, поскольку он слишком длинный, но мне было сложно его реализовать, и он до сих пор не выполняет то, что мне нужно.
3. пожалуйста, рассмотрите возможность публикации короткого, автономного примера вашего кода. Если вы просите других изобрести велосипед для вас, вы вряд ли получите большую помощь.
4. НЕ ДОБАВЛЯЙТЕ КОД В КОММЕНТАРИИ . Пересмотрите свой вопрос, чтобы включить код. Это невозможно прочитать в комментариях.
5. Извиняюсь, надеюсь, это правильно
Ответ №1:
Проблема в том, что каждый поиск приведет вас к другому домену с совершенно другой структурой HTML.
Не существует надежного способа сделать это и ввести правильное изображение, потому что вы не можете заранее знать структуру возвращаемого HTML-кода, который вам нужно проанализировать для изображения… Конечно, вы могли бы попытаться вернуть, например, первое изображение на каждой странице, но поскольку страницы, скорее всего, будут содержать много изображений, которые не имеют отношения к вашему поиску, это будет не очень надежно.
Одной из альтернатив было бы сделать то, что вы делаете в данный момент, чтобы получить str_text
и link.href
к столбцам B и C вашей электронной таблицы, а затем выполнить второй запрос XMLHTTP к URL-адресу следующей структуры:
url = "https://www.google.co.in/search?q=" amp; Cells(i, 1) amp; "amp;source=lnmsamp;tbm=ischamp;sa=X" amp; "amp;rnd=" amp; WorksheetFunction.RandBetween(1, 10000)
Это вернет поиск изображений Google. Опять же, это будет не идеально, поскольку приложение не может определить, какое изображение является «лучшим» для возврата, но вы могли бы более надежно вернуть первое изображение, поскольку эти результаты с большей вероятностью будут соответствовать вашему поисковому запросу.
Комментарии:
1. Большое вам спасибо за разъяснение этого, поскольку я уже некоторое время работаю над этим. Ваш комментарий вдохновил меня на другой мыслительный процесс … можно ли пропустить поиск в Google и вместо этого искать URL-адреса изображений в Gamestop? gamexchange.co.uk/images/pictures/products/ps3/… URL-адреса остановки игры всегда одинаковы, за исключением фактического названия фотографии, которое всегда является названием продукта, поэтому, возможно, это должно устранить проблему со структурой HTML?
2. ну, конечно, это, вероятно, возможно, если вы можете задать правильный поисковый запрос, но поисковые запросы, перечисленные в столбце A, на самом деле, похоже, не возвращают большую часть результатов, если вы выполняете поиск в этом домене.