我正在抓取slideshare.net图,从我的节点开始,一直关注BFS中的所有用户,直到访问的节点数为1000。
我通过以下方式执行BFS:
from urllib.request import urlopen
from collections import deque
import sys
import json
import codecs
import csv
import io
import hashlib
import time
import xml.etree.ElementTree as etree
queue = deque(["himanshutyagi11"])
while len_visitedset < 1ooo:
vertex = queue.pop()
if vertex in visited:
continue
visited.add(vertex)
length_visited = len(visited)
print(vertex,length_visited)
crawl(vertex)
crawl()是一个函数,其中我按照here的说明进行幻灯片共享API查询,方法是使用我的shared_secret和api_key(在api注册时指定)创建查询有效内容,发送查询并解析存储在变量中的XML响应'响应'。解析后,我将当前节点的联系人添加到队列中。
request_timestamp = int(time.time())
request_hash_string = shared_secret+str(request_timestamp)
request_hash_value = hashlib.sha1(request_hash_string.encode('utf-8')).hexdigest()
request_url = 'https://www.slideshare.net/api/2/get_user_contacts?username_for='+username+'&api_key='+api_key+'&hash='+request_hash_value+'&ts='+str(request_timestamp)
response = etree.parse(urlopen(request_url)).getroot()
# Append all the adjacent nodes of this user to the queue.
for child in response:
friend_name = child[0].text
queue.appendleft(friend_name)
edge_file = open('non_anonymized.csv','a')
for child in response:
f_name = child[0].text # Name of friend is stored in variable 'f_name'
edge_file.write(username+','+f_name+'\n') # username is the name of user currently being crawled
edge_file.close()
搜寻时,我还创建了一个edgelist.csv文件,其中包含图中的所有边。这个文件似乎很好。
另外,诸如deg(),in_degree(),average_clustering()之类的其他功能似乎也可以正常工作。
然后,我使用networkx创建一个具有1000个节点的图形。但是,如果我尝试使用以下函数查找该图的直径:
diameter = nx.diameter(graph)
使用上面的代码,我无法找到图形的直径,该doe不返回任何内容,并且程序停留在此行。对可能发生的情况有任何见解吗?
我的是一个连通图。我正在使用
to_undirected()
函数将其转换为无方向的。我厌倦了使用有向图运行它,并且遇到以下错误networkx.exception.NetworkXError: Graph not connected: infinite path length
我的问题是,由于我正在使用BFS进行爬网,因此如何断开连接。
Python 3.4
Networkx 1.9.1
最佳答案
直径的源代码为here。它依赖于eccentricity
,该函数恰好在源代码中。 eccentricity
查找从一个节点到所有其他节点的最短路径。您收到的错误消息来自此部分代码:
if L != order:
msg = "Graph not connected: infinite path length"
raise networkx.NetworkXError(msg)
这里的
L
是从给定节点可到达的节点数,而order
是网络中的节点数。 L != order
表示存在无法从给定节点到达的节点。如果是非定向网络,则表示该网络未连接。但是,根据您的情况,您拥有定向网络。对于定向网络,L != order
表示该网络未“牢固连接”。它实际上可能是弱连接的,大概是您的。因此,您遇到的错误消息不太准确。
对于您创建的有向网络,直径是无限的:如果存在节点
u
没有到v
的路径,则意味着直径是无限的。关于python - 为什么发现直径时,networkx为什么说我的有向图是断开的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33114746/