利用Python爬取微博數(shù)據(jù)生成詞云圖片實例代碼
前言
在很早之前寫過一篇怎么利用微博數(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
第一步:分析網址
打開微博移動端網址 https://m.weibo.cn/searchs ,找到女神的微博ID,進入她的微博主頁,分析瀏覽器發(fā)送請求的過程

打開 Chrome 瀏覽器的調試功能,選擇 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
再來分析接口的返回結果,返回數(shù)據(jù)是一個JSON字典結構,total 是微博總條數(shù),每一條具體的微博內容封裝在 cards 數(shù)組中,具體內容字段是里面的 text 字段。很多干擾信息已隱去。
{
"cardlistInfo": {
"containerid": "1076031192515960",
"total": 4754,
"page": 2
},
"cards": [
{
"card_type": 9,
"mblog": {
"created_at": "08-26",
"idstr": "4145069944506080",
"text": "瑞士一日游圓滿結束...",
}
}]
}
第二步:構建請求頭和查詢參數(shù)
分析完網頁后,我們開始用 requests 模擬瀏覽器構造爬蟲獲取數(shù)據(jù),因為這里獲取用戶的數(shù)據(jù)無需登錄微博,所以我們不需要構造 cookie信息,只需要基本的請求頭即可,具體需要哪些頭信息也可以從瀏覽器中獲取,首先構造必須要的請求參數(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雖然不什么意思,但也是和具體某個用戶相關的參數(shù)
- page 分頁參數(shù)
第三步:構造簡單爬蟲
通過返回的數(shù)據(jù)能查詢到總微博條數(shù) total,爬取數(shù)據(jù)直接利用 requests 提供的方法把 json 數(shù)據(jù)轉換成 Python 字典對象,從中提取出所有的 text 字段的值并放到 blogs 列表中,提取文本之前進行簡單過濾,去掉無用信息。順便把數(shù)據(jù)寫入文件,方便下次轉換時不再重復爬取。
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:
# 每條微博的正文內容
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))

第四步:分詞處理并構建詞云
爬蟲了所有數(shù)據(jù)之后,先進行分詞,這里用的是結巴分詞,按照中文語境將句子進行分詞處理,分詞過程中過濾掉停止詞,處理完之后找一張參照圖,然后根據(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)
最終效果圖:

完整示例代碼如下:
# -*- coding:utf-8 -*-
import codecs
import re
import jieba.analyse
import matplotlib.pyplot as plt
import requests
from scipy.misc import imread
from wordcloud import WordCloud
__author__ = 'liuzhijun'
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",
}
def clean_html(raw_html):
pattern = re.compile(r'<.*?>|轉發(fā)微博|//:|Repost|,|?|。|、|分享圖片|回復@.*?:|//@.*')
text = re.sub(pattern, '', raw_html)
return text
url = "https://m.weibo.cn/api/container/getIndex"
params = {"uid": "{uid}",
"luicode": "20000174",
"featurecode": "20000320",
"type": "uid",
"value": "1705822647",
"containerid": "{containerid}",
"page": "{page}"}
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:
# 每條微博的正文內容
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))
def grey_color_func(word, font_size, position, orientation, random_state=None,
**kwargs):
s = "hsl(0, 0%%, %d%%)" % 0
return s
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)
if __name__ == '__main__':
fetch_data("1192515960", "1076031192515960")
generate_image()
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
15款Python編輯器的優(yōu)缺點,別再問我“選什么編輯器”啦
這篇文章主要介紹了15款Python編輯器的優(yōu)缺點,別再問我“選什么編輯器”啦,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-10-10
對Python 多線程統(tǒng)計所有csv文件的行數(shù)方法詳解
今天小編就為大家分享一篇對Python 多線程統(tǒng)計所有csv文件的行數(shù)方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02
Django日志和調試工具欄實現(xiàn)高效的應用程序調試和性能優(yōu)化
這篇文章主要介紹了Django日志和調試工具欄實現(xiàn)高效的應用程序調試和性能優(yōu)化,Django日志和調試工具欄為開發(fā)者提供了快速定位應用程序問題的工具,可提高調試和性能優(yōu)化效率,提高應用程序的可靠性和可維護性2023-05-05

