我正在编写自己的特定产品抓取工具。现在有一个产品销售网站,它使用页面的帖子数据。我真的需要能够发布数据并阅读响应。但是他们正在使用asp.net验证,它是如此混乱。我真的无法弄清楚如何正确发布数据和阅读。我正在使用htmlagilitypack。如果可以使用htmlagilitypack发布数据并阅读响应,那真的非常棒。
现在这是示例页面:http://www.hizlial.com/HizliListele.aspx?CatID=482643
当您打开页面时,请查看“urun_listele”类
你会看到那里的选项
20 Ürün Listele
40 Ürün Listele
60 Ürün Listele
Tümünü Listele
这些数字是要显示的产品数量。 Tümünü应用程序表示列出所有产品。现在我真的需要发布数据并获得该产品类别下的所有产品。我使用firebug进行调试并尝试在下面进行编码,但我仍然有默认的产品数量
private void button11_Click(object sender, RoutedEventArgs e)
{
StringBuilder srBuilder = new StringBuilder();
AppendPostParameter(srBuilder, "ctl00$ContentPlaceHolder1$cmbUrunSayi", "full");
srBuilder = srBuilder.Replace("&", "", srBuilder.Length - 1, 1);
byte[] byteArray = Encoding.UTF8.GetBytes(srBuilder.ToString());
HttpWebRequest hWebReq = (HttpWebRequest)WebRequest.Create("http://www.hizlial.com/HizliListele.aspx?CatID=482643");
hWebReq.Method = "POST";
hWebReq.ContentType = "application/x-www-form-urlencoded";
using (Stream requestStream = hWebReq.GetRequestStream())
{
requestStream.Write(byteArray, 0, byteArray.Length);
}
HtmlDocument hd = new HtmlDocument();
using (HttpWebResponse response = (HttpWebResponse)hWebReq.GetResponse())
{
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
var htmlstring = sr.ReadToEnd();
}
}
}
static private void AppendPostParameter(StringBuilder sb, string name, string value)
{
sb.AppendFormat("{0}={1}&", name, HttpUtility.UrlEncode(value));
}
获取数据后,我将其加载到htmlagilitypack HtmlDocument
感谢任何帮助。
C#4.0,wpf application,htmlagiltiypack
答案 0 :(得分:1)
ASP .Net使用__EVENTTARGET
和__EVENTARGUMENT
字段来模拟Windows窗体行为。要在服务器上模拟组合框的更改事件,您需要附加到表单字段以请求它们__EVENTTARGET
为'ctl00 $ ContentPlaceHolder1 $ cmbUrunSayi'和__EVENTARGUMENT
为''。
如果你看一下combo和__doPostBack方法的更改代码,你会明白我的意思。您可以在声明srBuilder之后插入以下代码。这样代码就可以了。
AppendPostParameter(srBuilder, "__EVENTTARGET", "ctl00$ContentPlaceHolder1$cmbUrunSayi");
AppendPostParameter(srBuilder, "__EVENTARGUMENT", string.Empty);
您还需要提取__VIEWSTATE& __EVENTVALIDATION值。为了让他们只是发送一个虚拟请求,并从该请求中提取该值和cookie,然后将它们添加到新请求中...