环球面试完了,等通知中。。。怕怕。。。看书看不下去,想下电影珍藏,无奈校园网可看不可下,既然他不仁,那我也不义了。。。
打开网页,想分析他网页的源码,竟然禁止了右键菜单。。。哈哈,没关系,我有强大的Firefox。。。
文件的地址一览无遗。。。但是,却发现有两个服务器地址?到底是哪个呢?(感谢小明,直接告诉了我,哈哈),如图。
文件的地址由两个URL各取一部分组成。
我们可以用正则表达式来把URL取出并拼凑(很多网络爬虫用此方法抓取url),代码如下:
//根据URL获取网页的源码,并根据网页编码自动转码
private string getHtmlScourse(string url)
{
try
{
WebClient wc = new WebClient();
wc.Credentials = CredentialCache.DefaultCredentials;
byte[] pageDate = wc.DownloadData(txtURL.Text.Trim());
string strWebData = Encoding.Default.GetString(pageDate);
Match charSetMatch = Regex.Match(strWebData, "<meta([^<]*)charset=([^<]*)\"",RegexOptions.IgnoreCase | RegexOptions.Multiline);
string webCharSet = charSetMatch.Groups[2].Value;
if (Encoding.GetEncoding(webCharSet) != Encoding.Default)
strWebData = Encoding.GetEncoding(webCharSet).GetString(pageDate);
return strWebData;
}
catch (Exception e)
{
return "该URL无法连接";
}
}
//取出网页中资源的地址
private List<string> getUrls(string html)
{
string regex = "(/)[^>]*[^/].(?:jpg|bmp|gif|rmvb|avi|mov|wmv|3gp|flv|mp4|mp3)(?:\"|\')";
Regex rg = new Regex(regex);
MatchCollection mc = rg.Matches(html);
System.Collections.IEnumerator enu = mc.GetEnumerator();
List<string>urls=new List<string>();
while (enu.MoveNext() && enu.Current != null)
{
Match match=(Match)(enu.Current);
urls.Add(match.Value);
}
return urls;
}
这两个方法能取出两个URL(一个为服务器地址,一个有文件名),接下来对两个URL进行处理,代码如下:
List<string> urls=getUrls(getHtmlScourse(txtURL.Text.Trim()));
if (urls.Count > 2)
{
string serviceAdd=urls[0];
string filmName=urls[1];
serviceAdd = serviceAdd.Substring(2, serviceAdd.LastIndexOf('/')-2);
int filmLenght=filmName.LastIndexOf('/');
filmName = filmName.Substring(filmLenght,filmName.Length-filmLenght-1);
llbUrl.Text = "http://" + serviceAdd + filmName;
}
将拼凑好的URL给一个LinkLabel控件,并给该LinkLabel控件加点击事件:
private void llbUrl_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
string target = llbUrl.Text;
if (target != null && target.StartsWith("http://"))
{
System.Diagnostics.Process.Start(target);
}
else
{
MessageBox.Show("Item clicked: " + target);
}
}
点击LinkLabel时,就可以直接调用浏览器来下载文件(但仅在chrome,filefox,opera,ie8上试过,其他浏览器不详)
点击直接下载。如下图:
你没装浏览器?OK,有备用方案。
根据上图提示,填入相应参数,点击下载就可以,如下图:
哈哈。这样就可以肆无忌惮的狂下校园网的资源啦~~下载的代码也分享一下:
// <summary>
/// 下载带进度条代码(普通进度条)
/// </summary>
/// <param name="URL">网址</param>
/// <param name="Filename">文件名</param>
/// <param name="Prog">普通进度条ProgressBar</param>
/// <returns>True/False是否下载成功</returns>
public bool DownLoadFile(string URL, string strLocalDirPath,int Velocity, ProgressBar Prog)
{
try
{
string fileName = URL.Substring(URL.LastIndexOf("/"));
string Path = strLocalDirPath + fileName;
System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(URL); //从URL地址得到一个WEB请求
System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse(); //从WEB请求得到WEB响应
long totalBytes = myrp.ContentLength; //从WEB响应得到总字节数
Prog.Maximum = (int)totalBytes; //从总字节数得到进度条的最大值
System.IO.Stream st = myrp.GetResponseStream(); //从WEB请求创建流(读)
System.IO.Stream so = new System.IO.FileStream(Path, System.IO.FileMode.Create); //创建文件流(写)
long totalDownloadedByte = 0; //下载文件大小
int V = 1024 * Velocity;
byte[] by = new byte[V];
int osize = st.Read(by, 0, (int)by.Length); //读流
while (osize > 0)
{
totalDownloadedByte = osize + totalDownloadedByte; //更新文件大小
Application.DoEvents();
so.Write(by, 0, osize); //写流
Prog.Value = (int)totalDownloadedByte; //更新进度条
osize = st.Read(by, 0, (int)by.Length); //读流
}
so.Close(); //关闭流
st.Close(); //关闭流
return true;
}
catch
{
return false;
}
}
下载按钮的点击事件:
private void button1_Click(object sender, EventArgs e)
{
int V = 5;
if (txtV.Text != "" && txtV.Text != null)
{
try
{
V = Convert.ToInt32(txtV.Text);
}
catch (Exception ex)
{
V = 5;
}
}
if (DownLoadFile(llbUrl.Text, txtDir.Text, V, pbDownload))
{
MessageBox.Show("下载完成!");
}
}
当然,因为下载速度太大(实验最高为20M/s左右),所以如果每个人都使用的话校园网服务器一定承受不了,所以,下载要选在夜深人静的时候(建议是2~3点)。。。
有同学使用后跟我说,没有取消的功能,所以改进了这个不足,对程序进行了修改,增加了取消的功能:
代码也做了调整,将读写流,文件全路径定义为全局变量,使得它们的生命周期可控,下面是取消按钮的单击事件:
try
{
so.Close(); //关闭流
st.Close(); //关闭流
if (File.Exists(Path))
{
File.Delete(Path);
}
pbDownload.Value = 0;
MessageBox.Show("下载以停止,并成功删除下载文件");
}
catch (Exception ex)
{
MessageBox.Show("下载无法停止,可先关闭窗口,并在任务管理器中结束该进程");
}
呵呵,希望同学们下载愉快~~
下载地址:http://www.rayfile.com/zh-cn/files/2ee345e3-a9f6-11e0-8965-0015c55db73d/