1. 程式人生 > >輿情分析專案-重慶公交墜江原因

輿情分析專案-重慶公交墜江原因

輿情分析專案

1、分析事件:重慶公交墜江原因
2、分析物件:
(1)網友評論(初級分類-分詞匹配;高階分類-自然語言識別,對映人類情感和意圖,比如:積極、消極、無奈、諷刺、建設、謾罵、理性分析、事後、和事佬等)
(2)評論者的公網IP(依據公網IP識別不同地域的網路使用者,對本次事件的關注度)
(3)評論者的省份屬性(同上)
3、資料來源:
新浪評論:http://comment5.news.sina.com.cn/comment/skin/default.html?channel=gn&newsid=comos-hnfikve6671738&group=0
4、其他:
準備資料:
(1)中國的行政區劃資料,包括全國的省、市、縣
(2)世界的國家資料

(一)輿情分析專案之資料準備:採集評論資料

1、採集欄位

三個欄位:評論、IP、省份
其他欄位:收到點贊數等等

2、Python實現資料採集

檔案結構

 

(1)python主程式碼

 busremark.py中

import json
import requests
import pymysql
import time as timeimport
from mylog import Logger

logger1 = Logger(logfile='log1.log', logname="log1", logformat=1).getlog()  # 使用自定義日誌物件

# 連線資料庫
connect = pymysql.Connect(
    host='localhost',
    port=3306,
    user='root',
    passwd='root',
    db='analyze',
    charset='utf8'
)
# 獲取遊標
cursor = connect.cursor()

# 建立資料庫語句


for page_num in range(1, 6001):  # 從1採集到6000條評論

    if page_num % 50 == 0:  # 每採集50條資料,休息2秒
        timeimport.sleep(2)

    url = "http://comment5.news.sina.com.cn/page/info?version=1&format=js&channel=gn&newsid=comos-hnfikve6671738&group=0&compress=0&ie=utf8&oe=utf8&page=" + str(
        page_num) + "&page_size=1&jsvar=loader_1541133929419_28637561"
    # url = "http://comment5.news.sina.com.cn/page/info?version=1&format=js&channel=gn&newsid=comos-hnfikve6671738&group=0&compress=0&ie=gbk&oe=gbk&page=1&page_size=2&jsvar=loader_1541133929419_28637561"

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
    }
    try:  # 嘗試採集
        # 發出請求獲取響應
        response = requests.get(url, headers=headers)
        data_str = response.content.decode('unicode_escape')
        # 排除干擾字串
        data_str = data_str.lstrip("var loader_1541133929419_28637561=")
        # print(data_str)
        # str轉字典
        data_dict = json.loads(data_str)
        print(type(data_dict))
        # 獲取每次響應中的所有評論
        all_remarks = data_dict['result']['cmntlist']
        print(len(all_remarks))

        i = 0
        for c in all_remarks:  # 遍歷每次響應中的評論,並存入mysql
            i += 1
            print(i, "*" * 100)
            nick = c["nick"]  # 暱稱
            content = c["content"]  # 評論
            agree = int(c["agree"])  # 收到點贊
            area = c["area"]  # 地區
            ip = c["ip"]  # 源ip
            time = c["time"]  # 評論釋出時間
            profile_img = c["profile_img"]  # 頭像

            print(nick)
            print(content)
            print(agree)
            print(ip)
            print(time)
            print(profile_img)

            # sql操作
            # 增加資料操作
            sql_1 = "insert into all_remarks(nick, content, agree, area, ip, time, profile_img) values(%s,%s,%s,%s,%s,%s,%s)"
            data = (nick, content, agree, area, ip, time, profile_img)
            cursor.execute(sql_1, data)  # 生成增加sql語句
            connect.commit()  # 確認永久執行增加
    except Exception as e:  # 採集異常處理
        my_e = str(e) + " ==> " + str(url)
        logger1.warning(my_e)  # 定義除錯日誌內容
        # print(my_e)
        continue  # 忽視異常,進行後面的採集

  

 

(2)python日誌

 mylog.py中

# 開發一個日誌系統, 既要把日誌輸出到控制檯, 還要寫入日誌檔案
import logging

# 用字典儲存輸出格式
format_dict = {
    1: logging.Formatter('%(asctime)s - %(name)s - %(filename)s - %(levelname)s - %(message)s'),
    2: logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
    3: logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
    4: logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
    5: logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
}


class Logger():
    def __init__(self, logfile, logname, logformat):
        '''
           指定儲存日誌的檔案路徑,日誌級別,以及呼叫檔案
           將日誌存入到指定的檔案中
        '''

        # 建立一個logger
        self.logger = logging.getLogger(logname)
        self.logger.setLevel(logging.DEBUG)

        # 建立一個handler,用於寫入日誌檔案
        fh = logging.FileHandler(logfile)
        fh.setLevel(logging.DEBUG)

        # 再建立一個handler,用於輸出到控制檯
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)

        # 定義handler的輸出格式
        # formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        formatter = format_dict[int(logformat)]
        fh.setFormatter(formatter)
        ch.setFormatter(formatter)

        # 給logger新增handler
        self.logger.addHandler(fh)
        self.logger.addHandler(ch)

    def getlog(self):
        return self.logger


if __name__ == '__main__':
    logger1 = Logger(logfile='log1.txt', logname="fox1", logformat=1).getlog()
    logger1.debug('i am debug')
    logger1.info('i am info')
    logger1.warning('i am warning')
    logger2 = Logger(logfile='log2.txt', logname="fox2", logformat=2).getlog()
    logger2.debug('i am debug2')
    logger2.info('i am info2')
    logger2.warning('i am warning2')

  


3、sql建表語句

 

/*
Navicat MySQL Data Transfer

Source Server         : win7_local
Source Server Version : 50717
Source Host           : localhost:3306
Source Database       : analyze

Target Server Type    : MYSQL
Target Server Version : 50717
File Encoding         : 65001

Date: 2018-11-02 17:12:24
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for all_remarks
-- ----------------------------
DROP TABLE IF EXISTS `all_remarks`;
CREATE TABLE `all_remarks` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `nick` varchar(255) DEFAULT NULL,
  `content` text,
  `agree` int(10) DEFAULT NULL,
  `area` varchar(100) DEFAULT NULL,
  `ip` varchar(20) DEFAULT NULL,
  `time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `profile_img` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

  

4、效果截圖

 


 

以上工作僅實現了主要資料的準備,還有一些省份資料、國家名資料的準備。

之後就可以開始做資料分析了。

未完待續,敬請期待。