網易雲音樂評論爬蟲(1):全部熱門歌曲及其 id 號
(點擊
上方公眾號
,可快速關注)
來源:
志穎(本文來自作者的投稿,簡介見末尾)www.zhouzying.cn/34.html
今天我給大家介紹一下用Python爬取網易雲音樂全部歌手的熱門歌曲.由於歌手個人主頁的網頁源代碼中還嵌入了一個子網頁(框架源代碼裡面包含了我們需要的信息),因此我們不能使用requests庫來爬取,而使用selenium,接下來,讓我詳細講解整個爬取過程.
一,構造歌手個人主頁的URL
前段時間我們獲取了
網易雲音樂
全部歌手的id號,今天我們就利用全部歌手的id號來構造歌手個人主頁的URL,從而實現用爬取全部歌手的熱門歌曲及其id號的目的.以歌手
薛之謙的個人主頁
為例,來看一下他的主頁的URL為:
https
:
//music.163.com/#/artist?id=5781
因此只需要根據歌手對應的id就可以構造出歌手的個人主頁,在歌手的個人主頁我們能看到熱門作品這一欄.
網易雲音樂全部歌手id號點擊獲取(csv文件)
二,分析網頁源代碼
現在我們就要用Python爬蟲去爬取這些內容.如果你用requests庫去爬取的話,返回的網頁源代碼中根本就沒有這些信息.這時我們打開
薛之謙的個人主頁
滑鼠右鍵分別查看網頁的源代碼和查看框架的源代碼.你會發現網頁源代碼和用requests庫請求返回的源代碼一摸一樣(裡面沒有我們要爬取的信息),而在框架源代碼中有我們要爬取的熱門作品的信息,因此我們只需要將框架源代碼爬取下來,然後再解析即可得到我們需要的歌手的熱門作品的信息.
三,網頁源代碼和框架源代碼的區別
網頁源代碼
是指父級網頁的源代碼.另外網頁中還有一種節點叫iframe,也就是子Frame,相當於網頁的子頁面,它的結構和外部網頁的結構完全一致,框架源代碼
就是這個子網頁的源代碼.四,獲取框架源代碼
這裡我們使用selenium庫來爬取,在selenium打開頁面後,默認是在父級frame裡面進行操作,而此時頁面中還有子frame,它是不能獲取到子frame裡面的節點的,因此這時我們需要使用swith_to.frame()方法來切換到子frame中去,這時請求得到的代碼就從網頁源代碼切換到了框架源代碼,於是我們便能夠提取我們需要的熱門作品的信息了.通過歌手的個人主頁的URL來爬取其框架源代碼,具體爬取框架源代碼的函數:
def get_html_src
(
url
)
:
# 可以任意選擇瀏覽器,前提是要配置好相關環境,更多請參考selenium官方文檔
driver
=
webdriver
.
Chrome
()
driver
.
get
(
url
)
# 切換成frame
driver
.
switch_to_frame
(
"g_iframe"
)
# 休眠3秒,等待載入完成!
time
.
sleep
(
3
)
page_src
=
driver
.
page_source
driver
.
close
()
return
page_src
返回結果為歌手個人主頁的框架源代碼,裡面包含了我們需要的信息.
五,解析源代碼
我們使用bs4庫進行解析,需要的信息包含在HTML5的下面代碼片段中:
<
span
class
=
"txt"
><
a
href
=
"/song?id=(d*)"
><
b
title
=
"(.*?)"
>
因此可定義下面函數對其進行解析:
def parse_html_page
(
html
)
:
# pattern = "<span class="txt"><a href="/song?id=(d*)"><b title="(.*?)">"
# 這裡是使用lxml解析器進行解析,lxml速度快,文檔容錯能力強,也能使用html5lib
soup
=
BeautifulSoup
(
html
,
"lxml"
)
items
=
soup
.
find_all
(
"span"
,
"txt"
)
return
items
六,寫入csv文件
def write_to_csv
(
items
,
artist_name
)
:
with open
(
"music163_songs.csv"
,
"a"
)
as
csvfile
:
writer
=
csv
.
writer
(
csvfile
)
writer
.
writerow
([
"歌手名字"
,
artist_name
])
for
item
in
items
:
writer
.
writerow
([
item
.
a
[
"href"
].
replace
(
"/song?id="
,
""
),
item
.
b
[
"title"
]])
(
"歌曲id:"
,
item
.
a
[
"href"
].
replace
(
"/song?id="
,
""
))
song_name
=
item
.
b
[
"title"
]
(
"歌曲名字:"
,
song_name
)
csvfile
.
close
()
七,讀取csv文件,構造全部歌手的個人主頁
# 獲取歌手id和歌手姓名
def read_csv
()
:
with open
(
"music163_artists.csv"
,
"r"
,
encoding
=
"utf-8"
)
as
csvfile
:
reader
=
csv
.
reader
(
csvfile
)
for
row
in
reader
:
artist_id
,
artist_name
=
row
if
str
(
artist_id
)
is
"artist_id"
:
continue
else
:
yield
artist_id
,
artist_name
# 當程序的控制流程離開with語句塊後, 文件將自動關閉
八,程序主函數
# 主函數
def main
()
:
for
readcsv
in
read_csv
()
:
artist_id
,
artist_name
=
readcsv
url
=
"https://music.163.com/#/artist?id="
+
str
(
artist_id
)
(
"正在獲取{}的熱門歌曲..."
.
format
(
artist_name
))
html
=
get_html_src
(
url
)
items
=
parse_html_page
(
html
)
(
"{}的熱門歌曲獲取完成!"
.
format
(
artist_name
))
(
"開始將{}的熱門歌曲寫入文件"
.
format
(
artist_name
))
write_to_csv
(
items
,
artist_name
)
(
"{}的熱門歌曲寫入到本地成功!"
.
format
(
artist_name
))
九,總結
獲取全部代碼請上我的github(鏈接:https://github.com/zyingzhou/wangyiyue_music/blob/master/get_hot_songs.py),爬取過程中有任何問題歡迎留言!
【作者簡介】
作者:志穎,一個狂熱的 python 爬蟲愛好者。
【關於投稿】
如果大家有原創好文投稿,請直接給公號發送留言。
① 留言格式:
【投稿】+《 文章標題》+ 文章鏈接
② 示例:
【投稿】《不要自稱是程序員,我十多年的 IT 職場總結》:
http://blog.jobbole.com/94148/
③ 最後請附上您的個人簡介哈~
看完本文有收穫?請轉
發分享給更多人
關注「P
ython開發者」,提升Python技能
※面向對象:你願意和我一起去尋找 ALL BLUE 嗎?
※面向對象:既然我找不到你,就只有站在高處等你來找我了
TAG:Python開發者 |