Программный поиск в интернете.

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

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

Dakovalev1
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 23.02.2010 (Вт) 14:16

Программный поиск в интернете.

Сообщение Dakovalev1 » 04.02.2011 (Пт) 19:44

Нужно в поисковую систему (yandex/google) забить какой-то текст и получить список результатов (тоже текст или что-то подобное :) ) (желательно с разделением по страницам).
Как реализовать такой поиск программно используя .net?
В гугле не нашёл.

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

Re: Программный поиск в интернете.

Сообщение FireFenix » 04.02.2011 (Пт) 20:37

Dakovalev1 писал(а):В гугле не нашёл.

Плохо искал...

Получение контента:
http://www.rsdn.ru/article/inet/httpweb.xml
http://msdn.microsoft.com/en-us/library ... quest.aspx
http://msdn.microsoft.com/en-us/library ... ponse.aspx

Парсинг: RegEx'ы

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

Dakovalev1
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 23.02.2010 (Вт) 14:16

Re: Программный поиск в интернете.

Сообщение Dakovalev1 » 04.02.2011 (Пт) 22:47

Большое спасибо.
Есть что почитать.
Но сразу возникает неизвестно откуда взявшийся вопрос (который я кстати тоже нигде не нашёл).
Как сделать прокси сервер?
Проблема вот в чём:
Я создаю httplistener (нормальный), к нему подключён браузер.
Когда я нажимаю любую ссылку в браузере, выдаётся, что страница не доступна.
Оно и понятно. Httplistener сожрал запросы браузера и ответы не вернул.
Бааааммм внимание вопрос: как вернуть браузеру тот самый response.
фрагмент моего кода (к сожалению managed c++)
Код: Выделить всё
HttpListener^ ls = gcnew HttpListener();
   ls->Prefixes->Add(L"http://127.0.0.1:8888/");
   ls->Start();
   HttpListenerContext^con = ls->GetContext();
   HttpListenerRequest^r = con->Request;
   //здесь надо что-то такое сделать
   ls->Stop();
   ls->Close();

При этом браузер настроен на прокси-сервер с портом 8888 и адресом 127.0.0.1.

Заранее спасибо.
З.Ы. Пошёл дальше читать :)

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

Re: Программный поиск в интернете.

Сообщение FireFenix » 05.02.2011 (Сб) 0:10

Dakovalev1 писал(а):Я создаю httplistener (нормальный)

(нормальный)? Бывает (не нормальный)?

Dakovalev1 писал(а):Оно и понятно. Httplistener сожрал запросы браузера и ответы не вернул.
Бааааммм внимание вопрос: как вернуть браузеру тот самый response.

кеп как бы намекает на гугл и msdn. http://msdn.microsoft.com/ru-ru/library ... ntext.aspx
C#
Код: Выделить всё
public static void SimpleListenerExample(string[] prefixes)
{
    if (!HttpListener.IsSupported)
    {
        Console.WriteLine ("Windows XP SP2 or Server 2003 is required to use the HttpListener class.");
        return;
    }
    // URI prefixes are required,
    // for example "http://contoso.com:8080/index/".
    if (prefixes == null || prefixes.Length == 0)
      throw new ArgumentException("prefixes");

    // Create a listener.
    HttpListener listener = new HttpListener();
    // Add the prefixes.
    foreach (string s in prefixes)
    {
        listener.Prefixes.Add(s);
    }
    listener.Start();
    Console.WriteLine("Listening...");
    // Note: The GetContext method blocks while waiting for a request.
    HttpListenerContext context = listener.GetContext();
    HttpListenerRequest request = context.Request;
    // Obtain a response object.
    HttpListenerResponse response = context.Response;
    // Construct a response.
    string responseString = "<HTML><BODY> Hello world!</BODY></HTML>";
    byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
    // Get a response stream and write the response to it.
    response.ContentLength64 = buffer.Length;
    System.IO.Stream output = response.OutputStream;
    output.Write(buffer,0,buffer.Length);
    // You must close the output stream.
    output.Close();
    listener.Stop();
}


Dakovalev1 писал(а):фрагмент моего кода (к сожалению managed c++)

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

