抽取网络信息进行数据挖掘 建立语料库

最近的实习项目需要做一个大数据库(语料库),采集博客、微博、问答库的信息。将数据库的内容进行训练,最后应该是做成一个类似中文siri的模型吧。

第一步新闻抓取器已经稳定运行了,基本原理用的是爬虫去爬新闻门户网站的代码,可以看到各新闻节点是比较规范的:存在<li>或者<table>节点下,有标题、时间、新闻链接。

找到这些特征就好办了,通过Winista.HtmlParser把节点都提取出来。判断是否符合定义的新闻格式。

当然,这里用到正则表达式

最近在看关于微博抓取的资料,发现数据挖掘这个领域太奇妙了。感慨自己学识有限啊。这里收集一些有意思的东西。先把一些东西备份,现在看不懂的,说不定以后能看懂。

 

1.获取新浪微博1000w用户的基本信息和每个爬取用户最近发表的50条微博

http://www.oschina.net/code/snippet_209440_13633?p=2#comments

虽然不懂python语言,但是有同学也在做这个,感觉以后肯定还是会接触到的。

但是这个方法不是那么好实现的,首先新浪API不会给普通用户每天50,000w这么多的连接数。你只能借用某个顶级应用的身份去获取,除了新浪官方或者ZF,谁还能这么牛B?

