久久久久无码精品,亚洲国产精品国语在线,国产成人精品热玖玖玖,国产福利一区二区在线观看

Python 采集 QQ音樂(lè) 熱歌榜首數(shù)據(jù)

2021-11-03 14:21:46 shuai.chang
今天給大家?guī)?lái)用python采集QQ音樂(lè)的熱評(píng)~

睿智創(chuàng)新RAIZ,一體化IT服務(wù)提供商

我們可以看到這首歌曲的評(píng)論有10881條,不愧是榜首熱歌,評(píng)論比較高。

一.初步測(cè)試


我們首先使用selenium測(cè)試一下環(huán)境:

from selenium import webdriver
import time

url = 'https://y.qq.com/n/ryqq/songDetail/0006wgUu1hHP0N'

driver = webdriver.Chrome()

driver.get(url)

time.sleep(1)

driver.maximize_window()


截圖如下:

睿智創(chuàng)新RAIZ,一體化IT服務(wù)提供商


測(cè)試后發(fā)現(xiàn)沒(méi)有問(wèn)題。

注意:為了避免登錄,使用谷歌模擬登錄之前最好手動(dòng)登錄QQ音樂(lè),瀏覽器記錄了cookie信息,比較穩(wěn)妥。

二.頁(yè)面分析


睿智創(chuàng)新RAIZ,一體化IT服務(wù)提供商


通過(guò)分析頁(yè)面可以知道評(píng)論數(shù)據(jù)是類似于瀑布流布局,頁(yè)面數(shù)據(jù)會(huì)隨著右側(cè)滾動(dòng)條的滾動(dòng)被加載出來(lái),換句話說(shuō),頁(yè)面的url沒(méi)有改變,我們要通過(guò)selenium控制滾輪操作頁(yè)面,獲取更多數(shù)據(jù),然后我們看下評(píng)論數(shù)據(jù)在頁(yè)面中對(duì)應(yīng)的標(biāo)簽元素。


如下圖所示:

睿智創(chuàng)新RAIZ,一體化IT服務(wù)提供商


我們可以看到一條評(píng)論就是一條li標(biāo)簽,那么由此可以確定數(shù)據(jù)采集思路:通過(guò)selenium控制滾輪滑到頁(yè)面底部,然后經(jīng)過(guò)短暫的時(shí)間(數(shù)據(jù)加載完全)后,實(shí)時(shí)監(jiān)測(cè)頁(yè)面的li標(biāo)簽數(shù)目(也就是評(píng)論數(shù)目),達(dá)到了目標(biāo)數(shù)目之后進(jìn)行數(shù)據(jù)解析和數(shù)據(jù)存儲(chǔ)。

三.滾輪操作


通過(guò)循環(huán)的滾輪操作(控制滾輪到頁(yè)面底部),來(lái)加載數(shù)據(jù)。

num = int(input('請(qǐng)輸入目標(biāo)評(píng)論數(shù):')) # 控制采集評(píng)論數(shù)量(由自己掌控)

_single = True

while _single:
    # items:頁(yè)面評(píng)論數(shù)據(jù)
    items = driver.find_elements_by_xpath("//li[@class='comment__list_item c_b_normal']")
    print(len(items))
    if len(items) < num: # 通過(guò)頁(yè)面監(jiān)測(cè)評(píng)論數(shù)量,與目標(biāo)數(shù)量對(duì)比
        # 拖動(dòng)滾動(dòng)條至底部
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(2) # 等待2s,數(shù)據(jù)加載完全
    else:
        _single = False # 退出循環(huán)

.解析頁(yè)面


通過(guò)觀察頁(yè)面li標(biāo)簽下的內(nèi)容:

睿智創(chuàng)新RAIZ,一體化IT服務(wù)提供商


我們的目標(biāo)就是要爬取每個(gè)用戶的頭像鏈接,昵稱,評(píng)論時(shí)間和評(píng)論內(nèi)容。

info_list = []
for index,item in enumerate(items):
    dic = {}
    try: # 以防萬(wàn)一,try語(yǔ)句,便于爬蟲(chóng)進(jìn)行
        headPortraits = item.find_element_by_xpath("./div[1]/a/img").get_attribute('src'
        # 頭像圖片鏈接
        name = item.find_element_by_xpath("./div[1]/h4/a").text  # 昵稱
        time = item.find_element_by_xpath("./div[1]/div[1]").text # 評(píng)論時(shí)間
        content = item.find_element_by_xpath("./div[1]/p/span").text # 評(píng)論內(nèi)容
        content = content.replace(' ','')
        # 因?yàn)榭紤]到有的用戶評(píng)論較長(zhǎng),所以需要將換行符改成空格或者空字符,便于存儲(chǔ)

        dic['headPor'] = headPortraits
        dic['name'] = name
        dic['time'] = time
        dic['cont'] = content
        print(index+1)
        print(dic)
        info_list.append(dic)
       
    except Exception as e:
        print(e)


最后再運(yùn)行的過(guò)程中,try語(yǔ)句還是有用的,因?yàn)閿?shù)據(jù)沒(méi)有爬取完全,有的數(shù)據(jù)有問(wèn)題,如下所示:

