Python爬虫实践:从中文歌词库抓取歌词

利用BeautifulSoup库构建一个简单的网络爬虫,从中文歌词库网站抓取凤凰传奇所有曲目的歌词(http://www.cnlyric.com/geshou/1927.html)。

from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
import numpy
import csv

starturl="http://www.cnlyric.com/geshou/1927.html" # 凤凰传奇歌词地址第一页

# 找出下一页的链接
def findnextlinks(starturl,nextlinks):
    """ 该函数用于从starturl页面开始,递归找出所有“下一页”的链接地址
    要求nextlinks为一个空的列表"""
    try:
        html=urlopen(starturl)
        bsobj=BeautifulSoup(html,"lxml")
        nextpagelink=bsobj.find("div",{"class":"PageList"}).input.\
        previous_sibling.previous_sibling.attrs["href"]
        nextlink="http://www.cnlyric.com/geshou/"+nextpagelink
        nextlinks.append(nextlink)
        findnextlinks(nextlink,nextlinks)
    except:
        print("\n所有“下一页”的链接寻找完毕")
    return nextlinks

nextlinks=[]
nextlinks=findnextlinks(starturl,nextlinks) # 所有“下一页”的链接列表

# 找出存放歌词的链接列表
def findlrclinks(urllists):
    """ 该函数用于找出列表urllists中的链接页面上存放歌词的链接 """
    Sites=[]
    for urllist in urllists:
        html=urlopen(urllist)
        bsobj=BeautifulSoup(html,"lxml")
        for link in bsobj.findAll(href=re.compile("^(../LrcXML/)")):
            site="http://www.cnlyric.com"+link.attrs["href"].lstrip("..")
            Sites.append(site)
    return Sites

nextlinks.insert(0,starturl) # 将开始页面也加入链接列表中
Sites=findlrclinks(nextlinks) # 找出所有存放歌词的链接
print("\n所有曲目歌词所在的xml文件链接寻找完毕")

def getlrc(lrclink):
    """ 该函数用于找出歌词链接lrclink中的歌词,并以列表形式保存 """
    LRC=[]
    html=urlopen(lrclink)
    bsobj=BeautifulSoup(html,"lxml")
    lrcpre=bsobj.findAll("lrc")
    for lrclabel in lrcpre:
        lrc=lrclabel.get_text()
        LRC.append(lrc)
    return LRC

csvfile=open("凤凰传奇歌词集.csv","w+") # 创建csv文件用于保存数据
try:
    writer=csv.writer(csvfile)
    rowindex=1
    for lrcurl in Sites:
        LRC=getlrc(lrcurl)
        LRC.insert(0,str(rowindex).zfill(3))
        writer.writerow(LRC) # 将每首哥编号并将歌词写入从中文件中
        rowindex+=1
finally:
    csvfile.close() # 关闭csv文件

运行结果:

这里写图片描述

参考资料:Ryan Mitchell著,陶俊杰,陈小莉译《Python网络数据采集》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值