Python 采集 QQ音樂(lè ) 熱歌榜首數據
一.初步測試
我們首先使用selenium測試一下環(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()
截圖如下:
測試后發(fā)現沒(méi)有問(wèn)題。
注意:為了避免登錄,使用谷歌模擬登錄之前最好手動(dòng)登錄QQ音樂(lè ),瀏覽器記錄了cookie信息,比較穩妥。
二.頁(yè)面分析
通過(guò)分析頁(yè)面可以知道評論數據是類(lèi)似于瀑布流布局,頁(yè)面數據會(huì )隨著(zhù)右側滾動(dòng)條的滾動(dòng)被加載出來(lái),換句話(huà)說(shuō),頁(yè)面的url沒(méi)有改變,我們要通過(guò)selenium控制滾輪操作頁(yè)面,獲取更多數據,然后我們看下評論數據在頁(yè)面中對應的標簽元素。
如下圖所示:
我們可以看到一條評論就是一條li標簽,那么由此可以確定數據采集思路:通過(guò)selenium控制滾輪滑到頁(yè)面底部,然后經(jīng)過(guò)短暫的時(shí)間(數據加載完全)后,實(shí)時(shí)監測頁(yè)面的li標簽數目(也就是評論數目),達到了目標數目之后進(jìn)行數據解析和數據存儲。
三.滾輪操作
通過(guò)循環(huán)的滾輪操作(控制滾輪到頁(yè)面底部),來(lái)加載數據。
num = int(input('請輸入目標評論數:')) # 控制采集評論數量(由自己掌控)
_single = True
while _single:
# items:頁(yè)面評論數據
items = driver.find_elements_by_xpath("//li[@class='comment__list_item c_b_normal']")
print(len(items))
if len(items) < num: # 通過(guò)頁(yè)面監測評論數量,與目標數量對比
# 拖動(dòng)滾動(dòng)條至底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2) # 等待2s,數據加載完全
else:
_single = False # 退出循環(huán)
四.解析頁(yè)面
通過(guò)觀(guān)察頁(yè)面li標簽下的內容:
我們的目標就是要爬取每個(gè)用戶(hù)的頭像鏈接,昵稱(chēng),評論時(shí)間和評論內容。
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 # 昵稱(chēng)
time = item.find_element_by_xpath("./div[1]/div[1]").text # 評論時(shí)間
content = item.find_element_by_xpath("./div[1]/p/span").text # 評論內容
content = content.replace('\n','')
# 因為考慮到有的用戶(hù)評論較長(cháng),所以需要將換行符改成空格或者空字符,便于存儲
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)
最后再運行的過(guò)程中,try語(yǔ)句還是有用的,因為數據沒(méi)有爬取完全,有的數據有問(wèn)題,如下所示:
五.數據存儲
由于在上面我們把每一條評論數據以字典的形式保存在info_list的列表中,所以這里我們使用csv模塊,把數據寫(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ě)入成功')
六.運行程序
開(kāi)始:
結束:
然后我們打開(kāi)csv文件:
好的,大致就是這樣的5000條評論數據。
七.詞云展示
一.導入相關(guān)庫
# 導入相應的庫
import jieba
from PIL import Image
import numpy as np
import pandas as pd
from wordcloud import WordCloud
二.得到評論數據
注意:這里需要對評論那一列數據進(jìn)行數據清洗,因為可能有的數據類(lèi)型不是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ě)入成功!')
三.詞云展示
# 入文本數據并進(jìn)行簡(jiǎn)單的文本處理
# 去掉換行符和空格
text = open("./data.txt",encoding='utf-8').read()
# 分詞,返回結果為詞的列表
text_cut = jieba.lcut(text)
# 將分好的詞用某個(gè)符號分割開(kāi)連成字符串
text_cut = ' '.join(text_cut)
word_list = jieba.cut(text)
space_word_list = ' '.join(word_list)
# print(space_word_list)
# 調用包PIL中的open方法,讀取圖片文件,通過(guò)numpy中的array方法生成數組
mask_pic = np.array(Image.open("./cat.png"))
word = WordCloud(
font_path='C:/Windows/Fonts/simfang.ttf', # 設置字體,本機的字體
mask=mask_pic, # 設置背景圖片
background_color='white', # 設置背景顏色
max_font_size=150, # 設置字體最大值
max_words=2000, # 設置最大顯示字數
stopwords={'的'} # 設置停用詞,停用詞則不在詞云途中表示
).generate(space_word_list)
image = word.to_image()
word.to_file('bsx.png') # 保存圖片
image.show()
最后運行:
八.總結
本文使用selenium采集QQ音樂(lè )評論數據,其實(shí)使用selenium模擬人操作瀏覽器,可以避免一些反爬,不失為一種獲取數據的好方法,但是需要注意的點(diǎn)還是有的,最后感興趣的小伙伴可以去嘗試一下。