Web客户端中的C#背对背请求

时间:2018-08-09 19:39:21

标签: c# html navigation web connect

我正在一个项目,该项目会在网络上刮擦工作表。我尝试使用C#WebClient libray连接的网站无法正常工作,因为我需要先连接到该网站,然后模拟单击“下一步”按钮以转到表的下一页。

我现在正在使用的代码如下:

这是在查找名称的同时连接到网站:

    string urlParams = "lastName=John&firstName=Doe&PropertyID=&Submit=Serch+Properties"
    using(WebClient client = new WebClient())
    {
        client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
        htmlResult = client.UploadString(url, urlParams);
    }

然后,一旦我进行了初始搜索,我就会查看是否可以使用HtmlAglityPack单击下一步。如果可以的话,我尝试通过在url中发送参数。

    HtmlDocument doc = new 
    doc.LoadHtml(htmlResult);

    // I get the xpath from google chrome dev tools, inspect element and right click copy xpath
    HtmlNode nextButton = doc.DocumentNode.SelectNode(selectNodeXPath);
    if(nextButton && nextButton.InnerHtml == "Next")
    {
        // right now just trying to see the second page.
        urlParams = "lastName=John&firstName=Doe&PropertyID=&Submit=Serch+Properties&SearchLocation=" + 1;
        client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
        htmlResult = client.UploadString(url, urlParams);
    }

执行完此操作后,htmlResult为空。

2 个答案:

答案 0 :(得分:0)

如果数据库是远程SQL Server数据库,则可以通过选择“数据库中的代码优先”选项将数据库添加到项目中:

  1. 项目->添加新项目…
  2. 从左侧菜单中选择数据,然后选择ADO.NET实体数据模型
  3. 输入BloggingContext作为名称,然后单击“确定”
  4. 这将启动“实体数据模型向导”
  5. 首先从数据库中选择“代码”,然后单击“下一步”
  6. 输入数据库连接详细信息并完成...

然后,当您要查询数据库时,将实例化向导生成的派生DbContext类。

. . .
using (var ctx = new BloggingContext()) 
{
    var members = ctx.Members.Where(x => x.LastName = "Jones");
}
return members;
. . . 
  

可以通过在以下位置搜索“:DbContext”来找到BloggingContext。   您的整个解决方案。

答案 1 :(得分:0)

在进行了谷歌搜索之后,我找到了答案,并发现我的第一种方法确实不可行。

我下载并安装了fiddler,因此我可以看到确切的网络访问量,并了解如何设置请求方法。

我如何使用提琴手:

  1. 连接到网站,输入搜索内容(在我的名字和姓氏字段中)
  2. 命中搜索
  3. 查看小提琴手为我记录的Web流量,看看调用了哪些参数以及要复制哪个参数。
  4. 单击下一步按钮
  5. 重复步骤3。

开始,我从使用WebClient到结合HttpClient的{​​{1}}切换。

代码基本上是两个步骤。进行初始连接,并根据搜索结果为每个页面提供一个新的键值对。

基本代码如下。


步骤1)进行初始连接

KeyValuePairs

第2步)使用与HttpClient相同的实例,创建一个与第一个请求相似的新请求,但添加用于单击下一步按钮的部分

HttpClientHandler httpClientHandler = new HttpClientHandler();
HttpClient client = new HttpClient();

//Manulally contruct the request header
var stringContent = new FormUrlEncodedContent(new[]
{
    new KeyValuePair<string, string>("hJava", "Y"),
    new KeyValuePair<string, string>("SearchFirstName", firstName),
    new KeyValuePair<string, string>("SearchLastName", lastName),
    new KeyValuePair<string, string>("HomeState", state),
    new KeyValuePair<string, string>("frontpage", "1"),
    new KeyValuePair<string, string>("GO.x", "0"),
    new KeyValuePair<string, string>("GO.y", "0"),
    new KeyValuePair<string, string>("GO", "Go")
});

var response = client.PostAsync(url, stringContent).Result;
var initialSearch = response.Content.ReadAsStringAsync().Result;

就是这样。您可以对搜索结果的所有页面执行此操作。只需更改// New request header to filter our initial search results var stringContent = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("hJava", "Y"), new KeyValuePair<string, string>("searchLocation", "1"), new KeyValuePair<string, string>("SearchFirstName", firstName), new KeyValuePair<string, string>("SearchLastName", lastName), new KeyValuePair<string, string>("SearchStateID", state), new KeyValuePair<string, string>("GO.x", "0"), new KeyValuePair<string, string>("GO.y", "0"), new KeyValuePair<string, string>("GO", "Go") }); var response = client.PostAsync(url, stringContent).Result; var nextSearch = response.Content.ReadAsStringAsync().Result; ,在此示例中,我将new KeyValuePair<string, string>("searchLocation", "1")更改为1