很早以前寫過一篇怎麼利用微博數據製做詞雲圖片出來,以前的寫得不完整,並且只能使用本身的數據,如今從新整理了一下,任何人的微博數據均可以製做出來,即便是Python小白也能分分鐘作出來。html
本環境基於Python3,理論上Python2.7也是可行的,先安裝必要的第三方依賴包:python
# 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安裝json
pip install -r requirement.txt複製代碼
打開微博移動端網址 m.weibo.cn/searchs ,找到女神的微博ID,進入她的微博主頁,分析瀏覽器發送請求的過程api
打開 Chrome 瀏覽器的調試功能,選擇 Network 菜單,觀察到獲取微博數據的的接口是 m.weibo.cn/api/contain… ,後面附帶了一連串的參數,這裏面有些參數是根據用戶變化的,有些是固定的,先提取出來。數組
uid=1192515960&
luicode=10000011&
lfid=100103type%3D3%26q%3D%E6%9D%8E%E5%86%B0%E5%86%B0&
featurecode=20000320&
type=user&
containerid=1076031192515960複製代碼
再來分析接口的返回結果,返回數據是一個JSON字典結構,total 是微博總條數,每一條具體的微博內容封裝在 cards 數組中,具體內容字段是裏面的 text 字段。不少干擾信息已隱去。瀏覽器
{
"cardlistInfo": {
"containerid": "1076031192515960",
"total": 4754,
"page": 2
},
"cards": [
{
"card_type": 9,
"mblog": {
"created_at": "08-26",
"idstr": "4145069944506080",
"text": "瑞士一日遊圓滿結束...",
}
}]
}複製代碼
分析完網頁後,咱們開始用 requests 模擬瀏覽器構造爬蟲獲取數據,由於這裏獲取用戶的數據無需登陸微博,因此咱們不須要構造 cookie信息,只須要基本的請求頭便可,具體須要哪些頭信息也能夠從瀏覽器中獲取,首先構造必需要的請求參數,包括請求頭和查詢參數。bash
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}"}複製代碼
經過返回的數據能查詢到總微博條數 total,爬取數據直接利用 requests 提供的方法把 json 數據轉換成 Python 字典對象,從中提取出全部的 text 字段的值並放到 blogs 列表中,提取文本以前進行簡單過濾,去掉無用信息。順便把數據寫入文件,方便下次轉換時再也不重複爬取。cookie
def fetch_data(uid=None, container_id=None):
""" 抓取數據,並保存到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))複製代碼
爬蟲了全部數據以後,先進行分詞,這裏用的是結巴分詞,按照中文語境將句子進行分詞處理,分詞過程當中過濾掉中止詞,處理完以後找一張參照圖,而後根據參照圖經過詞語拼裝成圖。app
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)複製代碼
這是原圖:dom
最終效果圖:
完整代碼能夠在公衆號(Python之禪)回覆「qixi」獲取