Парсинг сайта с запросом POST

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

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

Maxim-V
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 30.04.2012 (Пн) 12:45

Парсинг сайта с запросом POST

Сообщение Maxim-V » 06.05.2012 (Вс) 15:29

Пробую настроить парсинг HTML с предварительным запросом POST, но зашел в окончательный тупик.
Парсить сайт через GET получается и вроде ничего сложного, но от такого парсинга толку ноль, т.к. нужные данные еще не сформированы.

В общем, есть сайт: http://www.ahunter.ru/
На главной странице в верхней форме пишу текст, например: санкт-петербург, невский, д.1
Нажимаю кнопку "найти", после чего слева появляется фиолетовый блок с результатом - индекс по данному адресу.
Вот этот индекс я и хочу спарсить, предварительно отправив запрос с нужным адресом.

Код, который я смог написать своими силами:
Код: Выделить всё

        Dim myHttpWebRequest As HttpWebRequest = HttpWebRequest.Create("http://www.ahunter.ru/site/search")
        Dim sCookies As String
        myHttpWebRequest.Method = "POST"
        myHttpWebRequest.Host = "www.ahunter.ru"
        myHttpWebRequest.Referer = "http://www.ahunter.ru/site/search"
        myHttpWebRequest.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0"
        myHttpWebRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        myHttpWebRequest.Headers.Add("Accept-Language", "ru")
        myHttpWebRequest.ContentType = "application/x-www-form-urlencoded"

        Dim sQueryString As String = "text_to_process=%F1%E0%ED%EA%F2-%EF%E5%F2%E5%F0%E1%F3%F0%E3%2C+%F1%E2%E5%F2%EB%E0%ED%EE%E2%F1%EA%E8%E9+%EF%F0.+%E4+72"
        Dim ByteArr As Byte() = System.Text.Encoding.GetEncoding(1251).GetBytes(sQueryString)
        myHttpWebRequest.ContentLength = ByteArr.Length()
        myHttpWebRequest.GetRequestStream().Write(ByteArr, 0, ByteArr.Length)

        Dim myHttpWebResponse As HttpWebResponse = myHttpWebRequest.GetResponse()
        myHttpWebResponse = myHttpWebRequest.GetResponse()

        If Not String.IsNullOrEmpty(myHttpWebResponse.Headers("Set-Cookie")) Then
            sCookies = myHttpWebResponse.Headers("Set-Cookie")
        End If

        myHttpWebRequest = HttpWebRequest.Create("http://www.ahunter.ru/site/search")

        myHttpWebRequest.Method = "GET"
        myHttpWebRequest.Headers.Add(HttpRequestHeader.Cookie, sCookies)
        myHttpWebRequest.Host = "www.ahunter.ru"
        myHttpWebRequest.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0"
        myHttpWebRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        myHttpWebRequest.Headers.Add("Accept-Language", "ru")

        myHttpWebRequest.AllowAutoRedirect = False     'отключаем редирект

        myHttpWebResponse = myHttpWebRequest.GetResponse()

        Dim myStreamReader As New StreamReader(myHttpWebResponse.GetResponseStream, Encoding.GetEncoding(1251))

        Dim HtmlWeb = New HtmlDocument()
        HtmlWeb.Load(myStreamReader)

        Dim MainText = HtmlWeb.DocumentNode.SelectNodes("//div")

        For Each i In MainText
        Dim текст As String = i.InnerText
            RichTextBox1.AppendText(текст & vbCrLf)
        Next i

        myHttpWebResponse.Close()       'закрываем соединение
        MainText = Nothing
        HtmlWeb = Nothing



Помогите, пожалуйста, доделать код.

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

Re: Парсинг сайта с запросом POST

Сообщение FireFenix » 06.05.2012 (Вс) 18:20

