using System;
writeline方法的作用
using System.IO;
using System.Collections;
using System.Net;
using System.Web;
using System.Text;
namespace DownloadTorrent
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
//获取网页源码的函数,返回类型是存放源码的字符串
public static string GetSource(string url)
{
//存储网页的源码
string source="";
/
/运用请求/响应层的WebClient类等来实现高抽象程度的Internet通讯服务
WebClient client=new WebClient();
//定义存放字节数据的流
Stream data;
//定义读取字节流的方法
StreamReader reader;
try
{
//利用WebClient类获取网页源码的字节流
data=client.OpenRead(url);
//读取采用中文编码的网页源码
reader=new StreamReader(data,Encoding.GetEncoding("GB2312"));
string str="";
//按行读取后存放到字符串中
while((str=reader.ReadLine())!=null)
{
source+=str+"\r\n";
}
}
//如果不能获取源码,抛出异常
catch(WebException exp)
{
Console.WriteLine(exp.Message,"Exception");
}
client.Dispose(); 
return source;
}
//获取论坛各主题所在URL的函数,返回类型是动态链表
public static ArrayList GetUrl(string source)
{
Console.WriteLine("正在获取论坛主题...");
string url="";
//存储各主题所在的URL
ArrayList UrlName=new ArrayList();
//字符串匹配的起始点
int tag=0;
//通过分析该网页源码知道,由于发布主题的格式固定,是以“[ ][ ]”形式
//出现的,而它们是放在一个超链接中的,通过匹配“]</a>”能够准确定位到
//某一发布主题名称所在的末尾处,然后向前匹配,从而获取路径及发布主题的
//名称
while(source.IndexOf(@"]</a>",tag)>0)
{
//定位某一主题名称所在的位置
int end=source.IndexOf("]</a>",tag);
/
/向前定位到出现此主题所在的路径处
for(int i=source.IndexOf("]</a>",tag);i>0;i--)
//定位到该完整链接位置的首处
if(source[i]=='<'&&source[i+1]=='a')
{
for(int j=i+9;j<source.Length;j++)
{
//定位到路径结尾出的“"”处,因为路径是放在
//“<a href="..."”第一个引号内的
if(source[j]=='"')
{
/
/提取相对路径,并将相对路径改成绝对路径
url=@"地址"+source.Substring(i+9,j-i-9);
if(!UrlName.Contains(url))
UrlName.Add(url);
//进行下一个主题路径的提取
tag=end+10;
//提取出路径后,跳出本次循环
break;
}
}
//完整提取出一个主题后,继续下一个主题的提取
break;
}
}
Console.WriteLine("论坛主题获取完毕
.");
return UrlName;
}
//从主题页面中提取BT种子所在的路径及种子名称的函数,返回类型为哈希表
public static Hashtable GetTorrent(string source)
{
//存储BT种子名称及路径的哈希表
Hashtable UrlName=new Hashtable();
string url="",name="";
//通过分析各BT资源发布帖子的格式,知道BT种子都是以附件的形式粘贴
//在该网页上,网页中存在唯一的“.torrent”内容,通过匹配“.torrent”,
//便能准确定位到种子名称处,从而提取出名称及路径
if(source.IndexOf(".torrent")>0)
{
//定位到种子名称处
int end=source.IndexOf(".torrent");
for(int i=end;i>0;i--)
//向前定位到此种子所在链接的首处
if(source[i]=='<'&&source[i+1]=='a')
{
for(int j=i+9;j<end;j++)
{
//定位到种子所在的相对路径尾处,因为路径是放在
//“<a href="..."”第一个引号内的
if(source[j]=='\"'&&source[j+1]==' ')
{
//提取相对路径,并改成绝对路径
url=@"地址"+source.Substring(i+9,j-i-9);
//路径提取出来后,跳出循环
break;
}
}
for(int j=i+9;j<end;j++)
{
//定位种子名称的首处,因为名称是在“<a href=...>...</a>”
//之间的位置上
if(source[j]=='>')
{
//提取种子名称
name=source.Substring(j+1,end+7-j);
Console.WriteLine("正在获取{0}所在的路径",name);
if(!UrlName.Contains(url))
UrlName.Add(url,name);
//提取名称完毕,跳出循环
break;
}
}
//由于本网页只存在一个种子文件,故仅匹配一次
break;
}
}   
return UrlName;
}
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
//BT论坛主页网址
string url=@"bt主页";
//获取发布页的源码
string source=GetSource(url);
/
/运用WebClient完成BT种子的下载服务
WebClient client=new WebClient();
//存储论坛各主题的URL
ArrayList UrlName=new ArrayList();
//获取各主题的URL
UrlName=GetUrl(source);
//存储BT种子路径及名称的哈希表
Hashtable TorrentUrl=new Hashtable();
//遍历各主题的网页,从中获取所发布的BT种子资源
for(int i=0;i<UrlName.Count;i++)
{
/
/获取论坛各主题的源码
source=GetSource((string)UrlName[i]);
//提取BT种子名称及路径
TorrentUrl=GetTorrent(source);
//遍历种子
foreach(DictionaryEntry de in TorrentUrl)
{
try
{
Console.WriteLine("下载中...");
//进行种子的下载
client.DownloadFile((string)de.Key,(string)de.Value);
}
//设置异常处理
catch(WebException exp)
{
Con
sole.WriteLine(exp.Message,"Exception");
}
}
}
Console.WriteLine("本发布页的种子已经下载完毕");
client.Dispose();
UrlName.Clear();
TorrentUrl.Clear();
}
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。