btspread:Btspread Search Assistant的开发过程

-————————————————2016年3月1日更新————————————————

现在btspread已经不能用了,哥准备换掉神器里面的btspread搜索方法,换上btdigg和torrentkitty的搜索函数,大家敬请期待.

————————————————2016年1月30日更新————————————————

其实这货有个bug.

文件名File Name没办法显示中文字符,有时候还提取不到.真是日了狗了.

大家有空的话可以到github上面follow一下不,帮我解决掉这个bug.

————————————————2016年1月30日更新————————————————

上次我不是在我的博客里面弄了发布了一个用C#写的搜片神器么,说起这货的诞生,我还得感谢我那巨懒得老爸。

皇上曰:我要看片!

于是有了片。(略过途中各种艰难的手动搜片过程)

怎么可以这么麻烦啊,于是我就写了个软件,专门为搜片而生。

————————————————我是萌萌哒的分割线————————————————

其实上面只是一个开头,大家不要认为我写个文章就是专门来吐槽父皇大人的。

放代码才是最关键的事情好不。

————————————————我是萌萌哒的分割线————————————————

先上设计流程:

1.从搜索框得到搜索关键字

        |

2.得到btspread的链接数组

        |

3.分析此数组所指向的各个网页的源代码,得到包含磁链链接的那个网页

        |

4.分析这些网页,得到磁力链啊接

        |

5.么么哒

————————————————我是萌萌哒的分割线————————————————

这个案例的核心就在于获取网页源代码,以及获取网页源代码之后用正则表达式匹配得到所需的磁力链接.

重点一,提取网页链接列表:

我们先看看怎么获取上图步骤二的链接:

我们在这个网站下面就可以搜索片源:

http://www.bt2mag.com/search/(不要告诉我你这个都不知道怎么找到的)

我以搜007幽灵党为例,我们能在网页源代码里面找到以下语句:

<a href="http://www.bt2mag.com/magnet/detail/hash/568901DB746FA104341C76908DBD5A733C8732A2" title="[www.hdmayi.com][007:幽灵党][1080P.BD-RMVB][中英文字幕]"> 这里 <a href="到"之间的内容就是我们要提取的第一个网址 那我们可以用正则表达式:

@"(?<=hash/).*?(?="")"

来得到hash嘛,之后就把:

http://www.bt2mag.com/magnet/detail/hash/ 加在前面就可以了.所有的搜索链接都提取到一个字符数组里面,方便提取下一步的网页源代码

重点二,提取列表里面每一个网页所包含的磁力链接:

我们分析一下所有的网页源代码,都可以发现一段类似于:

<a id="magnetDownload" href="magnet:?xt=urn:btih:568901DB746FA104341C76908DBD5A733C8732A2&dn=%5Bwww.hdmayi.com%5D%5B007%EF%BC%9A%E5%B9%BD%E7%81%B5%E5%85%9A%5D%5B1080P.BD-RMVB%5D%5B%E4%B8%AD%E8%8B%B1%E6%96%87%E5%AD%97%E5%B9%95%5D" 的语句.这就是我们所要提取的磁力链接.

那么,我们就可以用正则表达式匹配

<a id="magnetDownload" href="magnet:?xt=urn:btih:到"之间的内容

正则表达式:

@"(?<=readonly>).*?(?=</textarea>)"

把提取到某一个字符数组里面放好.

同理:

用@"(?<=Content Size:</div><div class=""col-md-10 col-sm-9 value"">).*?(?=</div>)"得到File Size

用@"(?<=</div>        <h3>).*?(?=</h3>)"得到File Name

之后就是显示了,这就不在赘述.

————————————————我是萌萌哒的分割线————————————————

参考资料,感谢以下资料的原作者

正则表达式学习网址:

http://www.cnblogs.com/youring2/archive/2009/11/07/1597786.html

获取源代码的三种方法:

http://www.cnblogs.com/zjfree/archive/2011/03/10/1980325.html

