WebBrowser и картинки

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
$Yastrebov$
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 24.01.2007 (Ср) 7:27
Откуда: Ukraine

WebBrowser и картинки

Сообщение $Yastrebov$ » 11.12.2009 (Пт) 15:33

Задача: Необходимо вывести около 20 найденных по запросу картинок и сохранить на диск 1 выбранную по клику картинку.
Вопрос: Как организовать поиск картинок, распарсивание ссылок и что использовать как контейнер (по которому будет клик)? Как сохранить я уже знаю.

Как решал задачу: Использовал WebBrowser. Посмотрел принцип построения запроса на Яндекс.Картинки. Выполнил переход в WebBrowser по ссылке вида:
http://images.yandex.ua/yandsearch?..., хотел парсить через
Код: Выделить всё
Webbrowser.Document.images
, но в Яндексе отображаются маленьки копии картинок без ссылки на оригинал. Ссылка вида: http://im2-tub.yandex.net/i?id=142330008&tov=2 не является ссылкой на картинку (*.jpg,*.gif)
Жизнь, она как коробка конфет - никогда не знаешь, что вытянешь!

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: WebBrowser и картинки

Сообщение Денис » 11.12.2009 (Пт) 15:42

Почему же не является? В ответ на этот адрес, сервер яндекса возвращает картинку? Возвращает. Значит является? Является. Или я недопонял?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

$Yastrebov$
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 24.01.2007 (Ср) 7:27
Откуда: Ukraine

Re: WebBrowser и картинки

Сообщение $Yastrebov$ » 11.12.2009 (Пт) 15:46

Да, не совсем корректно сформулировал.

По ссылке маленькая копия оригинальной картинки с какого-то другого сервера. Нужно получить ссылку на оригинальную картинку, а не на ее маленькую копию, с минимальным количеством запросов. И вывести 20 таких аналогичных картинок (распарсив найденное Яндексом) в какие-то контейнеры вроде PictureBox(image)
Жизнь, она как коробка конфет - никогда не знаешь, что вытянешь!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: WebBrowser и картинки

Сообщение Antonariy » 11.12.2009 (Пт) 16:58

$Yastrebov$ писал(а):Вопрос: Как организовать поиск картинок, распарсивание ссылок и что использовать как контейнер (по которому будет клик)? Как сохранить я уже знаю.
Не использовать WebBrowser, использовать XMLHTTP. Для парсинга использовать регулярные выражения. Из ответа на поисковый запрос вытаскивать ссылки на уменьшенные картинки, скачивать картинки и ссылки на оригинал, отображать на форме. Если картинка подходит, из соответствующего адреса оригинала скачать оригинальную картинку.
Это самый быстродействующий и экономный в плане траффика способ. Количество запросов к яндексу для получения всех необходимых данных от вашего желания не зависит.
Лучший способ понять что-то самому — объяснить это другому.

$Yastrebov$
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 24.01.2007 (Ср) 7:27
Откуда: Ukraine

Re: WebBrowser и картинки

Сообщение $Yastrebov$ » 18.01.2010 (Пн) 20:06

Antonariy, вначале сделал все с помощью WebBrowser. Все работает, но скорость обработки запросов хочется увеличить. Решил воспользоваться твоим советом по XmlHttp, но получил ошибку "Отказано в доступе". Хотя с запросом Google, XmlHttp успешно справляется и также успешно все оттуда парсится. Не подскажешь в чем подвох?

Код: Выделить всё
Dim XmlHttp1 As Object
Set XmlHttp1 = CreateObject("Microsoft.XmlHttp")
XmlHttp1.Open "GET", "http://images.yandex.ua/yandsearch?text=" + Text1.Text + "&isize=medium&rpt=image", False
XmlHttp1.Send 'Тут ошибка
Жизнь, она как коробка конфет - никогда не знаешь, что вытянешь!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: WebBrowser и картинки

Сообщение alibek » 18.01.2010 (Пн) 20:21

Возможно, Яндекс не любит личеров и блокирует их.
Lasciate ogni speranza, voi ch'entrate.

$Yastrebov$
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 24.01.2007 (Ср) 7:27
Откуда: Ukraine

Re: WebBrowser и картинки

