国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

利用Python爬取微博數(shù)據(jù)生成詞云圖片實(shí)例代碼

2019-11-25 15:53:30
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

在很早之前寫(xiě)過(guò)一篇怎么利用微博數(shù)據(jù)制作詞云圖片出來(lái),之前的寫(xiě)得不完整,而且只能使用自己的數(shù)據(jù),現(xiàn)在重新整理了一下,任何的微博數(shù)據(jù)都可以制作出來(lái),一年一度的虐汪節(jié),是繼續(xù)蹲在角落默默吃狗糧還是主動(dòng)出擊告別單身汪加入散狗糧的行列就看你啦,七夕送什么才有心意,程序猿可以試試用一種特別的方式來(lái)表達(dá)你對(duì)女神的心意。有一個(gè)創(chuàng)意是把她過(guò)往發(fā)的微博整理后用詞云展示出來(lái)。本文教你怎么用Python快速創(chuàng)建出有心意詞云,即使是Python小白也能分分鐘做出來(lái)。下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。

準(zhǔn)備工作

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

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

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

pip install -r requirement.txt

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

打開(kāi)微博移動(dòng)端網(wǎng)址 https://m.weibo.cn/searchs ,找到女神的微博ID,進(jìn)入她的微博主頁(yè),分析瀏覽器發(fā)送請(qǐng)求的過(guò)程

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

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

再來(lái)分析接口的返回結(jié)果,返回?cái)?shù)據(jù)是一個(gè)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)建請(qǐng)求頭和查詢參數(shù)

分析完網(wǎng)頁(yè)后,我們開(kāi)始用 requests 模擬瀏覽器構(gòu)造爬蟲(chóng)獲取數(shù)據(jù),因?yàn)檫@里獲取用戶的數(shù)據(jù)無(wú)需登錄微博,所以我們不需要構(gòu)造 cookie信息,只需要基本的請(qǐng)求頭即可,具體需要哪些頭信息也可以從瀏覽器中獲取,首先構(gòu)造必須要的請(qǐng)求參數(shù),包括請(qǐng)求頭和查詢參數(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雖然不什么意思,但也是和具體某個(gè)用戶相關(guān)的參數(shù)
  • page 分頁(yè)參數(shù)

第三步:構(gòu)造簡(jiǎn)單爬蟲(chóng)

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

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}頁(yè),目前總共抓取了 {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)建詞云

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

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 codecsimport reimport jieba.analyseimport matplotlib.pyplot as pltimport requestsfrom scipy.misc import imreadfrom 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'<.*?>|轉(zhuǎn)發(fā)微博|//:|Repost|,|?|。|、|分享圖片|回復(fù)@.*?:|//@.*')  text = re.sub(pattern, '', raw_html)  return texturl = "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:      # 每條微博的正文內(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}頁(yè),目前總共抓取了 {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 sdef 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()

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)武林網(wǎng)的支持。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 贵州省| 衡山县| 南雄市| 天峻县| 敖汉旗| 秀山| 太仆寺旗| 隆子县| 淮南市| 庐江县| 普格县| 航空| 榆社县| 阿荣旗| 房产| 宜宾市| 东辽县| 新晃| 汝城县| 亳州市| 长垣县| 阿图什市| 富民县| 东阿县| 利川市| 丹凤县| 双江| 兰西县| 饶阳县| 南宁市| 铜鼓县| 三穗县| 宝兴县| 申扎县| 双流县| 法库县| 徐闻县| 达尔| 安图县| 巢湖市| 大丰市|