高楼迷论坛南京版数据爬取

2018/02/26 13:30
阅读数 295

目标网址:http://www.gaoloumi.com/forum.php?mod=forumdisplay&fid=30&page=0

page后面加的数字就是论坛内容的页面数,可以通过改变其值获取南京版的所有页面。

目标:我们知道帖子的名称代表着其内容的主要思想,所以可以通过抓取所有帖子名称来对其进行内容挖掘。

步骤:

  • 抓取网页帖子的名称,保存在文本文件中。
  • 使用jieba分词工具可以实现分词、去除停留词(对文本分析来说无关紧要的词语)、判断词性等功能。
  • 制作词云(可以使用WordCloud库),我这里推荐一个自己喜欢的网站工具:词云统计。这个网站样式好看功能也很强大。

一 分词代码如下:

#对文本进行分词
def get_divide(i):
     filename = 'file' + str(i + 1) + '.txt'
     stop_words = set(line.strip() for line in open('stopwords.txt',encoding = 'utf-8'))

"""
这里要用只读模式打开,否者会将上一个方法写入的内容覆盖掉。
另外要注意用二进制模式( rb(二进制读) , wb(二进制写))打开,否者会编码错误:
UnicodeDecodeError: 'gbk' codec can't decode byte 0x90 in position 2: illegal multibyte sequence

"""
     with open(filename,'rb') as f:
          file = f.readlines()
          for each in file:
               """
               直接jieba.cut()方法会报错:
               not enough values to unpack (expected 2, got 1) 
               先引入jieba.posseg模块就不会。
               
               """
               seg_list = pseg.cut(each)

               #flag是用于判断词性的
               for item,flag in seg_list:               
                    if not item in stop_words and flag == 'n':
                         print(item)

 

 

二 全部代码:

import requests
from bs4 import BeautifulSoup
import re
import time
import jieba
import jieba.posseg as pseg


def getReq(i):
     try:
          url_1 = "http://www.gaoloumi.com/forum.php?mod=forumdisplay&fid=30&page="
          url = url_1 + str(i)
          r = requests.get(url)
          r.raise_for_status
          r.encoding = r.apparent_encoding
          return r.text
     except:
          print('')


#获取html文本    
def getHtml(r):
     soup = BeautifulSoup(r,'lxml')
     html = soup.find_all('a','s xst')
     return html


#将每个页面所有帖子的名称写入文件
def writeHtml(html,i):
     try:
          fileName = 'file' + str( i + 1 ) + '.txt'
          #注意编码格式
          with open(fileName,'w+',encoding = 'utf-8') as f:
               for each in html:
                    f.write(each.string)
                    f.write('\n')
     except:
          pass

#对文本进行分词
def get_divide(i):
     filename = 'file' + str(i + 1) + '.txt'
     stop_words = set(line.strip() for line in open('stopwords.txt',encoding = 'utf-8'))

"""
这里要用只读模式打开,否者会将上一个方法写入的内容覆盖掉。
另外要注意用二进制模式( rb(二进制读) , wb(二进制写))打开,否者会编码错误:
UnicodeDecodeError: 'gbk' codec can't decode byte 0x90 in position 2: illegal multibyte sequence

"""
     with open(filename,'rb') as f:
          file = f.readlines()
          for each in file:
               """
               直接jieba.cut()方法会报错:
               not enough values to unpack (expected 2, got 1) 
               先引入jieba.posseg模块就不会。
               
               """
               seg_list = pseg.cut(each)

               #flag是用于判断词性的
               for item,flag in seg_list:               
                    if not item in stop_words and flag == 'n':
                         print(item)
    

#主函数
def main():
     for i in range(5):
          r = getReq(i)
          html = getHtml(r)
          writeHtml(html,i)
          get_divide(i)
          print("" + str(i+1) + "个网页爬取成功!")
          time.sleep(1)
main()

 

 三 词云统计效果:

 

从词云图中我们可以简单的看出南京的居民更加关注国家对于机场的规划。O(∩_∩)O哈哈~

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部