你看到的问题是由IPList = [[] for i in range (20)]
当len(pkts)小于20时,parsePcap()返回一个或多个空列表的序列列表:
^{pr2}$
当parseOutput传递给g.add_nodes_from时,
您将收到回溯错误消息:File "/usr/local/lib/python2.7/dist-packages/networkx/classes/graph.py", line 429, in add_nodes_from
nn,ndict = n
ValueError: need more than 0 values to unpack
回想起来,如果您仔细考虑错误消息
您可以看到它告诉您,n有0个值要解压缩。这使得
判断节点n是否为空列表:In [136]: nn, ndict = []
ValueError: need more than 0 values to unpack
空列表来自parseOutput。在
不是预先分配固定大小的列表:IPList = [[] for i in range (20)]
在Python中执行此操作的首选方法是使用append方法:def parsePcap():
IPList = []
for pkt in pkts:
if pkt.haslayer(IP):
x = pkt.getlayer(IP).src
y = pkt.getlayer(IP).dst
IPList.append((x, y))
return IPList
这更容易理解,因为您不需要操心索引
数字并递增一个计数器变量。此外,它允许您处理
pkts中任意数量的项,而不必首先知道
pkts。在
另一件需要修正的事情是nodeList通常不是
与edgeList相同。在
如果要声明nodeList,
nodeList应该是一个IP地址的iterable,以及edgeList
应该是元组的iterable,如parseOutput:nodeList = set([item for pair in parseOutput for item in pair])
print(nodeList)
# set(['216.58.208.206', '216.58.208.227', '172.16.254.128',
# '216.58.208.226', '8.8.8.8'])
但是,由于edgeList中也提到了所有的节点,因此可以忽略声明这些节点而只使用edgeList = parseOutput
g.add_edges_from(edgeList)
g.add_edges_from将隐式添加节点。在import matplotlib.pyplot as plt
import networkx as nx
parseOutput = [
('172.16.254.128', '216.58.208.206'),
('216.58.208.206', '172.16.254.128'),
('172.16.254.128', '216.58.208.226'),
('216.58.208.226', '172.16.254.128'),
('172.16.254.128', '8.8.8.8'),
('8.8.8.8', '172.16.254.128'),
('172.16.254.128', '216.58.208.227'),
('172.16.254.128', '216.58.208.227'),
('216.58.208.227', '172.16.254.128'),
('172.16.254.128', '216.58.208.227'),
('172.16.254.128', '216.58.208.227'),]
g = nx.Graph()
edgeList = parseOutput
g.add_edges_from(edgeList)
pos = nx.spring_layout(g,scale=1) #default to scale=1
nx.draw(g,pos, with_labels=True)
plt.show()
收益率
{1美元^