View Code
#!/usr/bin/python
#-*-coding:utf8-*-from pprint import pprint
from weibopy.auth import OAuthHandler
from weibopy.api import API
from weibopy.binder import bind_api
from weibopy.error import WeibopError
import time,os,pickle,sys
import logging.config 
from multiprocessing import Process
from pymongo import Connectionmongo_addr = 'localhost'
mongo_port = 27017
db_name = 'weibo'class Sina_reptile():"""爬取sina微博数据"""def __init__(self,consumer_key,consumer_secret):self.consumer_key,self.consumer_secret = consumer_key,consumer_secretself.connection = Connection(mongo_addr,mongo_port)self.db = self.connection[db_name]self.collection_userprofile = self.db['userprofile']self.collection_statuses = self.db['statuses']def getAtt(self, key):try:return self.obj.__getattribute__(key)except Exception, e:print ereturn ''def getAttValue(self, obj, key):try:return obj.__getattribute__(key)except Exception, e:print ereturn ''def auth(self):"""用于获取sina微博  access_token 和access_secret"""if len(self.consumer_key) == 0:print "Please set consumer_key"returnif len(self.consumer_key) == 0:print "Please set consumer_secret"returnself.auth = OAuthHandler(self.consumer_key, self.consumer_secret)auth_url = self.auth.get_authorization_url()print 'Please authorize: ' + auth_urlverifier = raw_input('PIN: ').strip()self.auth.get_access_token(verifier)self.api = API(self.auth)def setToken(self, token, tokenSecret):"""通过oauth协议以便能获取sina微博数据"""self.auth = OAuthHandler(self.consumer_key, self.consumer_secret)self.auth.setToken(token, tokenSecret)self.api = API(self.auth)def get_userprofile(self,id):"""获取用户基本信息"""try:userprofile = {}userprofile['id'] = iduser = self.api.get_user(id)self.obj = useruserprofile['screen_name'] = self.getAtt("screen_name")userprofile['name'] = self.getAtt("name")userprofile['province'] = self.getAtt("province")userprofile['city'] = self.getAtt("city")userprofile['location'] = self.getAtt("location")userprofile['description'] = self.getAtt("description")userprofile['url'] = self.getAtt("url")userprofile['profile_image_url'] = self.getAtt("profile_image_url")userprofile['domain'] = self.getAtt("domain")userprofile['gender'] = self.getAtt("gender")userprofile['followers_count'] = self.getAtt("followers_count")userprofile['friends_count'] = self.getAtt("friends_count")userprofile['statuses_count'] = self.getAtt("statuses_count")userprofile['favourites_count'] = self.getAtt("favourites_count")userprofile['created_at'] = self.getAtt("created_at")userprofile['following'] = self.getAtt("following")userprofile['allow_all_act_msg'] = self.getAtt("allow_all_act_msg")userprofile['geo_enabled'] = self.getAtt("geo_enabled")userprofile['verified'] = self.getAtt("verified")#            for i in userprofile:
#                print type(i),type(userprofile[i])
#                print i,userprofile[i]
#            except WeibopError, e:      #捕获到的WeibopError错误的详细原因会被放置在对象e中print "error occured when access userprofile use user_id:",idprint "Error:",elog.error("Error occured when access userprofile use user_id:{0}\nError:{1}".format(id, e),exc_info=sys.exc_info())return Nonereturn userprofiledef get_specific_weibo(self,id):"""获取用户最近发表的50条微博"""statusprofile = {}statusprofile['id'] = idtry:#重新绑定get_status函数get_status = bind_api( path = '/statuses/show/{id}.json', payload_type = 'status',allowed_param = ['id'])except:return "**绑定错误**"status = get_status(self.api,id)self.obj = statusstatusprofile['created_at'] = self.getAtt("created_at")statusprofile['text'] = self.getAtt("text")statusprofile['source'] = self.getAtt("source")statusprofile['favorited'] = self.getAtt("favorited")statusprofile['truncated'] = self.getAtt("ntruncatedame")statusprofile['in_reply_to_status_id'] = self.getAtt("in_reply_to_status_id")statusprofile['in_reply_to_user_id'] = self.getAtt("in_reply_to_user_id")statusprofile['in_reply_to_screen_name'] = self.getAtt("in_reply_to_screen_name")statusprofile['thumbnail_pic'] = self.getAtt("thumbnail_pic")statusprofile['bmiddle_pic'] = self.getAtt("bmiddle_pic")statusprofile['original_pic'] = self.getAtt("original_pic")statusprofile['geo'] = self.getAtt("geo")statusprofile['mid'] = self.getAtt("mid")statusprofile['retweeted_status'] = self.getAtt("retweeted_status")return statusprofiledef get_latest_weibo(self,user_id,count):"""获取用户最新发表的count条数据"""statuses,statusprofile = [],{}try:            #error occur in the SDKtimeline = self.api.user_timeline(count=count, user_id=user_id)except Exception as e:print "error occured when access status use user_id:",user_idprint "Error:",elog.error("Error occured when access status use user_id:{0}\nError:{1}".format(user_id, e),exc_info=sys.exc_info())return Nonefor line in timeline:self.obj = linestatusprofile['usr_id'] = user_idstatusprofile['id'] = self.getAtt("id")statusprofile['created_at'] = self.getAtt("created_at")statusprofile['text'] = self.getAtt("text")statusprofile['source'] = self.getAtt("source")statusprofile['favorited'] = self.getAtt("favorited")statusprofile['truncated'] = self.getAtt("ntruncatedame")statusprofile['in_reply_to_status_id'] = self.getAtt("in_reply_to_status_id")statusprofile['in_reply_to_user_id'] = self.getAtt("in_reply_to_user_id")statusprofile['in_reply_to_screen_name'] = self.getAtt("in_reply_to_screen_name")statusprofile['thumbnail_pic'] = self.getAtt("thumbnail_pic")statusprofile['bmiddle_pic'] = self.getAtt("bmiddle_pic")statusprofile['original_pic'] = self.getAtt("original_pic")statusprofile['geo'] = repr(pickle.dumps(self.getAtt("geo"),pickle.HIGHEST_PROTOCOL))statusprofile['mid'] = self.getAtt("mid")statusprofile['retweeted_status'] = repr(pickle.dumps(self.getAtt("retweeted_status"),pickle.HIGHEST_PROTOCOL))statuses.append(statusprofile)return statusesdef friends_ids(self,id):"""获取用户关注列表id"""next_cursor,cursor = 1,0ids = []while(0!=next_cursor):fids = self.api.friends_ids(user_id=id,cursor=cursor)self.obj = fidsids.extend(self.getAtt("ids"))cursor = next_cursor = self.getAtt("next_cursor")previous_cursor = self.getAtt("previous_cursor")return idsdef manage_access(self):"""管理应用访问API速度,适时进行沉睡"""info = self.api.rate_limit_status()self.obj = infosleep_time = round( (float)(self.getAtt("reset_time_in_seconds"))/self.getAtt("remaining_hits"),2 ) if self.getAtt("remaining_hits") else self.getAtt("reset_time_in_seconds")print self.getAtt("remaining_hits"),self.getAtt("reset_time_in_seconds"),self.getAtt("hourly_limit"),self.getAtt("reset_time")print "sleep time:",sleep_time,'pid:',os.getpid()time.sleep(sleep_time + 1.5)def save_data(self,userprofile,statuses):self.collection_statuses.insert(statuses)self.collection_userprofile.insert(userprofile)def reptile(sina_reptile,userid):ids_num,ids,new_ids,return_ids = 1,[userid],[userid],[]while(ids_num <= 10000000):next_ids = []for id in new_ids:try:sina_reptile.manage_access()return_ids = sina_reptile.friends_ids(id)ids.extend(return_ids)userprofile = sina_reptile.get_userprofile(id)statuses = sina_reptile.get_latest_weibo(count=50, user_id=id)if statuses is None or userprofile is None:continuesina_reptile.save_data(userprofile,statuses)except Exception as e:log.error("Error occured in reptile,id:{0}\nError:{1}".format(id, e),exc_info=sys.exc_info())time.sleep(60)continueids_num+=1print ids_numif(ids_num >= 10000000):breaknext_ids.extend(return_ids)next_ids,new_ids = new_ids,next_idsdef run_crawler(consumer_key,consumer_secret,key,secret,userid):try:sina_reptile = Sina_reptile(consumer_key,consumer_secret)sina_reptile.setToken(key, secret)reptile(sina_reptile,userid)sina_reptile.connection.close()except Exception as e:print elog.error("Error occured in run_crawler,pid:{1}\nError:{2}".format(os.getpid(), e),exc_info=sys.exc_info())if __name__ == "__main__":logging.config.fileConfig("logging.conf")log = logging.getLogger('logger_sina_reptile')with open('test.txt') as f:for i in f.readlines():j = i.strip().split(' ')p = Process(target=run_crawler, args=(j[0],j[1],j[2],j[3],j[4]))p.start()

 

