水木社区
Posted ruidxr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了水木社区相关的知识,希望对你有一定的参考价值。
任务背景:
爬取水木社区某位贴主在所有发帖版面的帖子,分析随时间变化,贴主关注话题的变化。
主要步骤:
1.爬取帖子
这部分的实现源码存于“水木爬虫”文件夹中,运行环境为python3。
1)获取发帖版面:首先是spiderman_007.py,在代码中可设置待爬的贴主id。以贴主VChart为例,运行可得到该贴主发帖的版面及该版面的页数,记录在文件中“VChart.txt”中,
关键代码:
1 while page_num < url[topical]: 2 content = get_url_content(now_url) 3 print(now_url) 4 page_num += 1 5 page_str = str(page_num) 6 now_url = base_url + page_str 7 soup = BeautifulSoup(content, ‘html.parser‘) 8 i = 0 9 name = ‘VChart‘ 10 while i < 20: 11 new_name = soup.find_all("li")[i].next_element.next_sibling.next_element.next_element.next_element 12 13 if new_name == name: 14 f.write("‘" + topical + "‘" + ": " + str(url[topical]) + ", ") 15 i = 21 16 page_num = url[topical] + 1 17 elif new_name is None: 18 i = 21 19 i += 1
部分截图如下:
2)爬取帖子:根据Vchart.txt中的信息,运行spiderman.py可得到该贴主截至目前发布的帖子,记录在文件“VChart_texts.txt”中。
关键代码:
1 now_url = base_url + page_str 2 soup = BeautifulSoup(content, ‘html.parser‘) 3 i = 0 4 name = ‘VChart‘ 5 while i < 20: 6 if soup.find_all("li")[i]: 7 test = soup.find_all("li")[i] 8 else: 9 i += 1 10 continue 11 12 new_name = test.next_element.next_sibling.next_element.next_element.next_element 13 14 if new_name == name: 15 new_url = base_url_+soup.find_all("li")[i].next_element.next_element.get(‘href‘) 16 f.write(new_url) 17 f.write(" ") 18 # time.sleep(1) 19 20 content_ = get_url_content(new_url) 21 soup1 = BeautifulSoup(content_, ‘html.parser‘) 22 # print(soup1.prettify()) 23 s = soup1.select(".sp") 24 print(s[2].previous_sibling()[0].get_text()) 25 f.write(s[2].previous_sibling()[0].get_text()) 26 l = len(s) 27 j = 2 28 while j < l-2: 29 s1 = s[j].get_text() 30 j += 1 31 # c ut=jieba.cut(s) 32 print(s1) 33 f.write(s1) 34 time.sleep(1) 35 i += 1
部分截图如下:
2.对帖子进行排序、分词、聚类
1)排序:对帖子按时间进行排序,运行sort_data.py可得VCharttexts_sorted.txt,
关键代码:
1 def list_sort(list1): 2 pattern = re.compile("[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}") 3 4 print(list1) 5 list2 = re.findall(pattern, str(list1)) 6 list3 = list(zip(list2, list1)) 7 list3 = sorted(list3, key=lambda item: item[0]) 8 list4 = [] 9 for temp in list3: 10 list4.append(temp[1]) 11 return list4
部分截图如下:
2)分词:将帖子按一定时间段分为不同文件,以每一年为一段为例,该贴主的帖子发帖时间为2004-2018年,共分为15个文件存于文档->VChart->time中,运行fenci_time.py可以得到每一段时间文档的分词及词频结果,存于time文件下。
关键代码:
1 def segmented(file, text): 2 ans = re.sub(‘[^wu4e00-u9fff]+‘, "", text) # 正则表达式过滤出汉字 3 ans = "".join(ans.split()) 4 # seg_list = jieba.cut(ans) # 精确模式(默认是精确模式) 5 # print("[精确模式]: ", "/ ".join(seg_list)) 6 words = jieba.cut(ans, cut_all=False) 7 word_freq = {} 8 stopwords = stopwordslist(‘ting.txt‘) 9 for word in words: 10 if word in word_freq: 11 word_freq[word] += 1 12 else: 13 word_freq[word] = 1 14 15 freq_word = [] 16 for word, freq in word_freq.items(): 17 freq_word.append((word, freq)) 18 freq_word.sort(key=lambda x: x[1], reverse=True)
3)分词:运行fenlegeci.py可以得到对所有贴子进行分词、排序并统计词频的文件“fencihou.txt”。
4)取出无用词:将fencihou.txt文件中的内容复制到Excel中,需要手动删去一些无意义和体现不出贴主发贴话题的词,例如“中”“提到”“大作”“水木”等。
5)计算百分比:运行cout_frequency&percent.py可以根据5)、6)中得到的结果得到每个词在每个时间段的词频百分比,生成文件“统计.xls”。词频百分比=该词的词频÷该时间段所有词的词频总数×100%。
关键代码:
1 readbook = xlrd.open_workbook(r‘统计_all.xlsx‘) 2 sheet = readbook.sheet_by_name(‘Sheet1‘) 3 nrows = sheet.nrows 4 f = xlwt.Workbook(encoding=‘utf-8‘) 5 table = f.add_sheet(‘data‘) 6 7 table.write(i, j, 0) 8 f.save("统计.xls")
部分截图如下:
6)生成.csv文件:在A1处填上“word”,将文件另存为“VChart时间词频百分比.csv”,即存为.csv格式的文件,注意编码方式要选择“UTF-8”。该文件可以被用于在weka软件中进行聚类。
7)聚类:打开weka->Explorer->Open file,选则打开6)中的csv文件。
选则Cluster,点击Choose选则SimpleKmeans算法进行聚类。
点击下图红框处可以设置KMeans相关参数。选则“Classes to clusters evaluation”并按“word”聚类,点击“Start”即可运行。
运行结束后,左下角会有运行记录,右键选则Save result buffer可以得到结果文件。
为了方便查看内容,推荐使用Notepad++打开文件。
8)获取聚类结果:weka的运行结果文件中有很多用不到的信息,运行clustering文件夹下的get_class_words.py文件可以得到每一类的词的信息,形式如下:
3.展示
对每一类词随时间变化的展示,主要参考了https://github.com/TangliziGit/ColumnsAnimation.git中的项目。
1)统计每一类词的词频百分比在各个时间段内的平均值,用于展示。
2)使用ColumnsAnimation->data中的getdata.py可以得到自己的展示数据的data.json文件。
3)在data.json文件开头添加“var TotalData=”并另存为“data.js”放在ColumnsAnimation目录下,打开animation.html即可看到展示效果。
项目中的11-24.mp4为效果录屏文件。
本项目地址:https://git.coding.net/Ruidxr/ShuiMu.git
以上是关于水木社区的主要内容,如果未能解决你的问题,请参考以下文章