Сообщение $Yastrebov$ » 18.01.2010 (Пн) 20:41

Значит обойти эту ошибку нельзя? Вернуться к использованию медленного WebBrowser?
Жизнь, она как коробка конфет - никогда не знаешь, что вытянешь!

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: WebBrowser и картинки

Сообщение iGrok » 18.01.2010 (Пн) 20:55

У меня этот вариант выдаёт рандомные ошибки на рандомных сайтах.
Аналогичные запросы через WinHTTPRequest работают без проблем.

Видимо, не в яндексе дело.
label:
cli
jmp label

$Yastrebov$
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 24.01.2007 (Ср) 7:27
Откуда: Ukraine

Re: WebBrowser и картинки

Сообщение $Yastrebov$ » 18.01.2010 (Пн) 21:15

iGrok, спасибо! Ваш совет с WinHttpRequest работает.

Но как-то помедленнее чем Microsoft.XmlHttp обрабатывает Google. Непонятно тогда в чем некорректность приведенного выше кода, который при каком-то запросе работает, а при каком-то нет?!
Жизнь, она как коробка конфет - никогда не знаешь, что вытянешь!

$Yastrebov$
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 24.01.2007 (Ср) 7:27
Откуда: Ukraine

Re: WebBrowser и картинки

Сообщение $Yastrebov$ » 18.01.2010 (Пн) 22:00

Самое интересное, что запрос вида:

Код: Выделить всё
Dim XmlHttp1 As New WinHttpRequest
XmlHttp1.Open "GET", "http://www.google.com/images?imgsz=m&as_q=" + Text1.Text, False
XmlHttp1.Send


Возвращает XmlHttp1.Status=403

Хотя при использовании Microsoft.XmlHttp (из первого моего примера) все отлично работает :)
Жизнь, она как коробка конфет - никогда не знаешь, что вытянешь!

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: WebBrowser и картинки

Сообщение iGrok » 18.01.2010 (Пн) 22:16

Код: Выделить всё
Dim XmlHttp1 As New WinHttpRequest
XmlHttp1.Open "GET", "http://www.google.com/images?imgsz=m&as_q=pontiac", False

XmlHttp1.SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7"

XmlHttp1.Send


Ну или ещё чего-нибудь в этом духе.

UPD:
Да даже:
XmlHttp1.SetRequestHeader "User-Agent", "Picture Searcher/1.0"
label:
cli
jmp label

$Yastrebov$
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 24.01.2007 (Ср) 7:27
Откуда: Ukraine

Re: WebBrowser и картинки

Сообщение $Yastrebov$ » 18.01.2010 (Пн) 22:32

iGrok, отлично! Все работает под WinHttpRequest

Только вот при варианте с Яндексом вылазит вот такое вот предупреждение (рис.1). Его бы как-то запретить. Что-то вроде как в WebBrowser.Silent = True
Вложения
1.png
рис.1
1.png (18.55 Кб) Просмотров: 4048
Жизнь, она как коробка конфет - никогда не знаешь, что вытянешь!

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: WebBrowser и картинки

Сообщение iGrok » 18.01.2010 (Пн) 22:49

0_o
Яндекс что-то перемудрил, похоже..

Думаю, можно поэкспериментировать с xmlhttp1.Option(...).
Их там много, может что-то и поможет.

UPD: А после чего оно вылезает?
label:
cli
jmp label

$Yastrebov$
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 24.01.2007 (Ср) 7:27
Откуда: Ukraine

Re: WebBrowser и картинки

Сообщение $Yastrebov$ » 20.01.2010 (Ср) 16:00

Обнаружил, что ошибку выдает не WinHttpRequest, а HTMLDocument, при записи:
HTMLDocument.Write XmlHttp1.ResponseText

Можно конечно переделать все на WinHttpRequest + Регулярные выражения, но мне больше нравится работать через DOM. Ну и к тому же код изначально писался именно для DOM к WebBrowser.

Я вот думаю, может для открытия страницы использовать HTMLDocument полностью?
Код: Выделить всё
Dim XmlHttp1 as New HTMLDocument
XmlHttp1.open...


