高樓迷論壇南京版數據爬取


目標網址: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哈哈~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM