在BitTorrent技术出世以来,很多网络资源被制作成种子进行传播,随后磁力链接加速了资源的传播。然后非常好奇,如今世界人民对什么资源需求大呢,所以在网上查询了许多资料和源代码,完成了这个爬虫。源代码在Github:https://github.com/1205628673/BT-Spider
首先我们先知道什么是" DHT网络"
如上图所示,每个人的机器都是一个"Peer",即对端...,而中间的那个服务器,就是中心叫做Tracker服务器,一些迅雷之流就是这种存在
既然是p2p,那么肯定也能去中心化,即上图去掉Tracker服务器。这样一来,每个使用BT下载软件的人,就遵循规则自动做种,那么在网络的其他端就能通过BEP协议下载到这个种子
什么是BEP协议,这里不多赘述,几个链接大家去阅读:
http://www.bittorrent.org/beps/bep_0005.html
大致意思就是在这个DHT网络中,只有遵循B编码发送标准消息才能得到答复,而消息主要分为几种:
ping
最基本的查询是ping。”q“=”ping”ping查询只有一个参数,“id”值是一个20字节的字符串,按网络字节顺序包含发送者节点id。对ping的适当响应只有一个键“id”,其中包含响应节点的节点id。
格式:
ping Query = {"t":"aa", "y":"q", "q":"ping", "a":{"id":"abcdefghij0123456789"}} bencoded = d1:ad2:id20:abcdefghij0123456789e1:q4:ping1:t2:aa1:y1:qe
Response = {"t":"aa", "y":"r", "r": {"id":"mnopqrstuvwxyz123456"}} bencoded = d1:rd2:id20:mnopqrstuvwxyz123456e1:t2:aa1:y1:re
find_node
Find node用于查找给定ID的节点的联系信息。“q”=“Find_node”Find_node查询有两个参数,“ID”包含查询节点的节点ID,而“target”包含查询者所查找的节点的ID。当一个节点接收到一个find_node查询时,它应该用一个键“nodes”和一个字符串的值来响应,该字符串包含目标节点或其自身路由表中K(8)个最近的好节点的压缩节点信息。
格式:
find_node Query = {"t":"aa", "y":"q", "q":"find_node", "a": {"id":"abcdefghij0123456789", "target":"mnopqrstuvwxyz123456"}} bencoded = d1:ad2:id20:abcdefghij01234567896:target20:mnopqrstuvwxyz123456e1:q9:find_node1:t2:aa1:y1:qe
Response = {"t":"aa", "y":"r", "r": {"id":"0123456789abcdefghij", "nodes": "def456..."}} bencoded = d1:rd2:id20:0123456789abcdefghij5:nodes9:def456...e1:t2:aa1:y1:re
由于我们这是DHT爬虫,所以就不实现Routetable了,只需要将自身id和对端id简单拼一下就行
get_peer
获取与torrent infohash关联的对等方。”q“=”get_peers“get_peers查询有两个参数,“id”包含查询节点的节点id,“info_hash”包含torrent的infohash。如果查询的节点有infohash的对等节点,则它们将作为字符串列表以键“value”的形式返回。每个字符串包含单个对等点的“压缩”格式对等信息。如果查询