【Python爬蟲實戰】使用Selenium爬取QQ音樂歌曲及評論資訊

專注的阿熊發表於2021-03-24

from selenium import webdriver

import csv

from time import sleep

import time

#

#  Author : ATFWUS

#  Date : 2021-03-21 20:00

#  Version : 1.0

#   爬取周杰倫最熱門五首歌曲的基本資訊,歌詞,前五百條熱門評論

#   此程式碼僅供交流學習使用

#

#1. 建立 Chrome 瀏覽器物件,這會在電腦上在開啟一個瀏覽器視窗

driver=webdriver.Chrome(executable_path="C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")

#2. 開啟 QQ 音樂 - 周杰倫頁面

driver.get("https://y.qq.com/n/yqq/singer/0025NhlN2yWrP4.html")

#3. 配置

csv_file = open('songs.csv','w',newline='',encoding='utf-8')

writer = csv.writer(csv_file)

start = time.time()

# 取前 5 首歌曲

song_numer=5

song_url_list=[]

song_resourses=[]

songlist__item=driver.find_elements_by_class_name("songlist__item")

# 獲取所有歌曲 url

for song in songlist__item:

    song__url=song.find_element_by_class_name("js_song").get_attribute("href")

    song_url_list.append(song__url)

    song_numer-=1

    if(song_numer==0):

        break

# print(song_url_list)

print(" 已獲取周杰倫熱門歌曲列表前五首的 url")

print()

# 獲取一首歌曲所需要的資訊

def getSongResourse(url):

    song_resourse={}

    driver.get(url)

    # 這個 0.5 秒用於等待非同步請求的完成

    sleep(0.8)

    # 獲取歌曲名

    song_name=driver.find_element_by_class_name("data__name_txt").text

    print(" 開始獲取歌曲《 "+song_name+" 》的基本資訊 ")

    # 獲取流派,發行時間,評論數

    song_liupai = driver.find_element_by_css_selector(".js_genre").text[3:]

    song_time = driver.find_element_by_css_selector(".js_public_time").text[5:]

    song_comment_num = driver.find_element_by_css_selector(".js_into_comment").text[3:-1]

    print(" 歌曲《 " + song_name + " 》外匯跟單gendan5.com基本資訊獲取完畢 ")

    print(" 開始獲取歌曲《 " + song_name + " 》的歌詞 ")

    # 點選展開歌詞

    driver.find_element_by_partial_link_text("[ 展開 ]").click()

    sleep(0.3)

    lyic=""

    # 獲取拼接歌詞

    lyic_box=driver.find_element_by_id("lrc_content").find_elements_by_tag_name("p")

    for l in lyic_box:

        if l.text!="":

            lyic+=l.text+"\n"

    print(" 歌曲《 " + song_name + " 》的歌詞獲取完畢 ")

    print(" 開始獲取歌曲《 " + song_name + " 》的第 1-15 條熱門評論 ")

    # 獲取 500 條評論

    comments=[]

    # 點選載入更多 29 次,每次多出 15 條評論

    for i in range(33):

        driver.find_element_by_partial_link_text(" 點選載入更多 ").click()

        print(" 開始獲取歌曲《 " + song_name + " 》的第 "+str((i+1)*15+1)+"-"+str((i+2)*15)+" 條熱門評論 ")

        sleep(0.5)

comments_list=driver.find_element_by_css_selector(".js_hot_list").find_elements_by_tag_name("li")

    for com in comments_list:

        content=com.find_element_by_css_selector(".js_hot_text").text

        content_time=com.find_element_by_css_selector(".comment__date").text

        zan_num=com.find_element_by_class_name("js_praise_num").text

        comment = {}

        comment.update({" 評論內容 ":content})

        comment.update({" 評論時間 ":content_time})

        comment.update({" 評論點贊次數 ":zan_num})

        comments.append(comment)

    print(" 歌曲《 " + song_name + " 》的前五百條熱門評論獲取完畢 ")

    print(" 歌曲《 "+song_name+" 》所有資訊獲取完畢 ")

    print()

    song_resourse.update({" 歌曲名 ":song_name})

    song_resourse.update({" 流派 ":song_liupai})

    song_resourse.update({" 發行時間 ":song_time})

    song_resourse.update({" 評論數 ":song_comment_num})

    song_resourse.update({" 歌詞 ":lyic})

    song_resourse.update({"500 條精彩評論 ":comments})

    return song_resourse

for song_page in song_url_list:

    song_resourses.append(getSongResourse(song_page))

    # break

print(" 正在寫入 CSV 檔案 ...")

for i in song_resourses:

    writer.writerow([i[" 歌曲名 "],i[" 流派 "],i[" 發行時間 "],i[" 評論數 "],i[" 歌詞 "]])

    for j in i["500 條精彩評論 "]:

        writer.writerow([j[" 評論內容 "],j[" 評論時間 "],j[" 評論點贊次數 "]])

    writer.writerow([])

csv_file.close()

end = time.time()

print(" 爬取完成,總耗時 "+str(end-start)+" ")


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2764730/,如需轉載,請註明出處,否則將追究法律責任。

相關文章