zoukankan      html  css  js  c++  java
  • 一个网站登录,然后下载网页源代码和文件的代码

    最近有个项目需要从网络上下载网页信息和文件,并且需要登录后才能下载,所以做了个下载的通用类,供大家参考。

    这个是文件下载类:

    using System;
    using System.Net;
    using System.Web;

    public class SRWebClient
    {
    CookieContainer cookie;
    public SRWebClient()
    {
    cookie
    =new CookieContainer();
    }


    /**//// <TgData>
    /// <Alias>下载Web源代码</Alias>
    /// </TgData>

    public string DownloadHtml(string URL)
    {
    HttpWebRequest request
    =HttpWebRequest.create(URL) as HttpWebRequest;
    request.CookieContainer
    =cookie;
    request.AllowAutoRedirect
    =false;

    WebResponse res
    =request.GetResponse();
    string r="";

    System.IO.StreamReader S1 
    = new System.IO.StreamReader(res.GetResponseStream(), System.Text.Encoding.Default );
    try
    {
    = S1.ReadToEnd();
    }

    catch(Exception er)
    {
    Log l
    =new Log();
    l.writelog(
    "下载Web错误",er.ToString());
    }

    finally
    {
    res.Close();
    S1.Close();
    }


    return r;
    }


    /**//// <TgData>
    /// <Alias>下载文件</Alias>
    /// </TgData>

    public long DownloadFile(string FileURL,string FileSavePath)
    {
    long Filelength=0;
    HttpWebRequest req
    =HttpWebRequest.create(FileURL) as HttpWebRequest;

    req.CookieContainer
    =cookie;
    req.AllowAutoRedirect
    =true;

    HttpWebResponse res
    =req.GetResponse() as HttpWebResponse;
    System.IO.Stream stream
    =res.GetResponseStream();
    try
    {
    Filelength
    =res.ContentLength;

    byte [] b=new byte[512];

    int nReadSize=0;
    nReadSize
    =stream.Read(b,0,512);

    System.IO.FileStream fs
    = System.IO.File.create(FileSavePath);
    try
    {
    while(nReadSize >0)
    {
    fs.Write(b,
    0,nReadSize);
    nReadSize
    =stream.Read(b,0,512);
    }

    }

    finally
    {
    fs.Close();
    }

    }

    catch(Exception er)
    {
    Log l
    =new Log();
    l.writelog(
    "下载文件错误",er.ToString());
    }

    finally
    {
    res.Close();
    stream.Close();
    }


    return Filelength;
    }


    /**//// <TgData>
    /// <Alias>提交数据</Alias>
    /// </TgData>

    public void Request(string RequestPageURL,RequestData Data)
    {
    string StrUrl=RequestPageURL;
    HttpWebRequest request
    =HttpWebRequest.create(StrUrl) as HttpWebRequest;
    HttpWebResponse response;

    string postdata=Data.GetData();
    request.Referer
    =RequestPageURL;
    request.AllowAutoRedirect
    =false;
    request.UserAgent 
    = "Mozilla/4.0 (compatible; MSIE 6.01; Windows NT 5.0)";
    request.CookieContainer 
    = cookie;

    Uri u
    =new Uri(StrUrl);

    if (postdata.Length > 0 ) //包含要提交的数据 就使用Post方式
    {
    request.ContentType 
    = "application/x-www-form-urlencoded"//作为表单请求
    request.Method = "POST"//方式就是Post

    //把提交的数据换成字节数组
    Byte [] B = System.Text.Encoding.Default.GetBytes(postdata);
    request.ContentLength 
    = B.Length;

    System.IO.Stream SW 
    = request.GetRequestStream(); //开始提交数据
    SW.Write(B, 0, B.Length);
    SW.Close();
    }


    response 
    = request.GetResponse() as HttpWebResponse;
    response.Close();
    }



    }

    这个是提交的数据类:
    using System.Collections;
    using System.IO;

    public class RequestData
    {
    ArrayList arr
    =new ArrayList();
    public RequestData()
    {

    }


    public string GetData()
    {
    string r="";

    for(int i=0;i<arr.Count;i++)
    {
    data d
    =(data)arr[i];
    if(r.Length>0)r+="&";
    r
    +=d.Field+"="+d.Value;
    }

    return r;
    }


    public void AddField(string Field,string Value)
    {
    data a
    =new data();
    a.Field
    =Field;
    a.Value
    =Value;

    arr.Add(a);
    }


    struct data
    {
    public string Field,Value;
    }



    }

    代码贴完了,下面是测试代码,因为有些数据涉及到客户的资料,故隐去
    using NUnit.Framework;

    [TestFixture]
    public class TestWeb
    {
    [Test]
    public void testDownSEOrder()
    {
    RequestData data
    =new RequestData();
    data.AddField(
    "name","abc");
    data.AddField(
    "password","121"); 

    SRWebClient web
    =new SRWebClient();
    web.Request(
    "http://127.0.0.1/login.asp",data);

    string s=web.DownloadHtml("http://127.0.0.1/dingdan.asp");
    System.Console.WriteLine(s);
    }

    [Test]
    public void testDownFile()
    {
    RequestData data
    =new RequestData();
    data.AddField(
    "name","aaa");
    data.AddField(
    "password","bbb"); 

    SRWebClient web
    =new SRWebClient();
    web.Request(
    "http://127.0.0.1/login.asp",data);

    web.DownloadFile(
    "http://127.0.0.1/download.asp?fileid=1",@"c:\a.txt");

    }

    }







    原文如下:

    最近有个项目需要从网络上下载网页信息和文件,并且需要登录后才能下载,所以做了个下载的通用类,供大家参考。

    这个是文件下载类:
    using System;
    using System.Net;
    using System.Web;

    public class SRWebClient
    {
    CookieContainer cookie;
    public SRWebClient()
    {
    cookie=new CookieContainer();
    }

    /**//// <TgData>
    /// <Alias>下载Web源代码</Alias>
    /// </TgData>
    public string DownloadHtml(string URL)
    {
    HttpWebRequest request=HttpWebRequest.create(URL) as HttpWebRequest;
    request.CookieContainer=cookie;
    request.AllowAutoRedirect=false;

    WebResponse res=request.GetResponse();
    string r="";

    System.IO.StreamReader S1 = new System.IO.StreamReader(res.GetResponseStream(), System.Text.Encoding.Default );
    try
    {
    r = S1.ReadToEnd();
    }
    catch(Exception er)
    {
    Log l=new Log();
    l.writelog("下载Web错误",er.ToString());
    }
    finally
    {
    res.Close();
    S1.Close();
    }

    return r;
    }

    /**//// <TgData>
    /// <Alias>下载文件</Alias>
    /// </TgData>
    public long DownloadFile(string FileURL,string FileSavePath)
    {
    long Filelength=0;
    HttpWebRequest req=HttpWebRequest.create(FileURL) as HttpWebRequest;

    req.CookieContainer=cookie;
    req.AllowAutoRedirect=true;

    HttpWebResponse res=req.GetResponse() as HttpWebResponse;
    System.IO.Stream stream=res.GetResponseStream();
    try
    {
    Filelength=res.ContentLength;

    byte [] b=new byte[512];

    int nReadSize=0;
    nReadSize=stream.Read(b,0,512);

    System.IO.FileStream fs= System.IO.File.create(FileSavePath);
    try
    {
    while(nReadSize >0)
    {
    fs.Write(b,0,nReadSize);
    nReadSize=stream.Read(b,0,512);
    }
    }
    finally
    {
    fs.Close();
    }
    }
    catch(Exception er)
    {
    Log l=new Log();
    l.writelog("下载文件错误",er.ToString());
    }
    finally
    {
    res.Close();
    stream.Close();
    }

    return Filelength;
    }

    /**//// <TgData>
    /// <Alias>提交数据</Alias>
    /// </TgData>
    public void Request(string RequestPageURL,RequestData Data)
    {
    string StrUrl=RequestPageURL;
    HttpWebRequest request=HttpWebRequest.create(StrUrl) as HttpWebRequest;
    HttpWebResponse response;

    string postdata=Data.GetData();
    request.Referer=RequestPageURL;
    request.AllowAutoRedirect=false;
    request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.01; Windows NT 5.0)";
    request.CookieContainer = cookie;

    Uri u=new Uri(StrUrl);

    if (postdata.Length > 0 ) //包含要提交的数据 就使用Post方式
    {
    request.ContentType = "application/x-www-form-urlencoded"; //作为表单请求
    request.Method = "POST"; //方式就是Post

    //把提交的数据换成字节数组
    Byte [] B = System.Text.Encoding.Default.GetBytes(postdata);
    request.ContentLength = B.Length;

    System.IO.Stream SW = request.GetRequestStream(); //开始提交数据
    SW.Write(B, 0, B.Length);
    SW.Close();
    }

    response = request.GetResponse() as HttpWebResponse;
    response.Close();
    }


    }

    这个是提交的数据类:
    using System.Collections;
    using System.IO;

    public class RequestData
    {
    ArrayList arr=new ArrayList();
    public RequestData()
    {

    }

    public string GetData()
    {
    string r="";

    for(int i=0;i<arr.Count;i++)
    {
    data d=(data)arr[i];
    if(r.Length>0)r+="&";
    r+=d.Field+"="+d.Value;
    }
    return r;
    }

    public void AddField(string Field,string Value)
    {
    data a=new data();
    a.Field=Field;
    a.Value=Value;

    arr.Add(a);
    }

    struct data
    {
    public string Field,Value;
    }


    }

    代码贴完了,下面是测试代码,因为有些数据涉及到客户的资料,故隐去
    using NUnit.Framework;

    [TestFixture]
    public class TestWeb
    {
    [Test]
    public void testDownSEOrder()
    {
    RequestData data=new RequestData();
    data.AddField("name","abc");
    data.AddField("password","121");

    SRWebClient web=new SRWebClient();
    web.Request("http://127.0.0.1/login.asp",data);

    string s=web.DownloadHtml("http://127.0.0.1/dingdan.asp");
    System.Console.WriteLine(s);
    }
    [Test]
    public void testDownFile()
    {
    RequestData data=new RequestData();
    data.AddField("name","aaa");
    data.AddField("password","bbb");

    SRWebClient web=new SRWebClient();
    web.Request("http://127.0.0.1/login.asp",data);

    web.DownloadFile("http://127.0.0.1/download.asp?fileid=1",@"c:\a.txt");

    }
    }





  • 相关阅读:
    关于swift 单元测试的补充
    架构设计案例分析-高速公路收费运营管理平台
    可以落地的软件架构
    循序渐进地培养面向对象的思维方式
    动态规划初学
    求解惑
    github eclipse项目
    关于x86 i586之类
    Manifest intent filter翻译
    消息处理机制小结
  • 原文地址:https://www.cnblogs.com/chengulv/p/331390.html
Copyright © 2011-2022 走看看