国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python數(shù)據(jù)分析微博熱門

firim / 1246人閱讀

摘要:前者對中文進行分詞后者圖形化展示詞語的出現(xiàn)頻率。眾所周知,中文系的語言處理恐怕是最難的自然語言處理的語種。研究中文自然語言處理將是一個長久而大的工程,對于分析數(shù)據(jù)我們不是要研究自然語言處理

接上篇,這一篇將從技術(shù)層面講講是如何實現(xiàn)的。閱讀本文您將會了解如何用python爬取微博的評論以及如何用python word_cloud庫進行數(shù)據(jù)可視化。

上一篇:程序員代碼下的許豪杰

準備工作

打開微博pc m站并找到許豪杰該條微博地址:https://m.weibo.cn/status/413...

為什么要用m站地址?因為m站可以直接抓取到api json數(shù)據(jù),而pc站雖然也有api返回的是html,相比而言選取m站會省去很多麻煩

打開該頁面,并且用chrome 的檢查工具 查看network,可以獲取到評論的api地址。

數(shù)據(jù)抓取

首先觀察api返回

從返回地址上可以看到可以通過參數(shù)page 改變請求的頁碼,并且每頁都回返回總條數(shù)和總頁碼數(shù)。這里我決定采用多線程來抓去(其實數(shù)據(jù)量不大,也可以單線程跑)。

其中在爬取數(shù)據(jù)的時候會面臨幾個問題:

1.存儲選擇

我這里選用了MongoDB作為數(shù)據(jù)存儲,因為api通常返回的是json數(shù)據(jù)而json結(jié)構(gòu)和MongoDB的存儲方式可以結(jié)合的很默契,不需要經(jīng)過任何處理可以直接的進行插入。

2.防爬蟲

很多網(wǎng)站可能會做一些防爬蟲的處理,面對同一個請求ip的短時間的高頻率請求會進行服務隔斷(直接告訴你服務不可用),這個時候可以去網(wǎng)上找一些代理進行請求。

3.多線程的任務分配

采用多線程爬取你當然不能讓多個線程去爬取同樣的鏈接做別人已經(jīng)做過的事情,那樣多線程毫無意義。所以你需要制定一套規(guī)則,讓不同線程爬取不同的鏈接。

# coding=utf-8
from __future__ import division
from pymongo import MongoClient
import requests
import sys
import re
import random
import time
import logging
import threading
import json
from os import path
import math

# 爬取微博評論
# m站微博地址
weibo_url = "https://m.weibo.cn/status/4132385564040383" 

thread_nums = 5  #線程數(shù)

#代理地址
proxies = {
  "http": "http://171.92.4.67:9000",
  "http": "http://163.125.222.240:8118",
  "http": "http://121.232.145.251:9000",
  "http": "http://121.232.147.247:9000",
  
}