Maxim-V писал(а):Пробую настроить парсинг HTML с предварительным запросом POST, но зашел в окончательный тупик.
Парсить сайт через GET получается и вроде ничего сложного, но от такого парсинга толку ноль, т.к. нужные данные еще не сформированы.

Изображение

Разберись в понятиях...
Парсинг - разбор текста на требуемые блоки для дальнейшего анализа или работы с ними
POST/GET - вид HTTP запроса к сайту
Так же по всем понятиям можно погуглить или сходить на википедию

Работа с сайтом происходит в следующих этапах
1) HTTP запрос (POP или GET) к сайту. Если требуется, то формируются куки и заголовки
2) Получение ответа от сайта
3) Парсинг ответа с сайта на нужную информацию
4) Если нужная информация находиться по выделенной ссылке из ответа, то повторяем пункт 1, пока не дойдём до нужной части информации
5) Выводим обработанную информацию на экран или в элементы формы

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

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

Сообщение Qwertiy » 06.05.2012 (Вс) 18:50

Maxim-V, посмотри эту тему. Там много информации и примеров. Но учти, что если у тебя не .NET 4, то работать может неверно. Команда компиляции без VS есть в той теме.
Возможно, текст надо писать по-русски и передавать в UTF-8. Или в GET-запрсе. Что-то слишком странное у тебя там.

Maxim-V
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 30.04.2012 (Пн) 12:45

Re: Парсинг сайта с запросом POST

Сообщение Maxim-V » 07.05.2012 (Пн) 20:43

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

Код: Выделить всё
    Dim logincookie As CookieContainer
    Dim Адрес As String = "санкт-петербург, невский пр, д.1"
    Dim URL_Сайта As String = "http://www.ahunter.ru/site/search"

        ServicePointManager.Expect100Continue = False

        Dim postData As String = "text_to_process=" & Адрес
        Dim tempCookies As New CookieContainer
        Dim byteData As Byte() = System.Text.Encoding.GetEncoding(1251).GetBytes(postData)

        Dim postReq As HttpWebRequest = DirectCast(WebRequest.Create(URL_Сайта), HttpWebRequest)

        postReq.Method = "POST"
        postReq.Host = "www.ahunter.ru"
        postReq.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0"
        postReq.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        postReq.Headers.Add("Accept-Language", "ru")
        postReq.Referer = URL_Сайта
        postReq.ContentType = "application/x-www-form-urlencoded"
        postReq.ContentLength = byteData.Length
        postReq.CookieContainer = tempCookies

        Dim postreqstream As Stream = postReq.GetRequestStream()
        postreqstream.Write(byteData, 0, byteData.Length)
        postreqstream.Close()

        Dim postresponse As HttpWebResponse = DirectCast(postReq.GetResponse(), HttpWebResponse)
        tempCookies.Add(postresponse.Cookies)
        logincookie = tempCookies

        Dim postreqreader As New StreamReader(postresponse.GetResponseStream, Encoding.GetEncoding(1251))

        Dim HtmlWeb = New HtmlDocument()
        HtmlWeb.Load(postreqreader)

        Dim MainText = HtmlWeb.DocumentNode.SelectNodes("//td[@title='Zip']")
        For Each i In MainText
            RichTextBox1.AppendText("Индекс: " & i.InnerText & vbCrLf)
        Next i

        MainText = Nothing
        HtmlWeb = Nothing
        postresponse.Close()


Довольно-таки долго пришлось воевать с ошибкой 417 Expectation Failed (по каким-то причинам сервер не может удовлетворить значению поля Expect заголовка запроса). Если кто столкнется, то решение - строка: ServicePointManager.Expect100Continue = False

При частом запросе к сайту, блокируется IP. Лично мне это не критично, т.к. программа для разовых (не массовых запросов). Кому надо, думаю, список прокси прикрутить уже не проблема.

Всем спасибо за подсказки.


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

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

Сейчас этот форум просматривают: Google-бот и гости: 95

    TopList  
cron