最近似乎有很多人做DHT爬虫,但是好像没有完全用C#实现的,所以我来介绍一下C#的实现过程。关于DHT协议的原理,网上有很多介绍的文章,这里就不再赘述,仅说说实现的过程,作为抛砖引玉吧。

1、DHT爬虫的实现

DHT协议我选择使用 MonoTorrent 项目并稍作修改,使爬虫可以得到其他节点“开始下载”的通知。每个DHT节点都有自己的ID,而开始下载的通知只会发送到离自己“最近”的节点,所以如果我们想要收到更多的消息,就要启动尽可能多、ID尽可能平均分布的节点。

在我们收到的“开始下载”消息中,有一个40字节长的字符串,就是这个资源的ID,也表示网络中有一个用户开始下载这个资源了。下载同一个资源的用户越多,表示这个资源越热门,下载速度也越快。

得到资源ID后,需要通过种子缓存服务下载对应的种子文件。如资源ID:640FE84C613C17F663551D218689A64E8AEBEABE,则对应的种子下载地址分别为:

  • https://zoink.it/torrent/640FE84C613C17F663551D218689A64E8AEBEABE.torrent
  • http://bt.box.n0808.com/64/BE/640FE84C613C17F663551D218689A64E8AEBEABE.torrent
  • http://torcache.net/torrent/640FE84C613C17F663551D218689A64E8AEBEABE.torrent
  • http://torrage.com/torrent/640FE84C613C17F663551D218689A64E8AEBEABE.torrent
选择其中之一下载即可。得到对应的种子文件后,可以直接通过MonoTorrent解析成对象,并读取资源的名称、大小、收录日期、包含的文件等信息,接下来就可以存入数据库为以后的搜索引擎做准备了。

需要注意的是爬虫启动时需要通过已经在DHT网络中的节点引导,常用的引导节点是 dht.transmissionbt.com和 router.bittorrent.com,端口都是6881。

2、搜索引擎的实现

种子信息的检索使用 Lucene.Net ,是Apache Lucene项目的.Net移植。通过IIS中运行的守护线程,定时将最新采集的BT信息加入到Lucene索引中,aspx后台通过关键词进行检索即可。

Lucene默认的分词器StandardAnalyzer对中文支持的不是很好,其他的选择还有盘古分词和庖丁解牛,这里btcherry用的是Apache提供的ChineseAnalyzer和StandardAnalyzer配合使用。

http://www.bittorrent.org/beps/bep_0005.html

http://codemacro.com/2013/05/19/crawl-dht/

http://blog.csdn.net/xxxxxx91116/article/details/7970815

http://en.wikipedia.org/wiki/Kademlia

http://www.btcherry.com/

最近似乎有很多人做DHT爬虫,但是好像没有完全用C#实现的,所以我来介绍一下C#的实现过程。关于DHT协议的原理,网上有很多介绍的文章,这里就不再赘述,仅说说实现的过程,作为抛砖引玉吧。 1、DHT爬虫的实现DHT协议我选择使用MonoTorrent项目并稍作修改,使爬虫可以得到其他节点“开始下载”的通知。每个DHT节点都有自己的ID,而开始下载的通知只会发送到离自己“最近”的节点...
磁力 链接抓取,检索,搜索源代码—网站www.sougaoqing. com ##结构组成 爬虫 与种子解析由python编写。网站采用php脚本制作,前段采用引导程序, 数据库 采用mysql,全文索引使用的是sphinx。##目录结构crawl ---- DHT 爬虫 功能,包含了种子文件内容解析 db ---- 数据库 结果文件 sphinx ---- sphinx的配置文件 web ---- web搜索功能 li bt orrent-rasterbar_1.0.7.orig.tar.gz ---- 爬虫 需要用到的库文件 conf ---- apache网站等配置文件 ##联系信息网站: 电子邮件:
基本是利用 bt 网络 中p2p技术 实现 ,开源项目上 实现 dht 网络 的搜索。是学习 dht 算法的好项目。 https://lanmaowz. com /open- dht -spider/ https://github. com /dontcontactme/p2pspider/ https://github. com /callmelanmao/ bt spider 如果在github上搜索,关键字:dh...
请用python 实现 1)拟合第一供水时段>> xx1=-polyval(a1,[8 9]);xx2=-polyval(a2,[11 12]);xx12=[xx1 xx2];a12=polyfit([8 9 11 12],xx12,3)a12 = 1.0e+03 * -0.0012 0.0368 -0.3551 1.1363%其中a12系数为流量函数系数>> tp12=9:0.05:11;x12=polyval(a12,tp12);plot(tp12,x12,'R.')>> hold on2)拟合第二供水时段>> dt3=diff(t(22:24));dh3=diff(h(22:24)); dht 3=-dh3./dt3;t3=[20 20.8 t(22) t(23)];xx3=[-polyval(a2,t3(1:2)), dht 3];a3=polyfit(t3,xx3,3)a3 = 0.0468 -3.6538 91.8283 -725.3839%其中a3系数为流量函数系数>> tp3=20.8:0.05:24;x3=polyval(a3,tp3);plot(tp3,x3,'R.');hold on
t = np.array([0, 0.92, 1.84, 2.95, 3.87, 4.98, 5.9, 7.01, 7.93, 8.97, 10.95, 12.03, 12.95, 13.88, 14.98, 15.90, 16.83, 17.93, 19.04, 19.9, 20.84, 23.88, 24.99, 25.91]) h = np.array([968, 948, 931, 913, 898, 881, 869, 852, 839, 822, 1082, 1050, 1021, 994, 965, 941, 918, 892, 866, 843, 822, 1059, 1035, 1018]) # 第一段拟合 c1 = np.polyfit(t[:10], h[:10], 3) a1 = np.polyder(c1) # 第二段拟合 c2 = np.polyfit(t[10:21], h[10:21], 4) a2 = np.polyder(c2) # 第一供水时段拟合 xx1 = -np.polyval(a1, [8, 9]) xx2 = -np.polyval(a2, [11, 12]) xx12 = np.concatenate((xx1, xx2)) a12 = np.polyfit([8, 9, 11, 12], xx12, 3) tp12 = np.arange(9, 11.05, 0.05) x12 = np.polyval(a12, tp12) plt.plot(tp12, x12, 'r.') # 第二供水时段拟合 dt3 = np.diff(t[22:24]) dh3 = np.diff(h[22:24]) dht 3 = -dh3 / dt3 t3 = np.array([20, 20.8, t[22], t[23]]) xx3 = np.concatenate((-np.polyval(a2, t3[:2]), dht 3)) a3 = np.polyfit(t3, xx3, 3) tp3 = np.arange(20.8, 24.05, 0.05) x3 = np.polyval(a3, tp3) plt.plot(tp3, x3, 'r.') plt.axis([0, 25, 12, 34]) plt.xlabel('小时') plt.ylabel('厘米/小时') plt.show() 需要注意的是,这里的数组索引同样是从0开始的,因此`t[22:24]`表示取t数组的第23个和第24个元素。同时,`np.concatenate`函数用于将两个数组合并为一个数组。