you have to parse the html, one way or the otherif these buttons trigger javascript, you need to see what url is being opened, and what parameters are being passed and do a HttpWebRequestsimilarly, if these buttons trigger a form submission, you need to compose the data from the elements in the form with a format like "name1=value1&name2=value2" and do a POST with HttpWebRequest

解决方案 »

  1.   

    我写了一个这样的类。可以用get 或者 post 提交,或者获取值都行。 
    using System;
    using System.Net;
    using System.Text;
    using System.IO;
    using System.Web;
    using System.Text.RegularExpressions;namespace SiteThief
    {
    /// <summary>
    /// 窃取站点信息
    /// </summary>
    public class FilchSiteInfo
    {
    private string backHtml; /// <summary>
    /// 获取返回的html字串
    /// </summary>
    public string BackHtml
    {
    get{ return backHtml; }
    } /// <summary>
    /// 类的构造函数
    /// </summary>
    /// <param name="siteUrl">将要获取的站点URL路径</param>
    /// <param name="submitParams">提交参数字串集</param>
    /// <param name="isPost">表单是否为Post方式提交</param>
    public FilchSiteInfo(string siteUrl, string submitParams, bool isPost)
    {
    HttpWebRequest hwr;
    Encoding  enc = Encoding.GetEncoding("gb2312");
    // 模拟Post表单
    if (isPost == true)
    {
    hwr = (HttpWebRequest)WebRequest.Create(siteUrl); hwr.UserAgent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
    byte[] postByte = Encoding.Default.GetBytes(submitParams);
    hwr.Method = "POST";
    hwr.ContentLength = postByte.Length; hwr.ContentType = "application/x-www-form-urlencoded"; StreamWriter oStreamWriter= new StreamWriter(hwr.GetRequestStream(), enc);
    oStreamWriter.Write(submitParams);
    oStreamWriter.Close();
    }
    else
    {
    // 模拟Get表单
    submitParams = Regex.Replace(submitParams, @"[\u4e00-\u9fa5]|(|—|)", new MatchEvaluator(MatchEval));

    hwr = (HttpWebRequest)WebRequest.Create(siteUrl +"?" + submitParams);

    hwr.UserAgent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
    } HttpWebResponse oResponse  = (HttpWebResponse)hwr.GetResponse(); StreamReader sr = new StreamReader(oResponse.GetResponseStream(), enc);
    backHtml = sr.ReadToEnd();
    } /// <summary>
    /// 根据首尾匹配捕捉返回的需要的Html字串
    /// </summary>
    /// <param name="start">首字串</param>
    /// <param name="end">尾字串</param>
    public void CutBackHtml(string start, string end)
    {
    int startIndex = backHtml.IndexOf(start); // 首字串的首位置
    int endIndex = backHtml.IndexOf(end) + end.Length -1;// 获取尾字串的末位置            backHtml = backHtml.Substring(startIndex, endIndex - startIndex + 1);
    } /// <summary>
    /// 在返回的Html字串中替换
    /// </summary>
    /// <param name="oldString">要替换的字符</param>
    /// <param name="newString">替换为新字符</param>
    public void ReplaceBackHtml (string oldString, string newString)
    {
    backHtml = backHtml.Replace(oldString, newString);
    } /// <summary>
    /// 将正则表达式匹配项替换为UrlEncode编码
    /// </summary>
    private static string MatchEval(Match m)
    {
    return HttpUtility.UrlEncode(m.Value,System.Text.Encoding.GetEncoding("GB2312"));
    }
    }
    }
      

  2.   

    调用类:第一步:获取htm信息,并提交信息到 DetailInfo.aspx(DetailInfo.aspx为自建的一个响应按钮转向的页面。)
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.IO;
    using SiteThief;namespace TrainQuery
    {
    /// <summary>
    /// TrainQuery 的摘要说明。
    /// </summary>
    public class TrainQuery : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.TextBox Train_Start;
    protected System.Web.UI.WebControls.TextBox Train_End;
    protected System.Web.UI.WebControls.Button Button1;

    public static string MatchEval(Match m)
    {
    return HttpUtility.UrlEncode(m.Value,System.Text.Encoding.GetEncoding("GB2312"));
    } private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面 // 当页面提交时
    if (IsPostBack)
    {
    FilchSiteInfo fsi = new FilchSiteInfo("http://train.hepost.com/mudidi.asp", "Train_Start=" + Train_Start.Text + "&Train_End=" + Train_End.Text, true);
    fsi.CutBackHtml("<table width=\"100%\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\" style=\"border-collapse: collapse\" bordercolor=\"#111111\">", "</table>");
    fsi.ReplaceBackHtml("xiangxi.asp", "DetailInfo.aspx");
    Response.Write(fsi.BackHtml);
    }
    }
    #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion
    }
    }
      

  3.   

    第二部,建立第二次提交响应页:
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Text.RegularExpressions;
    using SiteThief;namespace TrainQuery
    {
    /// <summary>
    /// DetailInfo 的摘要说明。
    /// </summary>
    public class DetailInfo : System.Web.UI.Page
    {
    private void Page_Load(object sender, System.EventArgs e)
    {
    string parameters = Request.QueryString.ToString();

    parameters = HttpUtility.UrlDecode(parameters, System.Text.Encoding.GetEncoding("GB2312"));
                FilchSiteInfo fsi = new FilchSiteInfo("http://train.hepost.com/xiangxi.asp", parameters, false);
    Response.Write(fsi.BackHtml);
    } #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion
    }
    }
      

  4.   

    第二步的页名应该是 DetailInfo.aspx 也就是在第一步里的那个我自定义的转向fsi.ReplaceBackHtml("xiangxi.asp", "DetailInfo.aspx");,xiangxi.asp是被捕获网站的地址,转向为DetailInfo.aspx。还有,就是如果这个问题解决了,分必须全部给思归大哥,这个问题思归都给我讲过两次了。
      

  5.   

    非常感谢各位的热情和详细的解答!
    我测试过,是这样的思路.
    按钮也都有对应的事件指向一个链接,并有参数.但我具体实现时还有一个问题:
    网站是需要登录后使用的,这个页面(且叫BASE.PHP)我通过以上方法可以登录并取得了信息.
    但这个页面上的按钮的链接,我直接粘到地址栏上后返回"对不起!你无权查看客户信息"这样的信息.用以上所述同样的方法用程序读取,也返回"对不起!你无权查看客户信息"
    这个权限我想也肯定是通过请求发过去的,但链接参数上是没有的.Request.CookieContainer 我也同样用查BASE.PHP页面的对象赋予了.当然直接手工在BASE.PHP页面上点击按钮是会出来关于客户信息的小窗口的.烦请再帮忙!特谢!!!
      

  6.   

    当然直接手工在BASE.PHP页面上点击按钮是会出来关于客户信息的小窗口的. // 你把cookies禁用了会弹出吗?
      

  7.   

    谢谢gasover(无尽) 的热心帮助!!
    不好意思,上面"我直接粘到地址栏上后返回"对不起!你无权查看客户信息"这样的信息"是我测试时没仔细看,contact.php?user=6824694&amp;uid=972091704去掉中间的amp;就可以了.谢谢!!!