Dakovalev1
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 23.02.2010 (Вт) 14:16

Re: Программный поиск в интернете.

Сообщение Dakovalev1 » 05.02.2011 (Сб) 0:35

К сожалению потому, что форум всё-таки VBstreets а не c++/c#streets.

Я кагбы всё это видел. Понимаешь ли тут мы какой-то свой Hello world забиваем а мне надо получить настоящий ответ из интернета.
Пробовал создать httpwebrequest и отконвертировать туда httplistenerrequest. Не хочет. Я так понимаю мне надо создать новый запрос httpwebrequest и вручную перекопировать все параметры из httplistenerrequest потом получить httpwebresponse и опят же вручную перекопировать всё это в httplistenerresponse. Вообще-то геморойно. Я клоню к тому, что в httplistenerrequest нет функции getresponse. Вот и геморой получается.

Нормальный httplistener имеется ввиду, что он взаимодействует с браузером правильно.

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

Re: Программный поиск в интернете.

Сообщение FireFenix » 05.02.2011 (Сб) 2:59

Dakovalev1 писал(а):К сожалению потому, что форум всё-таки VBstreets а не c++/c#streets.

Тогда логичнее было бы спросить в другом разделе или форуме, если ты пишешь на С++

Dakovalev1 писал(а):Я кагбы всё это видел. Я клоню к тому, что в httplistenerrequest нет функции getresponse. Вообще-то геморойно. Вот и геморой получается..

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

Dakovalev1
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 23.02.2010 (Вт) 14:16

Re: Программный поиск в интернете.

Сообщение Dakovalev1 » 05.02.2011 (Сб) 14:40

Ёлки палки.
Вот чувак.
У него такие же проблемы(были во всяком случае).
Прямо в начале там про баловство и дальше.
Неужели так сложно помочь?
Но загвоздка в том, что HttpWebRequest не переводиться в HttpListenerRequest легко, читай стандартными средствами.
Можно, конечно, сделать так:
Код: Выделить всё
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(request.Url);
       
        webRequest.ContentLength = request.ContentLength64;
        webRequest.ContentType = request.ContentType;
        webRequest.CookieContainer.Add(request.Cookies);
        // ...........
        HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
        // И наоборот

Но как-то это кривовато. Может я чето-нить забуду перевести (поля-то у них отличаются), может что-то перевести совсем нельзя.
Вопрос:
Как правильно перевести HttpWebRequest в HttpListenerRequest?
И аналогично с Response.

Вопрос тот же.

Тогда логичнее было бы спросить в другом разделе или форуме, если ты пишешь на С++

Мне всёравно на чём писать.
Только вот vb.net у меня сломался.
А c# я не захотел использовать.

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

Re: Программный поиск в интернете.

Сообщение FireFenix » 05.02.2011 (Сб) 15:26

Dakovalev1 писал(а):Ёлки палки.
Неужели так сложно помочь?

Написать за тебя код?
Почитать внимательно гугл/msdn?

Dakovalev1 писал(а):В гугле не нашёл.

Dakovalev1 писал(а):Вот чувак.

Ведь можешь если хочешь!

Dakovalev1 писал(а):У него такие же проблемы(были во всяком случае).

У него проблемы с улучшением кода
В твоём случае - как заставить выбранный тобой класс работать с HttpWebResponse/Request
Проблемы - разные. Тем более ответ на твой вопрос написан в нулевом посте.

Ответ на его вопрос:
ivashkanet писал(а):ИМХО, эти классы не предназначены для написания прокси. Вот отправить запрос в инет и получить ответ --- запросто, а для прокси лучше использовать сокеты.

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

При проявлении упорности, можно узнать его принцип работы, выделить промежуточные классы HttpListener'a и с ними работать, а не с самим классом
Последний раз редактировалось FireFenix 05.02.2011 (Сб) 15:47, всего редактировалось 1 раз.
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Dakovalev1
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 23.02.2010 (Вт) 14:16

Re: Программный поиск в интернете.

Сообщение Dakovalev1 » 05.02.2011 (Сб) 15:46

