前两天看见一篇分析豆瓣上对战狼2评论的分析,觉得挺好玩,就有了这篇文章。PS:顺便吐槽一下,本来pthon对中文的支持就不很友好,然后qq好友的昵称……你懂的,在这里把我快逼疯了,一会encode一会deconde,一会gb2312一会utf-8,只有这个时候觉得还是c#人性那么一丢丢~
1. 数据获取
访问qq空间是需要密码的,直接用爬虫还需要很多额外的工作量,这个不是重点,就直接打开qq空间 进到某人的说说下,然后F12吧
2. 数据提取
需要找到要提取的数据的模式,其中包括:说说的内容、发表时间、点赞好友列表、评论和主人回复,最后加一个每一条说说的模式
self.contentPattern = r'<li class="f-single'#一条说说的模式
self.titlePattern = r'<div class="f-info">(.|\n)*?</div>'#说说标题,内容
self.nickNamePattern = r'<div class="user-list">(.|\n)*?</div>'#点赞的好友昵称
self.visitorMsgPattern = r'<li class="comments-item bor3" data-type="commentroot"(.|\n)*?</li>'#评论的内容
self.shoushuoTimePattern = r'<span class=" ui-mr8 state">(.|\n)*?</span>'#发说说的时间
其中第一个,用正则表达式出来的结果很不满意,最终用了字符查找来分割的(有点不好看,不过效果还不错)
def __GetShoushouItem__(self,filePath):
itemList = []
contentList = []
contentFile = open(filePath,'r')
content = ''
try:
content = contentFile.read()
index = content.find(self.contentPattern,0)
while index != -1:
itemList.append(index)
index = content.find(self.contentPattern,index + 1)
contentList.append(content[itemList[len(itemList) - 1]:index].decode('utf-8'))
finally:
contentFile.close()
return contentList
用模式提取之后,还是包含了大量的html标签,这个时候就可以用BeautifulSoup了
#分析标题模块内的内容,返回说说的标题内容
#titleContent:由titlePattern得到的div内容块
def __TitlePatternAnalysis__(self,content):
rePattern = re.search(self.titlePattern,content)
titleContent = rePattern.group(0) if rePattern != None else ''
soup = BeautifulSoup(titleContent)
return soup.get_text()
把感兴趣的内容都如此操作一番后,把得到的数据格式化后就可以提交到下个处理单元啦
3. 数据整理、分析
定义一个一条说说的数据结构:
class ShoushouItem:
def __inti__(self):
self.title = ''
self.nickList = []
self.nickNum = ''
self.vistorMsg = {}
self.shoushouTime = ''
然后分析这个结构的列表就ok了
比如哪个好友给你点赞最多:
#每个好友曾经的点赞次数
def __GetAllNickPraise__(self):
nickdic = {}
for item in self.contentList:
for name in item.nickList:
if nickdic.get(name) == None:
nickdic[name] = 1
else:
nickdic[name] += 1
return nickdic
把这个字典存成一个有格式的文件
def CreateUserTable(self):
paraiseUserDic = self.__GetAllNickPraise__()
f = open("out.txt","w")
for key in paraiseUserDic:
temp = key.encode('utf-8') + ',' + str(paraiseUserDic[key]) + '\r\n'
f.writelines(temp)
f.close()
1. 数据获取
访问qq空间是需要密码的,直接用爬虫还需要很多额外的工作量,这个不是重点,就直接打开qq空间 进到某人的说说下,然后F12吧
2. 数据提取
需要找到要提取的数据的模式,其中包括:说说的内容、发表时间、点赞好友列表、评论和主人回复,最后加一个每一条说说的模式
self.contentPattern = r'<li class="f-single'#一条说说的模式
self.titlePattern = r'<div class="f-info">(.|\n)*?</div>'#说说标题,内容
self.nickNamePattern = r'<div class="user-list">(.|\n)*?</div>'#点赞的好友昵称
self.visitorMsgPattern = r'<li class="comments-item bor3" data-type="commentroot"(.|\n)*?</li>'#评论的内容
self.shoushuoTimePattern = r'<span class=" ui-mr8 state">(.|\n)*?</span>'#发说说的时间
其中第一个,用正则表达式出来的结果很不满意,最终用了字符查找来分割的(有点不好看,不过效果还不错)
def __GetShoushouItem__(self,filePath):
itemList = []
contentList = []
contentFile = open(filePath,'r')
content = ''
try:
content = contentFile.read()
index = content.find(self.contentPattern,0)
while index != -1:
itemList.append(index)
index = content.find(self.contentPattern,index + 1)
contentList.append(content[itemList[len(itemList) - 1]:index].decode('utf-8'))
finally:
contentFile.close()
return contentList
用模式提取之后,还是包含了大量的html标签,这个时候就可以用BeautifulSoup了
#分析标题模块内的内容,返回说说的标题内容
#titleContent:由titlePattern得到的div内容块
def __TitlePatternAnalysis__(self,content):
rePattern = re.search(self.titlePattern,content)
titleContent = rePattern.group(0) if rePattern != None else ''
soup = BeautifulSoup(titleContent)
return soup.get_text()
把感兴趣的内容都如此操作一番后,把得到的数据格式化后就可以提交到下个处理单元啦
3. 数据整理、分析
定义一个一条说说的数据结构:
class ShoushouItem:
def __inti__(self):
self.title = ''
self.nickList = []
self.nickNum = ''
self.vistorMsg = {}
self.shoushouTime = ''
然后分析这个结构的列表就ok了
比如哪个好友给你点赞最多:
#每个好友曾经的点赞次数
def __GetAllNickPraise__(self):
nickdic = {}
for item in self.contentList:
for name in item.nickList:
if nickdic.get(name) == None:
nickdic[name] = 1
else:
nickdic[name] += 1
return nickdic
把这个字典存成一个有格式的文件
def CreateUserTable(self):
paraiseUserDic = self.__GetAllNickPraise__()
f = open("out.txt","w")
for key in paraiseUserDic:
temp = key.encode('utf-8') + ',' + str(paraiseUserDic[key]) + '\r\n'
f.writelines(temp)
f.close()
利用在线云图生成工具,把上面的文件导入,点击生成就ok了,点赞次数的好友图有出卖好友的嫌疑就不贴了,只贴一张主人回复的词频图吧