中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

用Python爬取微博數(shù)據(jù)生成詞云圖片

2018-07-20    來源:編程學習網(wǎng)

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

很早之前寫過一篇怎么利用微博數(shù)據(jù)制作詞云圖片出來,之前的寫得不完整,而且只能使用自己的數(shù)據(jù),現(xiàn)在重新整理了一下,任何的微博數(shù)據(jù)都可以制作出來,放在今天應該比較應景。

一年一度的虐汪節(jié),是繼續(xù)蹲在角落默默吃狗糧還是主動出擊告別單身汪加入散狗糧的行列就看你啦,七夕送什么才有心意,程序猿可以試試用一種特別的方式來表達你對女神的心意。有一個創(chuàng)意是把她過往發(fā)的微博整理后用詞云展示出來。本文教你怎么用Python快速創(chuàng)建出有心意詞云,即使是Python小白也能分分鐘做出來。

準備工作

本環(huán)境基于Python3,理論上Python2.7也是可行的,先安裝必要的第三方依賴包:

# requirement.txt
jieba==0.38
matplotlib==2.0.2
numpy==1.13.1
pyparsing==2.2.0
requests==2.18.4
scipy==0.19.1
wordcloud==1.3.1

requirement.txt文件中包含上面的幾個依賴包,如果用pip方式安裝失敗,推薦使用Anaconda安裝

pip install -r requirement.txt

第一步:分析網(wǎng)址

打開微博移動端網(wǎng)址 https://m.weibo.cn/searchs ,找到女神的微博ID,進入她的微博主頁,分析瀏覽器發(fā)送請求的過程

打開 Chrome 瀏覽器的調(diào)試功能,選擇 Network 菜單,觀察到獲取微博數(shù)據(jù)的的接口是 https://m.weibo.cn/api/container/getIndex ,后面附帶了一連串的參數(shù),這里面有些參數(shù)是根據(jù)用戶變化的,有些是固定的,先提取出來。

uid=1192515960&
luicode=10000011&
lfid=100103type%3D3%26q%3D%E6%9D%8E%E5%86%B0%E5%86%B0&
featurecode=20000320&
type=user&
containerid=1076031192515960

再來分析接口的返回結(jié)果,返回數(shù)據(jù)是一個JSON字典結(jié)構(gòu),total 是微博總條數(shù),每一條具體的微博內(nèi)容封裝在 cards 數(shù)組中,具體內(nèi)容字段是里面的 text 字段。很多干擾信息已隱去。

{
    "cardlistInfo": {
        "containerid": "1076031192515960",
        "total": 4754,
        "page": 2
    },
    "cards": [
        {
            "card_type": 9,
            "mblog": {
                "created_at": "08-26",
                "idstr": "4145069944506080",
                "text": "瑞士一日游圓滿結(jié)束...",
            }
        }]
}

第二步:構(gòu)建請求頭和查詢參數(shù)

分析完網(wǎng)頁后,我們開始用 requests 模擬瀏覽器構(gòu)造爬蟲獲取數(shù)據(jù),因為這里獲取用戶的數(shù)據(jù)無需登錄微博,所以我們不需要構(gòu)造 cookie信息,只需要基本的請求頭即可,具體需要哪些頭信息也可以從瀏覽器中獲取,首先構(gòu)造必須要的請求參數(shù),包括請求頭和查詢參數(shù)。

headers = {
    "Host": "m.weibo.cn",
    "Referer": "https://m.weibo.cn/u/1705822647",
    "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) "
                  "Version/9.0 Mobile/13B143 Safari/601.1",
}

params = {"uid": "{uid}",
          "luicode": "20000174",
          "featurecode": "20000320",
          "type": "uid",
          "value": "1705822647",
          "containerid": "{containerid}",
          "page": "{page}"}
  • uid是微博用戶的id
  • containerid雖然不什么意思,但也是和具體某個用戶相關(guān)的參數(shù)
  • page 分頁參數(shù)

第三步:構(gòu)造簡單爬蟲

通過返回的數(shù)據(jù)能查詢到總微博條數(shù) total,爬取數(shù)據(jù)直接利用 requests 提供的方法把 json 數(shù)據(jù)轉(zhuǎn)換成 Python 字典對象,從中提取出所有的 text 字段的值并放到 blogs 列表中,提取文本之前進行簡單過濾,去掉無用信息。順便把數(shù)據(jù)寫入文件,方便下次轉(zhuǎn)換時不再重復爬取。

def fetch_data(uid=None, container_id=None):
    """
    抓取數(shù)據(jù),并保存到CSV文件中
    :return:
    """
    page = 0
    total = 4754
    blogs = []
    for i in range(0, total // 10):
        params['uid'] = uid
        params['page'] = str(page)
        params['containerid'] = container_id
        res = requests.get(url, params=params, headers=HEADERS)
        cards = res.json().get("cards")

        for card in cards:
            # 每條微博的正文內(nèi)容
            if card.get("card_type") == 9:
                text = card.get("mblog").get("text")
                text = clean_html(text)
                blogs.append(text)
        page += 1
        print("抓取第{page}頁,目前總共抓取了 {count} 條微博".format(page=page, count=len(blogs)))
        with codecs.open('weibo1.txt', 'w', encoding='utf-8') as f:
            f.write("\n".join(blogs))

第四步:分詞處理并構(gòu)建詞云

爬蟲了所有數(shù)據(jù)之后,先進行分詞,這里用的是結(jié)巴分詞,按照中文語境將句子進行分詞處理,分詞過程中過濾掉停止詞,處理完之后找一張參照圖,然后根據(jù)參照圖通過詞語拼裝成圖。

def generate_image():
    data = []
    jieba.analyse.set_stop_words("./stopwords.txt")

    with codecs.open("weibo1.txt", 'r', encoding="utf-8") as f:
        for text in f.readlines():
            data.extend(jieba.analyse.extract_tags(text, topK=20))
        data = " ".join(data)
        mask_img = imread('./52f90c9a5131c.jpg', flatten=True)
        wordcloud = WordCloud(
            font_path='msyh.ttc',
            background_color='white',
            mask=mask_img
        ).generate(data)
        plt.imshow(wordcloud.recolor(color_func=grey_color_func, random_state=3),
                   interpolation="bilinear")
        plt.axis('off')
        plt.savefig('./heart2.jpg', dpi=1600)

最終效果圖:

完整代碼可以在公眾號(Python之禪)回復“qixi”獲取

關(guān)注公眾號『Python之禪』(id:vttalk)獲取最新文章

 

來自:https://foofish.net/python-word-cloud.html

 

標簽: 代碼

版權(quán)申明:本站文章部分自網(wǎng)絡,如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:云端的SRE發(fā)展與實踐

下一篇:使用Go語言與Ethereum智能合約進行交互