Или такой вариант менее рационален для этой задачи?
Жизнь, она как коробка конфет - никогда не знаешь, что вытянешь!

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: WebBrowser и картинки

Сообщение djalex777 » 20.01.2010 (Ср) 16:19

Вместо Write используй Body.InnerHtml. Для чего ты используешь DOM? Для изъятия "<img src = "? Если да, то лучше вручную парсить.

$Yastrebov$
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 24.01.2007 (Ср) 7:27
Откуда: Ukraine

Re: WebBrowser и картинки

Сообщение $Yastrebov$ » 20.01.2010 (Ср) 19:39

Ну вообще я использовал с помощью DOM циклы:
Код: Выделить всё
For Each elem In XmlHttp1.images
и
Код: Выделить всё
For Each elem In XmlHttp1.links

Так я обходил каждую маленькую картинку и парсил из нее ссылку на картинку в оригинальном размере (для Google)
и обходил каждый линк в Yandex и проверял его на свое условие для той же цели.
Жизнь, она как коробка конфет - никогда не знаешь, что вытянешь!

$Yastrebov$
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 24.01.2007 (Ср) 7:27
Откуда: Ukraine

Регулярные выражения!!!

Сообщение $Yastrebov$ » 21.01.2010 (Чт) 0:22

Кто подскажет почему не срабатывает такое регулярное выражение: "img_{0,1}url=.+\.jpe{0,1}g?&"
Для текста, в котором есть строки:

    http://images.google.com.ua/imgres?imgurl=http://slide.shop.by/pics/items/Nokia%25205800%2520XpressMusic-2.jpg&imgrefurl=http://slide.shop.by/133/&usg=__xp5hMiqHaxBI-bxrs7NvPIa53Ho=&h=300&w=400&sz=25&hl=ru&start=2&tbnid=rh-S6wrH2nbtRM:&tbnh=93&tbnw=124&prev=/images%3Fq%3Dnokia%2B5800%26gbv%3D2%26hl%3Dru%26sa%3DG
    http://images.google.com.ua/imgres?imgurl=http://www.cyberstyle.ru/images2external/misc/Image/news/Portable_electronics_mobiles/271008/nokia-5800-ofc-05.jpg.jpg&imgrefurl=http://www.cyberstyle.ru/newsline/view/3899/Nokia-Nokia_5800_XpressMusic-Carl_Zeiss-Nokia_Maps-iPhone-.html&usg=__A504HirkG0xA47LBCYM06ziG9Z4=&h=800&w=525&sz=50&hl=ru&start=3&tbnid=zyEuIBVJv1ZKHM:&tbnh=143&tbnw=94&prev=/images%3Fq%3Dnokia%2B5800%26gbv%3D2%26hl%3Dru%26sa%3DG
    http://images.google.com.ua/imgres?imgurl=http://www.itechnews.net/wp-content/uploads/2008/04/nokia-5800-tube-iphone-killer.jpg&imgrefurl=http://webtele.com.ua/mobiles/nokia-5800-zavtra&usg=__SYjp0-Ln6nokMdzVwQzyd1UTbX0=&h=500&w=300&sz=32&hl=ru&start=4&tbnid=_2IQutp4HaApAM:&tbnh=130&tbnw=78&prev=/images%3Fq%3Dnokia%2B5800%26gbv%3D2%26hl%3Dru%26sa%3DG
    http://images.yandex.ua/search?p=0&ed=1&text=Nokia%205800&spsite=fake-008-1675843.ru&img_url=images04.olx.ru%2Fui%2F1%2F71%2F23%2F42296823_3.jpg&rpt=simage
    http://images.yandex.ua/search?p=3&ed=1&text=Nokia%205800&spsite=fake-031-1312559.ru&img_url=www.cyberstyle.ru%2Fimages2external%2Fmisc%2FImage%2Fnews%2FPortable_electronics_mobiles%2F161208%2Fnokia5800xpressmusic_1.jpg.jpg&rpt=simage
    http://images.yandex.ua/search?p=10&ed=1&text=Nokia%205800&spsite=fake-029-103411.ru&img_url=mobilnik.ua%2Fimages%2Fnews%2Fbig%2Fnokia_tube1.jpg&rpt=simage

из такого кода:

