WebClient 中的 C# 背靠背请求



我正在做一个项目,该项目在网上抓取了一个工作表。我尝试使用 C# WebClient 库连接到的网站不起作用,因为我需要先连接到网站,然后模拟单击"下一步"按钮以转到表中的下一页。

我现在使用的代码看起来像这样,

这是为了连接到网站,同时查找一个名称:

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);
}

在我这样做之后,html结果为空。

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

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

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

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

BloggingContext可以通过在 您的整个解决方案。

在谷歌搜索了一些之后,我找到了答案,发现我的第一个方法真的不对劲。

我下载并安装了小提琴手,这样我就可以查看我的确切网络流量,并让我了解如何设置我的请求方法。

我如何使用小提琴手:

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

开始,我从使用WebClient切换到HttpClient

,并结合了KeyValuePairs

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

基本代码如下所示。


步骤1(进行初始连接

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;

步骤2(使用与 HttpClient 相同的意图,创建一个类似于第一个请求的新请求,但添加用于单击下一步按钮的部分

// 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更改为2

相关内容

  • 没有找到相关文章

最新更新