睿智創(chuàng)新RAIZ,一體化IT服務(wù)提供商

五.數(shù)據(jù)存儲(chǔ)


由于在上面我們把每一條評(píng)論數(shù)據(jù)以字典的形式保存在info_list的列表中,所以這里我們使用csv模塊,把數(shù)據(jù)寫(xiě)入到csv文件中。

import csv

head = ['headPor','name','time','cont']
with open('bscxComment.csv', 'w', encoding='utf-8', newline='') as f:
    writer = csv.DictWriter(f, head)
    writer.writeheader()
    writer.writerows(info_list)
    print('寫(xiě)入成功')

六.運(yùn)行程序


開(kāi)始:

睿智創(chuàng)新RAIZ,一體化IT服務(wù)提供商


結(jié)束:

睿智創(chuàng)新RAIZ,一體化IT服務(wù)提供商


然后我們打開(kāi)csv文件:

睿智創(chuàng)新RAIZ,一體化IT服務(wù)提供商


好的,大致就是這樣的5000條評(píng)論數(shù)據(jù)。

七.詞云展示

一.導(dǎo)入相關(guān)庫(kù)

# 導(dǎo)入相應(yīng)的庫(kù)
import jieba
from PIL import Image
import numpy as np
import pandas as pd
from wordcloud import WordCloud

二.得到評(píng)論數(shù)據(jù)

注意:這里需要對(duì)評(píng)論那一列數(shù)據(jù)進(jìn)行數(shù)據(jù)清洗,因?yàn)榭赡苡械臄?shù)據(jù)類型不是str,需要跳過(guò),或者剔除

with open('data.txt',encoding='utf-8',mode='a') as f:

    for item in data['cont']:
        if type(item) != str:
            continue
        else:
            f.write(item,)
    print('寫(xiě)入成功!')

三.詞云展示

# 入文本數(shù)據(jù)并進(jìn)行簡(jiǎn)單的文本處理
# 去掉換行符和空格
text = open("./data.txt",encoding='utf-8').read()

# 分詞,返回結(jié)果為詞的列表
text_cut = jieba.lcut(text)
# 將分好的詞用某個(gè)符號(hào)分割開(kāi)連成字符串
text_cut = ' '.join(text_cut)


word_list = jieba.cut(text)
space_word_list = ' '.join(word_list)
# print(space_word_list)
# 調(diào)用包PIL中的open方法,讀取圖片文件,通過(guò)numpy中的array方法生成數(shù)組
mask_pic = np.array(Image.open("./cat.png"))
word = WordCloud(
    font_path='C:/Windows/Fonts/simfang.ttf'# 設(shè)置字體,本機(jī)的字體
    mask=mask_pic,  # 設(shè)置背景圖片
    background_color='white'# 設(shè)置背景顏色
    max_font_size=150# 設(shè)置字體最大值
    max_words=2000# 設(shè)置最大顯示字?jǐn)?shù)
    stopwords={'的'# 設(shè)置停用詞,停用詞則不在詞云途中表示
                ).generate(space_word_list)
image = word.to_image()
word.to_file('bsx.png'# 保存圖片
image.show()


最后運(yùn)行:

睿智創(chuàng)新RAIZ,一體化IT服務(wù)提供商

八.總結(jié)


本文使用selenium采集QQ音樂(lè)評(píng)論數(shù)據(jù),其實(shí)使用selenium模擬人操作瀏覽器,可以避免一些反爬,不失為一種獲取數(shù)據(jù)的好方法,但是需要注意的點(diǎn)還是有的,最后感興趣的小伙伴可以去嘗試一下。




我要咨詢
桃江县| 文登市| 乐平市| 民县| 清涧县| 吕梁市| 定西市| 乌苏市| 石河子市| 全南县| 尉犁县| 屏南县| 绥阳县| 军事| 张家港市| 岚皋县| 闻喜县| 绥棱县| 普宁市| 汝城县| 加查县| 华宁县| 酉阳| 鄯善县| 弥渡县| 毕节市| 白沙| 东阿县| 景东| 湟源县| 陆丰市| 上杭县| 镇宁| 保德县| 安仁县| 阿荣旗| 宜昌市| 宣汉县| 青州市| 天门市| 新野县|