Вопрос:
Как правильно перевести HttpWebRequest в HttpListenerRequest?
И аналогично с Response. = Как выбранный мной класс (HttpListenerRequest) заставить перевестись в httpwebrequest

Ответ - никак?

Dakovalev1
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 23.02.2010 (Вт) 14:16

Re: Программный поиск в интернете.

Сообщение Dakovalev1 » 05.02.2011 (Сб) 15:53

Вот ещё прочитал.
Код: Выделить всё
ProxyRequest.Method = Context.Request.HttpMethod;
            ProxyRequest.UserAgent = Context.Request.UserAgent;               
            CookieContainer ProxyCookieContainer = new CookieContainer();
            ProxyRequest.CookieContainer = new CookieContainer();
            ProxyRequest.CookieContainer.Add(
                ProxyCookieContainer.GetCookies(new Uri(ServerURL)));
            ProxyRequest.KeepAlive = true;

Смысл: поскольку httplistenerrequest - гавно, мы создаём httpwebrequest и копируем туда свойства из httplistenerrequest.
И что вот этих свойств достаточно(их тут всего 3 штуки).
Велика вероятность что-то упустить.

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

Re: Программный поиск в интернете.

Сообщение FireFenix » 05.02.2011 (Сб) 15:57

Dakovalev1 писал(а):
Вопрос:
Как правильно перевести HttpWebRequest в HttpListenerRequest?
И аналогично с Response. = Как выбранный мной класс (HttpListenerRequest) заставить перевестись в httpwebrequest

Ответ - никак?

не ужели не очевидно?
Смотреть нужные свойства и транслировать, т.е. присвоить нужному тебе классу

Dakovalev1 писал(а):И что вот этих свойств достаточно(их тут всего 3 штуки).
Велика вероятность что-то упустить.

Что-то упустить можно и на равно месте

Чтобы ничего не упускать, нужно просто изучить
Раз ты не нашёл, то наверное с таким подходом/знаниями нада начать с азов: http://ru.wikipedia.org/wiki/HTTP

Сопоставить с передаваемыми данными, проверить их верность

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

Dakovalev1
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 23.02.2010 (Вт) 14:16

Re: Программный поиск в интернете.

Сообщение Dakovalev1 » 05.02.2011 (Сб) 16:17

буду делать с сокетами.
Ладно. Если вернуться к началу-к поиску.
Я так понимаю тут ничего великого не надо. Создал httpwebrequest с url = "http://google.ru/search?q=что-то%20очень%20нужное"
Потом получаю response читаю его stream и парсю?

кстати здесь %20 - символ с ascii 32(2*16+0) - пробел?

http://www.google.ru/search?q=а%20б

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

Re: Программный поиск в интернете.

Сообщение FireFenix » 05.02.2011 (Сб) 16:30

Сокет1 : Клиент <-> Прокси
Сокет2 : Прокси <-> Сервер

Сокет1 <-> Сокет2 (+модификация заголовков если надо)

Dakovalev1 писал(а):кстати здесь %20 - пробел?

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

Dakovalev1
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 23.02.2010 (Вт) 14:16

Re: Программный поиск в интернете.

Сообщение Dakovalev1 » 05.02.2011 (Сб) 17:05

Клёво. Если ещё будут вопросы, напишу.

Dakovalev1
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 23.02.2010 (Вт) 14:16

Re: Программный поиск в интернете.

Сообщение Dakovalev1 » 05.02.2011 (Сб) 17:44

возникла проблема.
Код:
Код: Выделить всё
TcpListener^ proxy = gcnew TcpListener(8888);
   proxy->Start();
   Socket^ s = proxy->AcceptSocket();
   
   array<Byte>^ buf = gcnew array<Byte>(1024);
   int bytes = s->Receive(buf,1024,(SocketFlags)0);
   String^ str= Encoding::ASCII->GetString(buf);
   proxy->Stop();
   Console::WriteLine(str);
   String^ url = "";
   int n1 = str->IndexOf(L" "),n2 = str->IndexOf(L" ",n1+1);
   url = str->Substring(n1+1,n2-n1-1);
   HttpWebRequest^req = (HttpWebRequest^)HttpWebRequest::Create(url);
   HttpWebResponse^res = (HttpWebResponse^)req->GetResponse();//ошибка здесь не получается подключиться к серверу
   Stream ^stream = res->GetResponseStream();
   bytes = stream->Read(buf,0,32);
   int bytessent = 0;
   StringBuilder^sb = gcnew StringBuilder("");
   while(bytes!=0)
   {
      sb->Append(Encoding::ASCII->GetString(buf,0,bytes));
      s->Send(buf,bytes,(SocketFlags)0);
      bytessent+=bytes;
      bytes = stream->Read(buf,0,32);

   }