# 創(chuàng)建 日志 對象
logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter(
    "%(asctime)s %(name)-12s %(levelname)-8s %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

mongoconn = MongoClient("127.0.0.1", 27017)
mdb = mongoconn.data_analysis
das_collection = mdb.weibo

weiboid_reobj = re.match(r".*status/(d+)", weibo_url)
weibo_id = weiboid_reobj.group(1)


def scrapy_comments(weibo_id, page):
    weibo_comment_url = "https://m.weibo.cn/api/comments/show?id=%s&page=%d" % (
        weibo_id, page)
    res = requests.get(weibo_comment_url)
    res_obj = json.loads(res.content)
    return res_obj


def import_comments(threadName, weibo_id, page_start, page_end):
    logger.info("開始線程:%s" % threadName)
    for page in range(page_start, page_end + 1):
        logging.info("讀取第%s頁" % page)
        time.sleep(1)
        # continue
        try:
            res_obj = scrapy_comments(weibo_id, page)
            logging.info("該頁有%s條記錄" % len(res_obj["data"]))
        except:
            logging.error("讀取%s頁時發(fā)生錯誤" % page)
            continue
        if res_obj["ok"] == 1:
            comments = res_obj["data"]
            for comment in comments:
                comment_text = re.sub(
                    r"]*>", "", comment["text"]).encode("utf-8")
                if re.search(r"回復@.*:", comment_text):
                    # 過濾掉回復別人的評論
                    continue
                comment["text"] = comment_text
                comment["weibo_id"] = weibo_id
                logging.info("讀取評論:%s" % comment["id"])
                try:
                    if das_collection.find_one({"id": comment["id"]}):
                        logging.info("在mongodb中存在")
                    else:
                        logging.info("插入記錄:%s" % comment["id"])
                        das_collection.insert_one(comment)
                except:
                    logging.error("mongodb發(fā)生錯誤")
        else:
            logging.error("讀取第%s頁時發(fā)生錯誤" % page)
    logging.info("線程%s結(jié)束" % threadName)
    # res_obj = scrapy_comments(weibo_id, page)


if __name__ == "__main__":
    # 分配不同鏈接到不同的線程上去
    res_obj = scrapy_comments(weibo_id, 1)
    if res_obj["ok"] == 1:
        total_number = res_obj["total_number"]
        logging.info("該條微博有:%s條評論" % total_number)
        max_page = res_obj["max"]
        page_nums = math.ceil(max_page / thread_nums)
    else:
        raise

    # print max_page
    # print page_nums

    for i in range(1, thread_nums + 1):
        if i < thread_nums:
            page_end = page_nums * i
        else:
            page_end = max_page
        page_start = (i - 1) * page_nums + 1

        t = threading.Thread(target=import_comments, args=(
            i, weibo_id, int(page_start), int(page_end)))
        t.start()
數(shù)據(jù)整理可視化(data visualization)

運行腳本完畢,我的MongoDB得到了2萬多條評論數(shù)據(jù),接下來要做的事是對這部分數(shù)據(jù)進行提取、清洗、結(jié)構(gòu)化等操作。這里順便說明一下python 數(shù)據(jù)分析的 大致基本流程。

1.與外界進行交互
這個過程包括數(shù)據(jù)的獲取、讀取。不管是從網(wǎng)絡資源上爬取、還是從現(xiàn)有資源(各樣的文件如文本、excel、數(shù)據(jù)庫存儲對象)

2.準備工作
對數(shù)據(jù)進行清洗(cleaning)、修整(munging)、整合(combining)、規(guī)范化(normalizing)、重塑(reshaping)、切片(slicing)和切塊(dicing)

3.轉(zhuǎn)換
對數(shù)據(jù)集做一些數(shù)學和統(tǒng)計運算產(chǎn)生新的數(shù)據(jù)集

4.建模和計算
將數(shù)據(jù)跟統(tǒng)計模型、機器學習算法或其他計算工具聯(lián)系起來

5.展示
創(chuàng)建交互式的或靜態(tài)的圖片或文字摘要

下面我們來進行2、3及5的工作:

# coding=utf-8
import sys
from pymongo import MongoClient
import random
# 分詞庫
# from snownlp import SnowNLP
import jieba
import uniout
from collections import Counter, OrderedDict
# 詞語云 文本統(tǒng)計可視化庫
from wordcloud import WordCloud


mongoconn = MongoClient("127.0.0.1", 27017)
mdb = mongoconn.data_analysis
das_collection = mdb.weibo


total_counts = das_collection.find().count()

# random_int = random.randint(0, total_counts - 1)
docs = das_collection.find()
print docs.count()
words_counts = {}
for doc in docs:
    print doc
    comment_text = doc["text"].encode("utf-8")
    if len(comment_text) == 0:
        continue
    words = jieba.cut(comment_text)
    for word in words:
        if word not in words_counts:
            words_counts[word] = 1
        else:
            words_counts[word] += 1

for word in words_counts.keys():
    if words_counts[word] < 2 or len(word) < 2:
        del words_counts[word]

# print words_counts.items()
#注意要讓中文不亂碼要指定中文字體
#fit_words 接收參數(shù)是dict  eg:{"你":333,"好":23}  文字:出現(xiàn)次數(shù)
wordcloud = WordCloud(
    font_path="/Users/cwp/font/msyh.ttf",
    background_color="white",
    width=1200,
    height=1000
).fit_words(words_counts)
import matplotlib.pyplot as plt
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()

介紹下以上代碼:
我們主要用到了2個工具,jieba和word_cloud。前者對中文進行分詞后者圖形化展示詞語的出現(xiàn)頻率。
眾所周知,中文系的語言處理恐怕是最難的自然語言處理(NLP)的語種。就基本的分詞而言都是一項比較困難的工作,(英語句子中每個單詞都是有空格分開的,而中文是由單個字組成詞連接成串組成句).
舉個例子,請用“孩提”造句,"那個男孩提交完代碼就下班了"。如果人工分詞,可以知道"男孩"和"提交"應該是分開的2個詞,但是對于機器而言,要辨別"提"應該與"男"還是"交"進行組詞就很難辦了。要想機器能夠更精確的辨別這類問題,就需要讓機器不停學習,讓它知道這種情況該這么分而不是那么分。研究中文自然語言處理將是一個長久而大的工程,對于分析數(shù)據(jù)(我們不是要研究自然語言處理

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/43415.html

相關(guān)文章

  • 一款產(chǎn)品的從0到1之旅

    摘要:從到打造一款產(chǎn)品是一種什么樣的體驗為了回答這種知乎范的問題,讓我來介紹下我是如何打造交易日記這款的過程。社會對群體聚集進行生產(chǎn)產(chǎn)品的模式需求在降低。這在接下來的部分我會介紹我如何在三個月內(nèi)完成一款產(chǎn)品從到的過程。 從0到1打造一款產(chǎn)品是一種什么樣的體驗?為了回答這種知乎范的問題,讓我來介紹下我是如何打造交易日記這款App的過程。需要提前說明的是整款iOS APP的全部工作都是我一個人完...

    _ivan 評論0 收藏0
  • 一款產(chǎn)品的從0到1之旅

    摘要:從到打造一款產(chǎn)品是一種什么樣的體驗為了回答這種知乎范的問題,讓我來介紹下我是如何打造交易日記這款的過程。社會對群體聚集進行生產(chǎn)產(chǎn)品的模式需求在降低。這在接下來的部分我會介紹我如何在三個月內(nèi)完成一款產(chǎn)品從到的過程。 從0到1打造一款產(chǎn)品是一種什么樣的體驗?為了回答這種知乎范的問題,讓我來介紹下我是如何打造交易日記這款App的過程。需要提前說明的是整款iOS APP的全部工作都是我一個人完...

    wangdai 評論0 收藏0
  • PHP 基于laravel框架獲取微博數(shù)據(jù)之二 用戶數(shù)據(jù)的使用

    摘要:以大量微博用戶數(shù)據(jù)為基礎可建立數(shù)據(jù)模型。當前微博除了用戶自己,其他人是不能查看該用戶所有粉絲數(shù)據(jù)的。 項目地址:https://github.com/daweilang/... 開始抓取微博數(shù)據(jù)的時候,只是想獲得一條熱門微博下的所有評論,因為里面有不少圖片廣告,所以想試試能不能分析出熱門微博評論里的異常用戶。 使用PHP的Laravel框架后,通過隊列、命令等各種功能,最后構(gòu)架了一套完...

    Sleepy 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<