- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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;等这些操作时,
您可能关注的文档
最近下载
- 风险管理与金融机构第二版课后习题答案+(修复的)()详细分析.doc VIP
- 白砂糖仓库管理方案范本.docx VIP
- 初中语文2024届中考成语专项练习(共20道选择题,附参考答案).doc VIP
- 最新版个人征信报告模板(word版-可编辑-带水印).docx VIP
- 部编版语文三年级下册第三单元3单元整体作业设计.docx VIP
- 新22J04-1 内装修一(墙面、吊顶)参考图集.docx VIP
- GB50278-2010 起重设备安装工程施工及验收规范.docx VIP
- 达索BIOVIA COSMOtherm 2020 用户指南.pdf
- 智慧养殖在线监测系统微型水质自动监测系统使用说明书.pdf
- 铜、铅、锌、银、镍、钼矿地质勘查规范.pdf VIP
文档评论(0)