最近似乎有很多人做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`函数用于将两个数组合并为一个数组。