Код: Выделить всё
Dim myRegExp As New RegExp
    myRegExp.MultiLine = True
    myRegExp.Global = True
    myRegExp.IgnoreCase = True
    myRegExp.Pattern = "img_{0,1}url=.+\.jpe{0,1}g?&"
   
    Dim aMatch As Match
    Dim colMatches As MatchCollection
    Dim testString As String
   
    testString = XmlHttp1.ResponseText ' Тут передается HTML-страница
   
    Set colMatches = myRegExp.Execute(testString)
   
    For Each aMatch In colMatches
       MsgBox aMatch.Value
    Next aMatch
Жизнь, она как коробка конфет - никогда не знаешь, что вытянешь!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: WebBrowser и картинки

Сообщение Antonariy » 21.01.2010 (Чт) 11:04

У меня срабатывает, из первой строчки извлекает imgurl=http://slide.shop.by/pics/items/Nokia%25205800%2520XpressMusic-2.jpg&
Однако, видимо нужен сам урл, поэтому паттерн лучше сделать такой: "img_{0,1}url=(.+\.jpe{0,1}g?)&", а значение искать в aMatch.SubMatches(0)
Лучший способ понять что-то самому — объяснить это другому.

$Yastrebov$
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 24.01.2007 (Ср) 7:27
Откуда: Ukraine

Re: WebBrowser и картинки

Сообщение $Yastrebov$ » 21.01.2010 (Чт) 14:53

Похоже дело все таки не в Рег.Выр., а в том, что XmlHttp1.ResponseText не возвращает HTML страницу по моему запросу (пример выше). Он возвращает но либо ее часть, либо что-то левое вообще... По каким причинам такое может быть?
Жизнь, она как коробка конфет - никогда не знаешь, что вытянешь!

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: WebBrowser и картинки

Сообщение djalex777 » 21.01.2010 (Чт) 17:28

ResponseBody

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: WebBrowser и картинки

Сообщение Antonariy » 22.01.2010 (Пт) 11:17

$Yastrebov$ писал(а):Похоже дело все таки не в Рег.Выр., а в том, что XmlHttp1.ResponseText не возвращает HTML страницу по моему запросу (пример выше). Он возвращает но либо ее часть, либо что-то левое вообще... По каким причинам такое может быть?
Нужен текст ответа, обычно он содержит причину, обычно она 404 из-за невнимательности.
Лучший способ понять что-то самому — объяснить это другому.

alexs37
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 05.03.2010 (Пт) 19:04

Re: WebBrowser и картинки

Сообщение alexs37 » 05.03.2010 (Пт) 19:15

Здравствуйте. Подскажите, как сохранить рисунок (IMG) с web страницы или скопировать в буфер обмена как растровое изображение (*.ВМР).
Код: Выделить всё
Set Elements = WebBrowser1.document.getElementsByTagName(IMG)
Elements(1). ‘ а дальше не знаю что писать.
Побывал разные вариации с Elements типа Copy save и тому подобное, но без успеха.
Смотрел здесь http://wdh.suncloud.ru/html06.htm#eimg разные свойства элемент IMG но не чего не смог придумать.
А здесь http://wdh.suncloud.ru/dhtml08.htm описан Интерфейс HTMLImageElement соответствует элементу IMG но все равно не смог разобраться, или может вообще не в ту сторону подался?

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: WebBrowser и картинки

Сообщение FireFenix » 06.03.2010 (Сб) 0:12

Код: Выделить всё
Set Elements = WebBrowser1.document.getElementsByTagName(IMG)
Dim URL as Strin = Elements(1).src

'Получаем картинку по ссылке URL
'...
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

alexs37
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 05.03.2010 (Пт) 19:04

Re: WebBrowser и картинки

Сообщение alexs37 » 06.03.2010 (Сб) 13:12

Спасибо, но этот вариант я уже расматривал, но при этом получается повторный запрос к серверу и удвоенный трафик.
А картинка уже есть на жестком в папке Temporary Internet Files с тем самым URL. Можно как-то через index.dat и известный URL достать файл из кеша? И потом, при правом клике на картинку, в контекстном меню есть команда «сохранить рисунок как…», может быть можно как-то дотянуться до этой команды?


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 11

    TopList