用Python教你如何“养”一只DHT爬虫.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
用Python教你如何“养”一只DHT爬虫(1) 文讲的是要实现一个爬虫, 所以不会跟协议文档那么严格. 只要保证你能正确请求,回应即可. 用软件开发的一句话来说: 只要接口一致, 管你内部细节代码是怎么写的. AD: 不懂的赶紧去google, 要是缺一个, 我会一口盐汽水喷死你的! 最重要的是, 你必须会编程!!!!!!! 必须会!!!!!!!!!!! ok, DHT原理是什么我在这就不写了, 毕竟会看我这文章的人都是已经知道了的. 本文贴的代码均为Python, 使用其他编程语言的人可以看注释. 为了简单, 只会说大概思路和关键性代码, 细节自行搞定. 本文讲的是要实现一个爬虫, 所以不会跟协议文档那么严格. 只要保证你能正确请求,回应即可. 用软件开发的一句话来说: 只要接口一致, 管你内部细节代码是怎么写的. 第一步, 构建自己的路由表, 这里涉及到大量Python代码, 请深呼吸: 在构建自己的路由表之前, 得写两个辅助函数, 后面会用到: fromhashlibimportsha1 fromrandomimportrandint defnode_id(): 把爬虫 伪装 成正常node,一个正常的node有ip,port,nodeID三个属性,因为是基于UDP协议, 所以向对方发送信息时,即使没 明确 说明自己的ip和port时,对方自然会知道你的ip和port, 反之亦然.那么我们自身node就只需要生成一个nodeID就行,协议里说到nodeID用sha1算法生成, sha1算法生成的值是长度是20byte,也就是20*8=160bit,正好如DHT协议里说的那范围:0至2的160次方, 也就是总共能生成146150163733090高山茶 eupai.net2918203684832716283019655932542976个独一无二的node. ok,由于sha1总是生成20byte的值,所以哪怕你写SHA1(20)或SHA1(19)或SHA1( Iama2B )都可以, 只要保证大大降低与别人重复几率就行.注意,nodeID非十六进制, 也就是说非FF5C85FE1FDB933503999F9EB2EF59E4B0F51ECA这个样子,即非hash.hexdigest(). hash=sha1() s= foriinrange(20): s+=chr(randint(0,255)) hash.update(s) returnhash.digest() defintify(nid): 这是一个小工具,把一个nodeID转换为数字.后面会频繁用到. assertlen(nid)==20returnlong(nid.encode(hex),16)#先转换成16进制,再变成数字 协议里说道, table里有bucket, bucket里有node, 每个bucket有K个node, 目前K=8, 即每个bucket有8个node. 由于table范围是0到2的160次方, 那么一个table最多能有(2的160次方)K那么多的bucket. OK, 按照OOP编程思想来说, 那么肯定会有table, bucket, node这3个类, 无OOP的, 自己看着办. 由于是基于Kademila而写, 所以我习惯上把这三个类名变为KTable, KBucket, KNode: classKNode: def__init__(self,nid,ip,port): nid就是nodeID的简写,就不取id这么模糊的变量名了.__init__方法相当于别的OOP语言中的构造方法, 在python严格来说不是构造方法,它是初始化,不过,功能差不多就行. self.nid=nid#nodeID self.ip=ip self.port=port #以下两个方法非Python程序员不需关心 def__eq__(self,other): returnself.nid==other.nid def__ne__(self,other): returnself.nid!=other.nid classKBucket: def__init__(self,min,max): min和max就是该bucket负责的范围,比如该bucket的min:0,max:16的话, 那么存储的node的intify(nid)值均为:0到15,那16就不负责,这16将会是该bucket后面水草玛瑙 mnwg.net的bucket的min值. nodes属性就是个列表,存储node.last_accessed代表最后访问时间,因为协议里说到, 当该bucket负责的node有请求,回应操作;删除node;添加node;更新node;等这些操作时,

文档评论(0)

5f2e576 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档