Когда вы просматриваете веб-страницы из кода, как вы отправляете информацию на <input. * Type = "Submit"> и получаете получившуюся ссылку? - PullRequest
1 голос
/ 20 января 2012

Подобные темы могут быть:

Как программно отправить информацию в веб-службу на C # с помощью .Net?
Сохранить значение кнопки отправки при использовании ссылки для отправки формы
Посмотрите, как отправить несколько значений с типом ввода = отправить форму
Как отправить форму с Javascript, если имя ввода «отправить»?
"> Как отправить форму с помощью javascript с помощью

... Все вышеперечисленное, кажется, почти отвечает на вопрос ... но я полностью озадачен. Я думаю, что-то вроде "Net.Post (что-то)", как это делается ... но я не уверен.

В настоящее время я использую F # и выяснил, как анализировать ссылки. Я также выяснил, как перехватывать различные строки поиска и кнопки отправки с помощью регулярных выражений.
Я хотел бы использовать свой код для поиска чего-либо в поисковой системе, в частности:

Первый , получение HTML

Второй , Очистка HTML для различных кнопок, текстовых панелей и ссылок

Третий , используйте какой-нибудь неизвестный метод / устройство / инструмент / функцию, чтобы отправить цепочку поиска в текстовое поле ...

Четвертый , имитировать фактический щелчок мыши по кнопке отправки, которая появляется на веб-сайте ...

...

Затем, получив ответ сервера, извлеките HTML-код со следующего сайта.
Вот мой код ссылки в таком виде:

    type Url(x:string)=  
     member this.Tostring  = sprintf "%A" x
     member this.Request   = System.Net.WebRequest.Create(x)
     member this.Response  = this.Request.GetResponse()
     member this.Stream    = this.Response.GetResponseStream()
     member this.Reader    = new System.IO.StreamReader(this.Stream)
     member this.Html      = this.Reader.ReadToEnd()   
    let linkex                = "href=\s*\"[^\"h]*(http://[^&\"]*)\"" 

    let getLinks (txt:string) = [for m in Regex.Matches(txt,linkex)  
                                  -> m.Groups.Item(1).Value        ] 

    let collectLinks (url:Url) =   url.html 
                                |> getLinks

... Я знаю, как получить строки окна поиска и еще много чего ... вопрос в том, когда я, например, захожу на google.com и получаю панель поиска точно так же, как я получаю ссылки, обновляю значение в поле с моей строкой поиска, как мне затем отправить обновленную строку поиска на сервер Google?

Во-вторых, как мне это сделать, если я хочу обновить его, а затем симулировать щелчок мышью?

Другими словами, я хочу взаимодействовать с веб-сайтами так, как пользователь взаимодействует с веб-сайтами.

1 Ответ

1 голос
/ 20 января 2012

По сути, есть два варианта: некоторые веб-страницы принимают данные с использованием HTTP GET (что означает, что данные отправляются как часть URL), а другие используют HTTP POST (что означает, что данные отправляются как тело запроса).).

Если вы используете, например, Google, то вы можете использовать HTTP GET и поместить строку запроса в URL.Например, вы можете просто загрузить веб-страницу со следующим URL: https://www.google.com/search?q=hello. Итак, все, что вам нужно сделать, это сгенерировать URL следующим образом:

let search = sprintf "http://www.google.com/search?q=%s"

Если вы хотите отправить HTTP POST запрос от F #, затем вам нужно создать запрос с телом, которое содержит значения формы в закодированной форме.Это можно записать следующим образом:

open System.Text
open System.IO
open System.Net

// URL of a simple page that takes two HTTP POST parameters. See the
// form that submits there: http://www.snee.com/xml/crud/posttest.html
let url = "http://www.snee.com/xml/crud/posttest.cgi"

// Create & configure HTTP web request
let req = HttpWebRequest.Create(url) :?> HttpWebRequest 
req.ProtocolVersion <- HttpVersion.Version10
req.Method <- "POST"

// Encode body with POST data as array of bytes
let postBytes = Encoding.ASCII.GetBytes("fname=Tomas&lname=Petricek")
req.ContentType <- "application/x-www-form-urlencoded";
req.ContentLength <- int64 postBytes.Length
// Write data to the request
let reqStream = req.GetRequestStream() 
reqStream.Write(postBytes, 0, postBytes.Length);
reqStream.Close()

// Obtain response and download the resulting page 
// (The sample contains the first & last name from POST data)
let resp = req.GetResponse() 
let stream = resp.GetResponseStream() 
let reader = new StreamReader(stream) 
let html = reader.ReadToEnd()

Кроме того, использование type с member для каждого шага немного странно.Члены перезапускаются каждый раз, когда вы получаете к ним доступ, поэтому написанный вами код довольно недетерминирован.Вместо этого вы должны использовать привязку let.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...