我正在一个项目,该项目会在网络上刮擦工作表。我尝试使用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为空。
答案 0 :(得分:0)
如果数据库是远程SQL Server数据库,则可以通过选择“数据库中的代码优先”选项将数据库添加到项目中:
然后,当您要查询数据库时,将实例化向导生成的派生DbContext类。
. . .
using (var ctx = new BloggingContext())
{
var members = ctx.Members.Where(x => x.LastName = "Jones");
}
return members;
. . .
可以通过在以下位置搜索“:DbContext”来找到BloggingContext。 您的整个解决方案。
答案 1 :(得分:0)
在进行了谷歌搜索之后,我找到了答案,并发现我的第一种方法确实不可行。
我下载并安装了fiddler,因此我可以看到确切的网络访问量,并了解如何设置请求方法。
我如何使用提琴手:
开始,我从使用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
。