2013-07-17 130 views
0

我试图让我需要从抓取数据的Web服务的价值需要指导。问题是,我需要得到数据的部位,是在具有分页中有一个ASP GridView的..所以我需要的是,阅读HTML,做一回发到网页 - 所以它会给我gridview的下一页,然后得到我可以解析并获取我需要的数据的新html代码(响应)...创建一个POST请求并取回

我尝试了很多方法来解决这个问题,但是我没有成功。那么你能告诉我我在哪里做错了什么?

代码:

[WebMethod] 
    public string eNabavki2() 
    { 
     WebClient client = new WebClient(); 
     client.Encoding = Encoding.UTF8; 
     string htmlCode = client.DownloadString("https://site.com/Default.aspx"); 
     string vsk = getBetween(htmlCode, "id=\"__VIEWSTATEKEY\" value=\"", "\" />"); 

     WebRequest request = WebRequest.Create("https://site.com/Default.aspx"); 

     request.ContentType = "application/x-www-form-urlencoded"; 
     request.Method = "POST"; 

     var webRequest = (HttpWebRequest)request; 
     webRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0"; //Googlebot/2.1 (+http://www.googlebot.com/bot.html) 
     //set form data 
     string postData = string.Format("__EVENTTARGET={0}" + 
      "&__EVENTARGUMENT={1}" + 
      "&__LASTFOCUS={2}"+ 
      "&__VIEWSTATEKEY={3}"+ 
      "&__VIEWSTATE={4}"+ 
      "&__SCROLLPOSITIONX={5}"+ 
      "&__SCROLLPOSITIONY={6}"+ 
      "&ctl00$ctl00$cphGlobal$cphPublicAccess$publicCFTenders$dgPublicCallForTender$ctl13$ddlPageSelector={7}", 
     System.Web.HttpUtility.UrlEncode("ctl00$ctl00$cphGlobal$cphPublicAccess$publicCFTenders$dgPublicCallForTender$ctl13$ddlPageSelector"), 
      /*1*/string.Empty, 
      /*2*/string.Empty, 
      /*3*/string.Empty,//vsk 
      /*4*/string.Empty, 
      /*5*/"0", 
      /*6*/"383", 
      /*7*/"2"); 
     byte[] byteArray = Encoding.UTF8.GetBytes(postData); 

     //send the form data to the request stream 
     request.ContentLength = byteArray.Length; 
     Stream dataStream = request.GetRequestStream(); 
     dataStream.Write(byteArray, 0, byteArray.Length); 
     dataStream.Close(); 

     var response = request.GetResponse(); 

     // Get the stream containing content returned by the server. 
     dataStream = response.GetResponseStream(); 

     StreamReader reader = new StreamReader(dataStream); 
     string responseFromServer = reader.ReadToEnd(); 

     // Clean up the streams. 
     reader.Close(); 
     dataStream.Close(); 
     response.Close(); 

     return responseFromServer; 
    } 

好了,几件事情,在POSTDATA字符串包含我的每一件事情我能找到的是发在页面上。我为此使用了Fidler,以及它给我的所有(26)参数。一个我真正需要的是pageSelector(改变他的价值)

而且我注意到有HTML代码,从而获得不同的值,每次一个__VIEWSTATEKEY。你可以看到我首先尝试从html(vsk字符串)获取该值,但这并没有改变任何东西。

对不起,但我不熟悉这篇文章/请求的东西。但我需要它为大学的一个项目,所以请如果有人可以帮助我解决这个....

编辑: 这里是什么菲德勒是给我的一个标题PRT SCR: enter image description here

回答

0

是否有通过你发布到网站上,预计相关的cookie?检查Fiddler以查看当您手动使用网站时是否有任何Cookie连接到POST。

如果是这样,你需要的是在接收到cookie时发出GET请求,并将其连接到第二POST请求。有关如何使用WebClient完成此操作的信息,请参阅Using CookieContainer with WebClient class

+0

感谢您的回复。是的,我编辑的问题,如果你能看到... – 4448932

+0

@Ajvio编辑与SO链接到答案。 –

+0

谢谢主席先生了很多,你不知道你有多少帮助我:) – 4448932