当从代码进行Web浏览时,如何将信息发送到<;input.*type=“;提交”>;并检索得到的链接

本文关键字:提交 type input gt 链接 检索 lt 浏览 Web 代码 信息 | 更新日期: 2023-09-27 18:20:51

类似的线程可能是:

如何使用.Net以编程方式将信息发送到C#中的web服务
使用链接提交表单时保持按钮提交值
查看如何使用输入类型=提交表单发送多个值
当输入名称为"提交"时,如何使用Javascript发送表单
如何使用带有<输入type="button">

以上这些似乎几乎都回答了这个问题。。。但我完全感到困惑。我认为类似于"Net.Post(something)"的东西是如何完成的。。。但我不确定。

我目前正在使用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

我知道如何获取搜索框字符串之类的。。。问题是,当我去谷歌网站,像抓取链接一样抓取搜索栏,用我的搜索字符串更新值字段时,我如何将更新后的搜索栏提交到谷歌的服务器?

其次,如果我想更新它,然后模拟鼠标点击,我该怎么做?

换句话说,我想像用户与网站互动一样与网站互动。

当从代码进行Web浏览时,如何将信息发送到<;input.*type=“;提交”>;并检索得到的链接

本质上有两个选项-一些网页使用HTTPGET接受数据(这意味着数据作为URL的一部分发送),另一些则使用HTTPPOST(这意味着您的数据作为请求的主体发送)。

如果您使用的是Google,那么您可以使用HTTPGET并将查询字符串放入URL中。例如,您只需下载具有以下URL的网页:https://www.google.com/search?q=hello.因此,您所需要做的就是生成如下URL:

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

如果你想从F#发送HTTPPOST请求,那么你需要创建一个包含编码表单中表单值的请求体

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()

此外,每一步都使用typemember有点奇怪。每次访问成员时都会重新执行它们,所以您编写的代码是非常不确定的。您应该使用let绑定。