注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Computer Science

I Pressed My Words Here. Will You Read ?

 
 
 

日志

 
 

《社交网站的数据挖掘 与分析》读书笔记2  

2013-02-03 19:14:33|  分类: 读书笔记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
书名:社交网站的数据挖掘与分析
豆瓣评分:7.0分(233人评价)
博主评价:
未评价很差较差还行推荐力荐
来自豆瓣读书资源
微格式:语义标记和常识碰撞
XFN(XHTML Friends Network)(http://gmpg.org/xfn/)
用途:表示超链接中人类可读的关系
人气:广泛使用,尤其被广泛应用在博客平台中
标记规范:语义HTML、XHTML
类型:微格式
geo(http://microformats.org/wiki/geo)
用途:嵌入人与物体的地理坐标
人气:广泛使用,尤其是被MapQuest和Wikipedia这样的网站广泛使用
标记规范:语义HTML、XHTML
类型:微格式
hCard(http://microformats.org/wiki/hcard)
用途:标识个人、公司和其他联系信息
人气:广泛使用
标记规范:语义HTML、XHTML
类型:微格式
hCalendar
用途:嵌入iCalendar数据
人气:逐渐发挥作用(http://microformats.org/2010/04/28/google-adds-support-for-hcalendar-and-hrecipe-rich-snippets)
标记规范:HTML、XHTML
类型:微格式
hResume
用途:嵌入简历和个人简历信息
人气:被LinkedIn这样的网站广泛使用
标记规范:语义HTML、XHTML
类型:微格式

hRecipe
用途:标识食谱
人气:被foodnet.com这样的利基网站广泛使用
标记规范:语义HTML、XHTML
类型:微格式
微数据
用途:将名称/值对嵌入到HTML5授权的网页中
人气:一项新技术,但已经开始发挥作用(http://googlewebmastercentral.blogspot.com/2010/03/microdata-support-for-rich-snippets.html)
标记规范:HTML5
类型:W3C倡议
RDFa
用途:按照主题专家创造的专业词汇,将明确的事实嵌入到XHTML网页中
人气:随意的依靠专业词汇;FOAF之类的词汇正在稳步发展而其他的仍然默默无闻
标记规范:XHTML(且正在积极尝试嵌入到语义标记和HTML5中(http://www.w3.org/TR/rdfa-in-html))
类型:W3C倡议
开放图谱协议
用途:将现实世界事物的介绍嵌入到XHTML网页中
人气:正在稳步反战,因为Facebook平台的使用而潜力无限(http://www.facebook.com/press/info.php?statistics)
标记规范:XHTML(基于RDFa)
类型:Facebook平台倡议


 microformats_fxn_scrape.py:
# -*- coding: utf-8 -*-

import sys
import urllib2
import HTMLParser
from BeautifulSoup import BeautifulSoup

# Try http://ajaxian.com/
URL = sys.argv[1]
XFN_TAGS = set([
        'colleague'
        ,'sweetheart'
        ,'parent'
        ,'co-resident'
        ,'co-worker'
        ,'muse'
        ,'neighbor'
        ,'sibling'
        ,'kin'
        ,'child'
        ,'date'
        ,'spouse'
        ,'me'
        ,'acquaintance'
        ,'met'
        ,'crush'
        ,'contact'
        ,'friend'
        ])

try:
        page = urllib2.urlopen(URL)
except urllib2.URLError:
        print 'Failed to fetch ' + item

try:
        soup = BeautifulSoup(page)
except HTMLParser.HTMLParseError:
        print 'Failed to parse ' + item

anchorTags = soup.findAll('a')
for a in anchorTags:
        if a.has_key('rel'):
                if len(set(a['rel'].split()) & XFN_TAGS) > 0:
                        tags = a['rel'].split()
                        print a.contents[0], a['href'], tags
run microformats_fxn_scrape.py:
will@ubuntu12041:~/Documents/Documents/Workspace/Python/Code/MiningTheSocialWeb$ python microformats_xfn_scrape.py http://ajaxian.com/
Dion Almaer http://www.almaer.com/blog/ [u'me']
Ben Galbraith http://weblogs.java.net/blog/javaben/ [u'co-worker']
Rey Bango http://reybango.com/ [u'friend']
Michael Mahemoff http://softwareas.com/ [u'friend']
Chris Cornutt http://blog.phpdeveloper.org/ [u'friend']
Rob Sanheim http://www.robsanheim.com/ [u'friend']
Dietrich Kappe http://blogs.pathf.com/agileajax/ [u'friend']
Chris Heilmann http://wait-till-i.com/ [u'friend']
Brad Neuberg http://codinginparadise.org/about/ [u'friend']
示例:2-4:使用深度优先搜索抓取XFN链接(microformats_xfn_crawl.py)
# -*- coding: utf-8 -*-

import sys
import os
import urllib2
from BeautifulSoup import BeautifulSoup
import HTMLParser
import networkx as nx

ROOT_URL = sys.argv[1]

if len(sys.argv) > 2:
        MAX_DEPTH = int(sys.argv[2])
else:
        MAX_DEPTH = 1

XFN_TAGS = set([
        'colleague'
        ,'sweetheart'
        ,'parent'
        ,'co-resident'
        ,'co-worker'
        ,'muse'
        ,'neighbor'
        ,'sibling'
        ,'kin'
        ,'child'
        ,'date'
        ,'spouse'
        ,'me'
        ,'acquaintance'
        ,'met'
        ,'crush'
        ,'contact'
        ,'friend'
        ])

OUT = "graph.dot"

depth = 0 

g = nx.DiGraph()

next_queue = [ROOT_URL]

while depth < MAX_DEPTH:

        depth += 1
        (queue, next_queue) = (next_queue, [])
        
        for item in queue:
                try:
                        page = urllib2.urlopen(item)
                except urllib2.URLError:
                        print 'Failed to fetch ' + item
                        continue

                try:
                        soup = BeautifulSoup(page)
                except HTMLParser.HTMLParseError:
                        print 'Failed to parse ' + item
                        continue

        anchorTags = soup.findAll('a')

        if not g.has_node(item):
                g.add_node(item)

        for a in anchorTags:
                if a.has_key('rel'):
                        if len(set(a['rel'].split()) & XFN_TAGS) > 0:
                                friend_url = a['href']
                                g.add_edge(item, friend_url)
                                g[item][friend_url]['label'] = a['rel'].encode('utf-8')
                                g.node[friend_url]['label'] = a.contents[0].encode('utf-8')

                                next_queue.append(friend_url)

        # Further analysiss of the graph could be accomplished here

if not os.path.isdir('out'):
        os.mkdir('out')

try:
        nx.drawing.write_dot(g, os.path.join('out', OUT))
except ImportError, e:
        print os.path.join('out', OUT)

        # Help for Windows Users:
        #Exploring
        # Not a general purpose method, but representative of 
        # the same output write_dot would provide for this graph
        # if installed and easy to implement

        dot = []
        for (n1, n2) in g.edges():
                dot.append('"%s" [label="%s"]' % (n2, g.node[n2]['label']))
                dot.append('"%s" -> "%s" [label="%s"]' % (n1, n2, g[n1][n2]['label']))

        f = open(os.path.join('out', OUT), 'w')
        f.write('''strict digraph {
        %s
        }''' % (';\n'.join(dot), ))
        f.close()

# *nix users could produce an image file with a good layout
# as follows from a terminal:
# $ circo -Tpng -Ograph graph.dot
# Windows users could use the same options with circo.exe
# or use the GVedit desktop application
注意:第90行(自己数)的 #Exploring在源代码中未被注释,但是在linux下只有注释上了才能正常运行。
用命令python microformats_xfn_crawl.py执行后。终端没有任何输出,结果是多了个含graph.dot文件的out文件夹。内容如下:
strict digraph {
        "http://blog.phpdeveloper.org/" [label="Chris Cornutt"];
"http://ajaxian.com" -> "http://blog.phpdeveloper.org/" [label="friend"];
"http://www.almaer.com/blog/" [label="Dion Almaer"];
"http://ajaxian.com" -> "http://www.almaer.com/blog/" [label="me"];
"http://www.robsanheim.com/" [label="Rob Sanheim"];
"http://ajaxian.com" -> "http://www.robsanheim.com/" [label="friend"];
"http://softwareas.com/" [label="Michael Mahemoff"];
"http://ajaxian.com" -> "http://softwareas.com/" [label="friend"];
"http://reybango.com/" [label="Rey Bango"];
"http://ajaxian.com" -> "http://reybango.com/" [label="friend"];
"http://wait-till-i.com/" [label="Chris Heilmann"];
"http://ajaxian.com" -> "http://wait-till-i.com/" [label="friend"];
"http://codinginparadise.org/about/" [label="Brad Neuberg"];
"http://ajaxian.com" -> "http://codinginparadise.org/about/" [label="friend"];
"http://blogs.pathf.com/agileajax/" [label="Dietrich Kappe"];
"http://ajaxian.com" -> "http://blogs.pathf.com/agileajax/" [label="friend"];
"http://weblogs.java.net/blog/javaben/" [label="Ben Galbraith"];
"http://ajaxian.com" -> "http://weblogs.java.net/blog/javaben/" [label="co-worker"]
        }
根据microformats_xfn_crawl.py末尾的注释,通过命令:circo -Tpng -Ograph graph.dot 将上面的结果转换成了png图片文件。如下:
《社交网站的数据挖掘 与分析》读书笔记2 - computerScience - Computer Science
 
示例:2-6:从MapQuest本地提取geo数据(microformats_mapquest_geo.py)
# -*- coding: utf-8 -*-

import sys
import urllib2
from BeautifulSoup import BeautifulSoup
import HTMLParser

# Pass in a URL such as http://local.mapquest.com/franklin-tn

url = sys.argv[1]
try:
        page = urllib2.urlopen(url)
except urllib2.URLError, e:
        print 'Failed to fetch ' + url
        raise e
        exit()

try:
        soup = BeautifulSoup(page)
except HTMLParser.HTMLParseError:
        print 'Failed to parse ' + url
        exit()

geoTag = soup.find(True'geo')

if geoTag and len(geoTag) > 1:
        lat = geoTag.find(True'latitude').string
        lon = geoTag.find(True'longitude').string
        print 'Location is at', lat, lon
elif geoTag and len(geoTag) == 1:
        (lat, lon) = geoTag.string.split(';')
        (lat, lon) = (lat.strip(), lon.strip())
        print 'Location is at', lat, lon
else:
        print 'No location found'
很遗憾,执行后:
will@ubuntu12041:~/Workspace/Python/Code/MiningTheSocialWeb$ python microformats_mapquest_geo.py http://local.mapquest.com/franklin-tn
Failed to fetch http://local.mapquest.com/franklin-tn
Traceback (most recent call last):
  File "microformats_mapquest_geo.py", line 15, in <module>
    raise e
urllib2.HTTPError: HTTP Error 500: Internal Server Error
好像服务端出了什么问题。
通过浏览器访问了该网站后,找了个有效地址来实验:
will@ubuntu12041:~/Workspace/Python/Code/MiningTheSocialWeb$ python microformats_mapquest_geo.py http://local.mapquest.com/places/franklin-tn
No location found
后来找到了个能让程序取值貌似成功的页面:
will@ubuntu12041:~/Workspace/Python/Code/MiningTheSocialWeb$ python microformats_mapquest_geo.py http://www.mapquest.com/places/chengdu-bellevue-wa-42456945
Location is at None None
结果中之所以为 none none 而非 数值,是因为:
<div class="geo">
        <span class="latitude">
                <span class="value-title" title="47.63149"></span>
        </span>
        <span class="longitude">
                <span class="value-title" title="-122.14451"></span>
        </span>
</div>
页面对应位置为空,而信息写在title里的……默哀半分钟
然后将26行的if判断中的代码作如下修改:
if geoTag and len(geoTag) > 1:
        #lat = geoTag.find(True, 'latitude').string
        lat = geoTag.find(True'latitude')
        lat = lat.find(True'value-title')
        lat = lat.get('title')
lon也作相同修改便能得到地理坐标信息了:
will@ubuntu12041:~/Workspace/Python/Code/MiningTheSocialWeb$ python microformats_mapquest_geo.py http://www.mapquest.com/places/chengdu-bellevue-wa-42456945
Location is at 47.63149 -122.14451
接触Python第三天,感觉不错啊。


KML ( Keyhole Markup Language, Keyhole标记语言 )( http://code.google.com/apis/kml/documentation/ )可用于输出可视化geo数据。
示例:
http://en.wikipeddia.org/wiki/List_of_U.S._national_parks页面上有美国国家公园的相关地理信息。将此地址粘贴到http://microformat.ats上,便能得到KML和其他微格式。
将结果中的KML格式文件地址粘贴到https://maps.google.com中搜索便能得到美国国家公园在地图上的位置。
《社交网站的数据挖掘 与分析》读书笔记2 - computerScience - Computer Science
 
另外Firefox Operator插件(https://addons.mozilla.org/en-US/firefox/addon/4106)扩展插件是一个和geo数据有关的应用。


Page 45 小结
微格式是一种装饰标记的方法,是用来显示菜谱、联系方式和人际关系这些特定类型的结构化信息。
基于HTML5的微数据(http://www.w3c.org/TR/html5/microdata.html)有惊人的 创新,因为HTML5获得了市场的占有率。
Google的社交图谱API(http://code.google.com/apis/socialgraph/)其与Facebook的基于RDFa的(http://en.wikipedia.org/wiki/RDFa)开放图谱协议(http://developers.facebook.com/docs/api)或相关的图形API(http://developers.facebook.com/docs/api)不同。那些API包括XFN(http://gmpg.org/xfn/)、FOAF(http://www.foaf-project.org)和其他过哦给你看声明的链接的索引。
  评论这张
 
阅读(13)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017