六度空间的应用找出两个陌生人之间的关系Word格式文档下载.docx
- 文档编号:16356980
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:17
- 大小:162.21KB
六度空间的应用找出两个陌生人之间的关系Word格式文档下载.docx
《六度空间的应用找出两个陌生人之间的关系Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《六度空间的应用找出两个陌生人之间的关系Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
存储人和人之间的关系
光下载到到人的名单还不行,我并不想以A为中心建立大家之间的关系,因为A毕竟是一个组织,不是一个人,以它为中心的关系几乎都是浮云,现在已经有A的所有好友,以及A的好友的好友集合S2{sa,sb,sc...},学校的所有人都包含在S2中了,任何人之间的关系可以用图表示,在人人网中且是无向图(没有A是B的好友,B不是A的好友这种情况),所以还得再逆向的找出S2中的每个人的好友,并存储这个关系!
图可以用矩阵法和邻接表表示,因为这个关系图属于稀疏矩阵,应该用邻接表表示更省空间(用矩阵表示也是几乎不可能的事情,因为如果有学校有10000个人,那么就得建立一个10000*10000的矩阵,当然可以利用矩阵的一些运算比如找出矩阵特殊值等方法压缩这个矩阵,但压缩之后的矩阵仍然不小...).因此我建立了如下一个XML格式的文件存储人和人之间的关系.
1
2
3
4
5
6
7
8
9
10
11
12
<
?
xml
version="
1.0"
>
Relations>
Person
id="
name="
school="
faceUri="
Friend
/>
........
/Person>
/Relations>
这个把全校所有人都爬虫出来的代码是这样的,先找出A的所有好友:
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public
void
downLoadData()
{
XmlDocumentdoc=new
XmlDocument();
doc.Load(@"
C:
\Users\ChenHua\Desktop\Relation.xml"
);
renrenoperationrenren=new
renrenoperation();
Console.WriteLine("
LoginSuccess"
//获得A的好友
var
peopleList=renren.Get_FriendList("
A的id号码"
foreach
(Personpersonin
peopleList)
node=doc.CreateElement("
Person"
node.SetAttribute("
id"
person.id);
name"
person.name);
school"
person.school);
faceUri"
person.faceUri);
doc.DocumentElement.AppendChild(node);
list2=renren.Get_FriendList(person.id);
Console.WriteLine(person.name+"
WriteSuccess."
//获得A的每一个好友的好友
(Personperson2in
list2)
if
(person2.school.Contains("
某某学校"
)||person2.school.Contains("
南京市"
))
friend=doc.CreateElement("
Friend"
friend.SetAttribute("
person2.id);
person2.name);
person2.school);
person2.faceUri);
node.AppendChild(friend);
}
接下来就是把A的好友的好友提取出来,找出A的好友的好友的好友...(逻辑有点那个...不知道大家有没有想通)
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
static
Main(string[]args)
XML加载完毕."
PersonList=doc.SelectNodes("
//Person"
//所有的Person
(XmlNodeEveryPersonNodein
PersonList)
//Person中所有的节点
(XmlNodeEveryPersonChildNodein
EveryPersonNode.ChildNodes)//每个Person的子节点,朋友
(ContainedThisPerson(EveryPersonChildNode,PersonList))
//如果发现这个朋友已经在Person集合中
{}
else
//如果不存在
NewPersonNode=doc.CreateElement("
//新建一个节点
NewPersonNode.SetAttribute("
EveryPersonChildNode.Attributes["
].InnerText);
//设置id,名字,学校,头像等
{//开始加载这个节点有哪些朋友
(XmlNodeAnotherPersonListin
PersonList)
(XmlNodeAnotherPersonListChildNodein
AnotherPersonList.ChildNodes)
(AnotherPersonListChildNode.Attributes["
].InnerText==NewPersonNode.Attributes["
].InnerText)
newFriendNode=doc.CreateElement("
newFriendNode.SetAttribute("
AnotherPersonListChildNode.ParentNode.Attributes["
NewPersonNode.AppendChild(newFriendNode);
break;
doc.DocumentElement.AppendChild(NewPersonNode);
AddNewNode"
+NewPersonNode.Attributes["
doc.Save(@"
private
bool
ContainedThisPerson(XmlNodenode,XmlNodeListnodeList)
(XmlNodenodeInListin
nodeList)
(node.Attributes["
].InnerText==nodeInList.Attributes["
return
true;
false;
获得一个人的好友列表
上面说了那么多,怎么获得好友列表呢?
1.分析登陆协议,看登陆时POST了哪些信息,写一个登陆方法
2.去
获得第2步每一页的字符串,用正则表达式提取出好友的信息,正则表达式我写好了:
@"
pclass="
avatar"
ahref="
[a-zA-z]+:
//www\.renren\.com/profile\.do\?
id=([0-9]*)"
imgsrc="
([a-zA-z]+:
//href="
[^\s]*"
(.*)<
/a>
[\s]+<
/dd>
[\s]?
.*[\s]?
dt>
.*<
/dt>
dd>
下图是一个获取好友列表的测试图片:
先写这么多,程序还在哗啦啦的运行中,下篇继续...争取多一些程序优化方面的.
的应用——找出两个陌生人之间的关系
(二)
终于"
完工"
哎,熬了好几个夜,掉了好多根头发,终于接近完工,如果真的要拿给别人用还需要修补很多东西.先发几张程序运行的图片吧:
)第一张是找出两人关系,我试了很多人,几乎都只需要通过一个人就能找到另一个人,第二张是寻找XML文件中某个人有哪些好友.
存储内容的改进
在写上篇博客的时候程序一直在运行(在保存人和人之间的完整对应关系),我估算还需要好几个小时才能停下来,所存储的XML文件也会大的惊人,估算达到1GB以上,其实运算之前这个时候的XML中已经包含了所有的人,只不过暂时是一种类似"
有向图"
(A是B的好友,B不是A的好友)的关系,现在运算的也只是把有向图的关系完全拓展开,变成无向图(A是B的好友,B也是A的好友而已).在发现完整关系的情况下,存储所需要的空间如此之大时,我放弃了这种方法.在下载完所有人的头像照片(4万多张)后,我把XML中每个节点的school和faceUri删除掉了,这样存储人与人的关系只用了15.8MB.
现在的存储结构如下:
从这个XML中通过一些XML的操作方法可以就可以得到很多信息了.
RelationOperate类
1.每次定义一个RelationOperate类,需要传进一个XML文件地址,以对它进行操作
XmlDocumentxmlDoc=new
RelationOperate(string
xmlDocPath)
xmlDoc.Load(xmlDocPath);
2.通过一个id找到他的好友列表
///<
summary>
///获取一个id的好友
/summary>
paramname="
要查找的id<
/param>
returns>
该id的好友id列表<
/returns>
List<
string>
getFriend(string
id)
friendList=new
();
PersonList=xmlDoc.SelectNodes("
//所有的Person节点
(XmlNodexmlNodein
//若果Person节点已经包含了该id的用户
(xmlNode.Attributes["
].InnerText==id)
//则增加这个Person节点的每一个子节点到friendList中
//因为他的每一个子节点都是他的好友
(XmlNodenodein
xmlNode.ChildNodes)
friendList.Add(node.Attributes["
friendList;
//上面的条件不满足时,就查找哪些Person的子节点(朋友)里边包含这个id
friendList.Add(xmlNode.Attributes["
3.获取一个id的姓名
string
getName(string
xmlNode.Attributes["
].InnerText;
name="
;
x
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 空间 应用 找出 两个 陌生人 之间 关系
![提示](https://static.bdocx.com/images/bang_tan.gif)