我正在抓取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/

10-16 06:06