項目來由
相信很多人都很喜歡聽音樂,也有自己喜歡的藝人,而我也是如此。但我無法時時人眼監測QQ音樂榜的變化,因此想實作一個web scraping項目, 幫助我事半功倍地蒐集資料。
項目紀錄
目標網址:https://i.y.qq.com/n2/m/share/details/toplist.html?ADTAG=newyqq.toplist&type=0&id=16
(*註:因為電腦版只能看到韓國榜的top 20,須將頁面調整為手機板,即可順利爬取)
欲達成目標
- 蒐集QQ音樂韓國榜數據
- 以json格式存入MongoDB
使用Package
import requests
from bs4 import BeautifulSoup
import pymongo
Code
利用requests獲取網頁,並用BeautifulSoup解析網頁內容
url = "https://i.y.qq.com/n2/m/share/details/toplist.html?ADTAG=newyqq.toplist&type=0&id=16"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
找到相應tag進行爬取。以下為處理歌曲與上周榜單相比的變化。
rank change為變化的數量,rank position為歌曲是上升(+N)/下降(-N)/持平(-)/NEW(新進)
for item in soup.findAll("li", {"class": "song_list__item"}):
# soup.use['xlink:href']
# 下降/ 上升 /NEW/ 持平
rank_change = item.svg.use['xlink:href']
rank_number = item.find("span", {"class": "song_list__index_change"}).getText()
if rank_change == "#icon_rank_down":
rank_position = "-" + rank_number
elif rank_change == "#icon_rank_up":
rank_position = "+" + rank_number
elif rank_change == "#icon_rank_new":
rank_position = "NEW"
else:
rank_position = "-"
將爬取內容進行整理為以下格式:{歌曲名,榜單名次,榜單升降變化,藝人名}
result = {
"title": item.find("span", {"class": "song_list__txt"}).getText(),
"ranking": int(item.find("span", {"class": "song_list__index_num"}).getText()),
"rank_position": rank_position,
"artist": item.find("p", {"class": "song_list__desc"}).getText()}
創建一個空list,並將結果append到list上
qq = []
qq.append(result)
print結果如圖:
設定MongoDB連線
在此以localhost為例,mongodb port = 27017,因此設定為:
#link to mongodb
client = pymongo.MongoClient(host='localhost', port=27017)
並設定好欲儲存之database和collection名稱:
# link to database
db = client['music']
#link to collection
collection = db['Chart']
insert 即儲存成功
collection.insert_one(qq)