программный Поиск по картинке через google

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 11.08.2012 (Сб) 8:59

Invader писал(а):
Код: Выделить всё
If ves > 70 Or ves < 30 Then
  GoTo 4
Else
  Links.Add(Match.Groups(1).Value)
End If

Опять ты...

Код: Выделить всё
If ves > 70 Or ves < 30 Then
  Continue For
Else
  Links.Add(Match.Groups(1).Value)
End If

Код: Выделить всё
If ves <= 70 AndAlso ves >= 30 Then Links.Add(Match.Groups(1).Value)

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

Re: программный Поиск по картинке через google

Сообщение FireFenix » 11.08.2012 (Сб) 15:23

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

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 11.08.2012 (Сб) 15:53

FireFenix писал(а):Думаю пора уже линкануть человеку
viewtopic.php?f=68&t=41742

Если это на постоянный вызов Groups(1).Value, который лично мне кажется подозрительным (точно не знаю, но есть подозрение, что может работать как использование Lines у TextBox'а), то слишком тонко.
Если на break/continue vs goto, то те в тему, т. к. тут разницы по скорости нет, причём как исполнения кода, так и его написания.
Если про вытаскивание ссылок регулярками, то вообще не согласен... Тем более, по-нормальному у него 100% не получится. Да я бы и сам регулярками воспользовался.

Так что, уточни, к чему тут эта ссылка, а то непонятно...

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

Re: программный Поиск по картинке через google

Сообщение FireFenix » 11.08.2012 (Сб) 19:16

FireFenix писал(а):Думаю пора уже линкануть человеку
viewtopic.php?f=68&t=41742

Qwertiy писал(а):Так что, уточни, к чему тут эта ссылка, а то непонятно...

Очевидно - человек обладает знаниями для осознания кода, но судя по череде тем и сообщений - очень лениться потратить время и найти ответы в интернете, или посидеть, подумать над проблемой.

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

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: программный Поиск по картинке через google

Сообщение Invader » 15.08.2012 (Ср) 16:34

собственно код
Код: Выделить всё
Imports System.IO
Imports System.Text
Imports System.Text.RegularExpressions
Imports System.Net
Imports System.Uri


Public Class Form1
    Public Function poiskcapture(ByVal silk As String) As String
        Dim Request As HttpWebRequest = HttpWebRequest.Create("http://www.google.com/searchbyimage?image_url=http://tophotels.ru/icache/" & silk)
        Request.UserAgent = "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.83 Safari/535.11"
       
        Dim Response As HttpWebResponse = Request.GetResponse()


        Dim Result As String
        Using Reader As StreamReader = New StreamReader(Response.GetResponseStream(), Encoding.UTF8)
            Result = Reader.ReadToEnd()
        End Using
        Response.Close()




        Dim ves As Integer
        Dim Links As New List(Of String)
        For Each Match As Match In Regex.Matches(Result, "div style=""float.*?href=.*?imgurl=(.*?)((&amp;|&)tbnid.*?)")
            ves = CInt(Regex.Match(Match.Groups(1).Value, "sz=(\d+)").Groups(1).Value)
            'TextBox1.Text = ves.ToString
            If ves >= 16 AndAlso ves <= 200 Then
                Links.Add(Match.Groups(1).Value)
            Else
                Continue For
            End If
        Next Match
        Dim captururl As New List(Of String)
        Dim capture As String = String.Join(vbCrLf, Links)
        For Each Match1 As Match In Regex.Matches(capture, "(.*?)((&amp;)|&)imgrefurl")
            poiskcapture = (Match1.Groups(1).Value)
        Next Match1


    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Где-то в начале:
        Dim dict As New Dictionary(Of String, Integer)
        Dim i As Integer
        Dim s As String
        Dim key As String
        Dim dir As String
     
        Dim o As New System.IO.StreamReader("c:\a.txt")

        Do While o.Peek() >= 0
5:          i = i + 1
            s = o.ReadLine()
            dir = "d:\2" + Regex.Match(s, "(/\d+/\d+/\d+)", RegexOptions.IgnoreCase).Value
            key = "d:\2" + Regex.Match(s, "(/\d+/\d+/\d+/)", RegexOptions.IgnoreCase).Value


            'cохраняем
            Dim Address As String = poiskcapture(s)
            Address = WebUtility.HtmlDecode(Address)
            Address = WebUtility.HtmlDecode(Address)
            Using WC As New Net.WebClient
                WC.Headers(Net.HttpRequestHeader.Cookie) = "nm=val"
                Dim FileData As Byte() = WC.DownloadData(Address)
                If Not Directory.Exists(dir.Replace("/", "\")) Then Directory.CreateDirectory(dir.Replace("/", "\"))
                IO.File.WriteAllBytes(key.Replace("/", "\") + i.ToString + ".jpg", FileData)
            End Using

            On Error Resume Next
           

        Loop

        o.Close()
       
    End Sub
End Class

всё относительно работало, в документе a.txt лежали куски ссылок они передавались в функцию poiskcapture которая возвращала найденную в гугл ссылку и передавала её на сохранение. Была в начале одна проблема, сообщалось при отладке что функция может возвращать NULL, и действительно я терял ссылки, но большинство сохранялись на комп, а через день бах сервер гугл вдруг в строчке
Код: Выделить всё
Dim Response As HttpWebResponse = Request.GetResponse()
выдаёт ошибку 503, правда через час проблема самоустранилась. Что это было...?
да и по поводу функции среда рекомендует Return но на что указать запись, если я правильно выражаюсь!?
умён и жаден,
характер отсуствует

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

Re: программный Поиск по картинке через google

Сообщение iGrok » 15.08.2012 (Ср) 18:34

Invader писал(а):Что это было...?

Это тебя, батенька, гугл на час забанил.
label:
cli
jmp label

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: программный Поиск по картинке через google

Сообщение Invader » 20.08.2012 (Пн) 12:32

iGrok писал(а):
Invader писал(а):Что это было...?

Это тебя, батенька, гугл на час забанил.

вот оно как оказывается, это решение, не сочтите за наглость, но нельзя ли, как то это обойти, какие нибудь рекомендации: ну скажем запускать программу ночью, либо проксисервер если он поможет.
умён и жаден,
характер отсуствует

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re:

Сообщение Invader » 20.08.2012 (Пн) 14:00

Qwertiy писал(а):
Код: Выделить всё
If ves > 70 Or ves < 30 Then
  Continue For
Else
  Links.Add(Match.Groups(1).Value)
End If


ту есть не большая просьба с советом, выдает как правило более 1 результата, хотелось бы свести к одному - наибольшему значению переменной ves.
msdn предлагает метод Queryable.Max(Of TSource)
я пробовал записать так
Код: Выделить всё
Dim Links As New List(Of Long)
'чуть выше

If ves > 70 Or ves < 30 Then
  Continue For
Else
  Links.Add(Match.Groups(1).Value)
End If
Dim max As Long = links.AsQueryable().Max()
textbox2.text=max

но я не вижу ответа в текстбоксе
умён и жаден,
характер отсуствует

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

Re: программный Поиск по картинке через google

Сообщение FireFenix » 20.08.2012 (Пн) 16:44

Invader писал(а):ту есть не большая просьба с советом, выдает как правило более 1 результата, хотелось бы свести к одному - наибольшему значению переменной ves.

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

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

Re: программный Поиск по картинке через google

Сообщение iGrok » 20.08.2012 (Пн) 18:48

Invader писал(а):
iGrok писал(а):
Invader писал(а):Что это было...?

Это тебя, батенька, гугл на час забанил.

вот оно как оказывается, это решение, не сочтите за наглость, но нельзя ли, как то это обойти, какие нибудь рекомендации: ну скажем запускать программу ночью, либо проксисервер если он поможет.

Хотя нет. По идее, 403 выдавалась бы в случае запрета доступа, или вообще соединение тихо закрывалось бы. А тут 503я.. Может, действительно сервис был недоступен целый час. Профилактика, там, или ещё что-то.
label:
cli
jmp label

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: программный Поиск по картинке через google

Сообщение Invader » 21.08.2012 (Вт) 9:21

FireFenix писал(а):
Invader писал(а):ту есть не большая просьба с советом, выдает как правило более 1 результата, хотелось бы свести к одному - наибольшему значению переменной ves.

Как найти максимальное значение в массиве - проходят в 9 классе школы

это очн любезно что вы мне напомнили про дремучие времена 9 класса, да я с вами и не спорю, только в школе у нас был quic basic и что в алгебре что на информатике мы как то не пользовались методом Queryable.Max(Of TSource)
а он так удобно выглядит- в одну строчку!
умён и жаден,
характер отсуствует

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

Re: программный Поиск по картинке через google

Сообщение FireFenix » 21.08.2012 (Вт) 14:22

Invader писал(а):
FireFenix писал(а):
Invader писал(а):ту есть не большая просьба с советом, выдает как правило более 1 результата, хотелось бы свести к одному - наибольшему значению переменной ves.

Как найти максимальное значение в массиве - проходят в 9 классе школы

это очн любезно что вы мне напомнили про дремучие времена 9 класса, да я с вами и не спорю, только в школе у нас был quic basic и что в алгебре что на информатике мы как то не пользовались методом Queryable.Max(Of TSource)
а он так удобно выглядит- в одну строчку!

Поиск гугла выглядит очень удобно!

Хз, вообще в чём проблема. Явно нужно начинать с учебника по языку, чтобы всё работало
Код: Выделить всё
        Dim c As New System.Collections.Generic.List(Of Long)

        c.Add(1)
        c.Add(2)
        c.Add(3)
        c.Add(4)

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

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: программный Поиск по картинке через google

Сообщение Invader » 27.08.2012 (Пн) 18:20

FireFenix писал(а):Поиск гугла выглядит очень удобно!

Хз, вообще в чём проблема. Явно нужно начинать с учебника по языку, чтобы всё работало
Код: Выделить всё
        Dim c As New System.Collections.Generic.List(Of Long)

        c.Add(1)
        c.Add(2)
        c.Add(3)
        c.Add(4)

        MsgBox(c.Max())

проверку надо было делать по переменной ves внутри условия, и если ves max, тогда и только тогда переменная links получала бы значение, а не как в общем случае. вижу как то так, но строчку запишу условно, т.к. не знаю как правильно записать после else
Код: Выделить всё
If ves > 70 Or ves < 30 Then
  Continue For
Else if ves = MAX then   Links.Add(Match.Groups(1).Value)              'как и где задать что MAX=ves.max()
End If
умён и жаден,
характер отсуствует

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 29.08.2012 (Ср) 18:02

Что-то я опять не понимаю, чего ты хочешь.

Если все ссылки с максимальным значением sz для диапазона 30 to 70 то (если очень сильно извратиться :mrgreen:) можно так:
Код: Выделить всё
Links = If(Regex.Matches(Result, "href=.*?imgurl=(.*?)((&amp;)|&)imgrefurl.*?sz=(\d+)").OfType(Of Match)().Select(Function(M As Match) New With {.Url = M.Groups(1).Value, .Sz = Integer.Parse(M.Groups(4).Value)}).Where(Function(Obj) Obj.Sz >= 30 AndAlso Obj.Sz <= 70).GroupBy(Function(Obj) Obj.Sz).OrderByDescending(Function(Obj) Obj.Key).FirstOrDefault(), {New With {.Url = "", .Sz = 0}}.Skip(1)).Select(Function(Obj) Obj.Url).ToList()
К тому же, непонятно, зачем оно нужно.

Выбирать максимальный sz для одного url не имеет смысла, т. к. url-то одинаковый.

Пред.

Вернуться в Visual Basic .NET

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

    TopList