2、MetaSeeker抓取新浪微博

不知为啥博客园对此网站设定为非法词汇

只能截图了

 

基于FireFox浏览器插件的工具,功能很强大,原理应该是基于DOM的网页结构分析和正则表达式提取。

不过使用者貌似不需要了解很多,只要按照教程掌握使用方法既可以轻松抓取内容。不过只能说是半自动的,貌似数据还得传到云端。

MetaStudio使用示例
既然知道这个东西的人,那我就不做详细介绍了,简单地说,就是一个firefox上的插件,可以抓取web页面上的信息。这里就用新浪微博为范例,说明一下如何使用MetaStudio。首先,在firefox中登陆微博(这里建议登陆Xweibo,一个新浪的开放平台,对于抓取数据更为便利http://demo.x.weibo.com/)。任意打开某个人的微博,我想要抓取这个人所发过的所有的微博,怎么办?好吧,如果你想手工一条一条来或者手工一页一页来也行啊。不开玩笑,这里使用MetaStudio抓取数据。打开了某个人的微博之后,打开插件MetaStudio,在地址栏中输入同样的网址。并将地址栏右侧的可选项打上勾。之后,在右侧Theme Editor里面,输入你的主题名,这个是任意的。假设我输入的是“dang1”作为主题名。等到下方会出现那个微薄的页面。之后建议将这个页面一直往下拖到底,如果拖到底之后它会继续刷新,那你就继续拖,直到它不刷为止。这个时候,打开菜单栏中的文件,点击“刷新DOM”。然后就进入下一步。在右侧选择Clue Editor选项卡,点击newClue。单选的那个点,选择Marker。NewClue左侧旁边的两个也要勾上。为了以防万一,可以再刷新一下DOM。点击下面,浏览器当中的下一页。这个是要作为翻页的节点记号。然后再左边的那段地方,上下拖拉直到找到被选中的那一行。展开它,然后选择SPAN下面的#text,注意选中它之后,右边的文本内容会显示为下一页。右击这个#text,线索映射,记号映射。之后向上找到class名为list-footer的那一行,右击,线索映射,线索映射,s_clue 0。

接下来,点击Bucket Editor选项卡,点击newBckt。随便取个名字(如abc),点击确定。此时右边会出现一个abc。右击abc,添加包容。这个部分就根据自己的需要来设定。加入这里我要想抓取微博发出来的时间,评论数,转发数,内容这四点。那我就在信息属性里面填写内容,选上key,然后确定。同样的方法添加其他的包容。然后来到下方浏览器里面,任意点击一条微博的内容,然后又在左侧找到选中的那一行。找到#text是该条微博内容的一行,右击,内容映射,内容。往上找到feed-content,右击,FreeFormat映射,abc。然后其他的包容也是用相同的方法,只是可以省略feed-content这一步。最后,在菜单配置里面只选中积极模式,首选项里面都选中偏向class。。点击右上角的保存,搞定!

 

3、 ROST DetailMinner——武汉大学ROST虚拟学习团队开发的一款用于采集网页信息的情报分析软件
http://www.fanpq.com/

 

4、关于使用R语言对微博进行提取和信息可视化的东西

http://chen.yi.bo.blog.163.com/blog/static/15062110920120151191189/

挺有意思的,第一次听说R语言,词云和传播途径形成可视化确实让我眼前一亮。

主要的启发是,去weibo.cn(微博手机版)提取信息!因为weibo.com的源码貌似加密了。看不到实际的文字。

 

由于本人专业电子的(不务正业),对数据挖掘领域知识欠缺,欢迎拍砖。当然也是记录自己学习进步的过程。

 

 

转载于:https://www.cnblogs.com/zhangweilong/archive/2012/11/03/2753133.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四旋翼无人机调研结果

P.S&#xff1a;作者曾在大学某次小班课上看到该视频&#xff0c;深深被震撼了&#xff0c;因此对无人机念念不忘。 恰逢某课程要求讲解自己喜欢的领域的内容&#xff0c;因此对四旋翼无人机进行了调研。

选购四轴飞行器的部件

内容截于&#xff1a;http://www.loveuav.com/article-191-1.html

重复编辑命令行

为什么80%的码农都做不了架构师&#xff1f;>>> 要想重复前面已经输入的命令&#xff0c;请按向上方向键。每按这个键一次&#xff0c;shell都会显示前一个命令行。要想重新执行所显示的命令行&#xff0c;请按回车键。按向下方向键&#xff0c;则可以沿着相反的方…

hadoop2.2.0 分布式存储hdfs完全分布式搭建及功能测试记录(一)----架构及原理介绍...

0.文档说明&#xff1a;本文是围绕hadoop2.2的分布式文件系统hdfs进行分布式存储功能测试&#xff0c;形成的hdfs分布式存储功能测试报告&#xff0c;其中主要包括三大部分内容&#xff1a;第一部分介绍了hdfs的基本原理&#xff1b;第二部分介绍了hadoop2.2的完全分布式集群安…

宏定义函数container_of的解释

从kernel里面抠出的一些与宏container_of有关的代码&#xff0c;如下&#xff1a; 1、此宏作用是从结构体的某元素&#xff08;member&#xff09;出发&#xff0c;得到结构体的首地址&#xff1b; 2、container_of的参数解释 &#xff08;1&#xff09;type&#xff1a;指的是…

【ASP.NET Web API教程】2.3 与实体框架一起使用Web API

2.3 Using Web API with Entity Framework 2.3 与实体框架一起使用Web API 本小节是ASP.NET Web API第2章的第3小节&#xff0c;原文共分为7个部分&#xff0c;分成了7篇文章&#xff0c;故这里也分为7个帖子贴出&#xff0c;以下是本小节的第1部分 — 译者注。 Part 1: Overvi…

ITTC数据挖掘平台介绍(综述)——平台简介

数据挖掘方兴未艾&#xff0c;大量新事物层出不穷。本系列将介绍我们自主设计的数据挖掘软件平台。与大家共同分享对知识&#xff0c;微博&#xff0c;人际等复杂网络的分析&#xff0c;以及对自然语言处理的见解。 一、我们需要怎样的数据挖掘系统 一直以来&#xff0c;以高校…

Linux—程序包安装与管理

1、软件包是对于一种软件所进行打包的方式。在不同的操作系统中&#xff0c;软件包的类型有很大的区别。对于Linux系统中&#xff0c;软件包主要以两种形式出现&#xff1a;二进制包以及源代码包。二进制包&#xff1a;1&#xff09;传统的red hat linux二进制包2&#xff09;d…

Master-Detail(主表明细),确认可以出货的SQL指令 -- Not Exists

这是我文章的备份&#xff0c;原文请看&#xff1a; http://www.dotblogs.com.tw/mis2000lab/archive/2011/08/18/master_detail_finish_and_shipping.aspx [补充]下集&#xff0c;第十四章。Master-Detail&#xff08;主表明细&#xff09;&#xff0c;确认可以出货的SQL指令…

开发板——X210开发板的SD卡启动方式

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 前言与总结 这里说的SD卡启动方式&#xff0c;指的是uboot在SD卡中或者在inand里&#xff0c;且启动介质拨码开关选择SD卡启动方式&#xff08;对于X210&#xff0c;是拨到远离电源键的一侧&#xf…

使用iBATIS3.0完成增删改查

为什么80%的码农都做不了架构师&#xff1f;>>> 使用iBATIS3.0完成增删改查 iBATIS3.0和以前的版本有一些改变&#xff0c;不过学过以前版本的再学习3.0应该不是太难&#xff0c;3.0要求JDK1.5支持&#xff0c;因为其中增加了注解和泛型&#xff0c;这些都是JDK1.5…

oracle-11g-R2监听文件配置

客户端连接oracle数据库时出现如下错误&#xff1a; Listener refused the connection with the following error: ORA-12514, TNS:listener does not currently know of service requested in connect descriptor 首先看看Oracle服务是否开启&#xff1a; 然后找到listener.or…

【C】strcpy()需谨慎使用;

大家都知道C中的strcpy()函数是用来复制字符串的库函数。先附上代码看看strcpy()函数的功能&#xff1a; 1 #include<stdio.h>2 #include<string.h>3 #define MAX 204 5 int main(void)6 {7 char a[MAX]"abc";8 char b[MAX]"abcdefghi"…

多重指针操作

之前对多重指针操作心存忐忑&#xff0c;不能很熟练使用&#xff0c;本质原因是不了解其实质&#xff0c;因此对其进行了学习。 一、简单的代码如下 #include <stdio.h> #include <stdlib.h> #include <string.h>void myArray(char ***p2, int num) {int i0;…

嵌入式Linux系统的构成和启动总结

以下内容源于网络资源的整理&#xff0c;如有侵权请告知删除。 一、嵌入式Linux系统典型结构 Flash划分成以下4个区&#xff1a; &#xff08;1&#xff09;Bootloader区。存放的是Bootloader&#xff0c;它负责嵌入式系统最初的硬件初始化、驱动和内核加载。 &#xff08;2&…

根文件系统的简介

以下内容源于网络资源的整理&#xff0c;如有侵权请告知删除。 一、文件系统 文件系统是对一个存储设备上的数据进行组织的机制。这种机制有利于用户和操作系统的交互。 尽管内核是 Linux 的核心&#xff0c;但文件却是用户与操作系统交互所采用的主要工具。对Linux来说尤其如…

函数指针的使用

在学习群里看到的一个程序&#xff0c;基本说明了函数指针的用法。就摘录如下&#xff1a;

CreateThread和_beginthread的区别

1.程序&#xff1a;程序构成&#xff1a;(1)源代码(2)可执行的二进制代码程序是指令和数据的有序集合&#xff0c;其本身没有任何运行的含义&#xff0c;是一个静态的概念。由操作系统加载其可执行的二进制代码&#xff0c;分配相应的数据结构&#xff1a;进程控制块PCB(Proces…

冒泡排序 Bubble Sort

冒泡排序 冒泡排序的过程很简单&#xff0c;就是不断比较相邻两个元素的大小关系&#xff0c;若逆序则交换之&#xff0c;这样通过一轮的比较&#xff0c;关键字最大的记录就沉底了。 一般地说&#xff0c;第i趟冒泡排序是从第一个元素起到第n-i1个元素依次比较相邻两个记录的关…

从源码到可执行程序的步骤

以下内容源于朱有鹏《物联网大讲堂》课程的学习整理&#xff0c;以及网页http://mp.weixin.qq.com/s/_iVrUtA-jgE8XAR-vKYcww的学习整理。如有侵权&#xff0c;请告知删除。 一、总结 从源码到可执行程序的步骤&#xff1a;预编译、编译、汇编、链接。前三个宏观上为编译&…