Это потому, что в настройках подключения я заставляю использовать прокси-сервер.
Но когда я получаю от браузера запрос, перенаправить его дальше в интернет не могу, потому, что подключение всё ещё настроено на прокси. И что получается замкнутый круг?
Как это исправить?

З.Ы. Зырел, как работает fiddler.
Он в исключениях для прокси задаёт какой-то <-loopback>.
Ума не приложу как это использовать.

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

Re: Программный поиск в интернете.

Сообщение FireFenix » 05.02.2011 (Сб) 21:44

Dakovalev1 писал(а):Но когда я получаю от браузера запрос, перенаправить его дальше в интернет не могу, потому, что подключение всё ещё настроено на прокси. И что получается замкнутый круг?
Как это исправить?

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

Dakovalev1
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 23.02.2010 (Вт) 14:16

Re: Программный поиск в интернете.

Сообщение Dakovalev1 » 05.02.2011 (Сб) 22:24

Дошло.
Код: Выделить всё
TcpListener^ proxy = gcnew TcpListener(8888);
   proxy->Start();
   Socket^ inet;
   Socket^ s;
   while(true)
   {
   
   s = proxy->AcceptSocket();
   
   array<Byte>^ buf = gcnew array<Byte>(1024);
   int bytes = s->Receive(buf,1024,(SocketFlags)0);
   String^ str= Encoding::GetEncoding(1251)->GetString(buf);
   
   Console::WriteLine(str);

   String^ url = "";
   int n1 = str->IndexOf(L" "),n2 = str->IndexOf(L" ",n1+1);
   url = str->Substring(n1+1,n2-n1-1);
   IPHostEntry^ host=Dns::GetHostByName(L"www.google.ru");
   IPEndPoint^endpoint = gcnew IPEndPoint(host->AddressList[0],80);
   inet = gcnew Socket(AddressFamily::InterNetwork,SocketType::Stream,ProtocolType::Tcp);
   inet->Connect(endpoint);
   inet->Send(buf);

   inet->Receive(buf);

   while(true)
   {
      try
      {
      str= Encoding::GetEncoding(1251)->GetString(buf);
      s->Send(buf);
      inet->Receive(buf);
      }
      catch(SocketException^ ex)
      {
         break;
      }
      //Console::WriteLine(str);
   }
   
   
   
   Console::WriteLine("1");
   
   
   }
   inet->Shutdown(SocketShutdown::Both);
   inet->Close();


Осталось распарсить до конца запрос и вместо L"www.google.ru"нормальный адрес.

Dakovalev1
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 23.02.2010 (Вт) 14:16

Re: Программный поиск в интернете.

Сообщение Dakovalev1 » 05.02.2011 (Сб) 22:37

нет всё равно не работает.
Но я кажется заню почему.
Щас проверю.

Dakovalev1
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 23.02.2010 (Вт) 14:16

Re: Программный поиск в интернете.

Сообщение Dakovalev1 » 05.02.2011 (Сб) 23:41

В общем не знаю. Ничего не получается.
Создал два сокета, как ты сказал.
1-й:
Код: Выделить всё
IPHostEntry^ host=Dns::GetHostByName(L"www.google.ru");
   IPEndPoint^endpoint = gcnew IPEndPoint(host->AddressList[0],80);
   inet = gcnew Socket(AddressFamily::InterNetwork,SocketType::Stream,ProtocolType::Tcp);


2-й от tcplistener`а.

А как правильно их связать?


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

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

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

    TopList