我正在抓取 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() 是一个函数,我按照此处的说明进行 slideshare api 查询 ,使用我的 shared_secret 和 api_key(在 api 注册时给出)创建查询有效负载,发送查询并解析存储在变量 'response 中的 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 文件,其中包含图中的所有边。这个文件似乎很好。其他函数,如 degree()、in_degree()、average_clustering() 似乎工作正常。
然后我使用 networkx 创建一个图,它有 1000 个节点。但是,如果我尝试使用以下函数找到该图的直径:
diameter = nx.diameter(graph)
使用上面的代码,我无法找到我的图表的直径,这不会返回任何内容,我的程序卡在这一行。对可能发生的事情有任何见解吗?我的是一个连通图。我正在使用to_undirected()
函数将其转换为无向的。我厌倦了用有向图运行它,我得到了以下错误
networkx.exception.NetworkXError: Graph not connected: infinite path length
我的问题是,由于我使用 BFS 进行爬网,它如何断开连接。
Python 3.4
Networkx 1.9.1