————————————————我是萌萌哒的分割线————————————————

面的大家又要上Github,又要开VS,我就在这里上代码了:

Github地址:https://github.com/K9A2/BtSpread_Assistant

using System;using System.IO;using System.Net;using System.Text;using System.Text.RegularExpressions;using System.Windows.Forms;namespace 疯狗的神器{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } public static string BTS_Link = "http://www.bt2mag.com/search/"; //btspread的搜索地址 public static string BTS_Hash_Reg = @"(?<=hash/).*?(?="")"; //求hash的正则表达式 public static string BTS_Hash_Link = "http://www.bt2mag.com/magnet/detail/hash/"; //包含磁力链接的网页的开头 public static string BTS_Mag_Reg = @"(?<=readonly>).*?(?=</textarea>)"; //求mag的正则表达式 public static string BTS_Get_File_Size = @"(?<=Content Size:</div><div class=""col-md-10 col-sm-9 value"">).*?(?=</div>)"; //求文件大小 public static string BTS_Get_File_Name = @"(?<=</div><h3>).*?(?=</h3>)"; //求文件名 private void button1_Click(object sender, EventArgs e) { textBox2.Clear(); //清除结果框里面的所有搜索结果 string key = textBox1.Text.ToString(); //获取搜索关键字 string searchlink = BTS_Link + key; //获取搜索链接 string[] links = getLinksList(searchlink); //获取网页链接列表 string[] maglinks = getFinalLinks(links); //获取磁力链接列表 for (int i = 0; i < maglinks.Length; i++) //输出磁力链接列表 { textBox2.AppendText(maglinks[i] + Environment.NewLine + Environment.NewLine); } } public static string[] getFinalLinks(string[] linklist) { //用于在指定的页面获取磁力链接 //获取网页源代码 string[] finallinks = new string[linklist.Length]; string strHtml = ""; for (int i = 0; i < linklist.Length; i++) { //得到网页源代码 strHtml = getHtmlCode(linklist[i]); //正则表达式匹配,得到文件名 Match name = Regex.Match(strHtml, BTS_Get_File_Name); finallinks[i] = finallinks[i] + "----File Name:" + Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(name.ToString())) + "----"; //正则表达式匹配.得到文件大小 Match size = Regex.Match(strHtml, BTS_Get_File_Size); finallinks[i] = finallinks[i] + "File Size:" + size.ToString() + "----" + Environment.NewLine; //正则表达式匹配,得到磁力链接 Match link = Regex.Match(strHtml, BTS_Mag_Reg); finallinks[i] = finallinks[i] + link.ToString(); } return finallinks; } public static string[] getLinksList(string link) { //用于在搜索页面获取包含磁力链接的所有网页链接列表 //获得网页源代码 string strHTML = getHtmlCode(link); //正则表达式匹配hash,获得此资源所有磁力链接页面 MatchCollection mc = Regex.Matches(strHTML, BTS_Hash_Reg); //获得对应的网页数组 string[] linklist = new string[mc.Count]; for (int i = 0; i < mc.Count; i++) { linklist[i] = BTS_Hash_Link + mc[i]; } return linklist; } public static string getHtmlCode(string link) { //获取指定页面的源代码,并返回包含此页面源代码的一个字符串 string strHTML; Uri uri = new Uri(link); HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(uri); myReq.UserAgent = "User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705"; myReq.Accept = "*/*"; myReq.KeepAlive = true; myReq.Headers.Add("Accept-Language", "zh-cn,en-us;q=0.5"); HttpWebResponse result = (HttpWebResponse)myReq.GetResponse(); Stream receviceStream = result.GetResponseStream(); StreamReader readerOfStream = new StreamReader(receviceStream, System.Text.Encoding.GetEncoding("gb2312")); strHTML = readerOfStream.ReadToEnd(); readerOfStream.Close(); receviceStream.Close(); result.Close(); //返回网页源代码 return strHTML; } }}


相关推荐

相关文章